平台是ARM上的Ubuntu Linux。 我想写一个字符串到一个文件,但我想每次都截断文件然后写字符串,即没有附加。
我有这段代码:
f=fopen("/home/user1/refresh.txt","w");
fputs( "{"some string",f);
fflush(f);
ftruncate(fileno(f),(off_t)0);
flcose(f);
如果我运行它然后检查文件,它将是零长度,当打开时,它将没有任何内容。
如果我删除fflush
调用,它将不会为0(将为11),当我打开它时,其中会有“some string”。
这是正常行为吗?
调用fflush
时我没有问题,但我想在循环中执行此操作,调用fflush
可能会大大增加执行时间。
答案 0 :(得分:3)
你不应该真的混合文件句柄和文件描述符调用。
如果没有fflush,几乎肯定会发生的是some string
正在文件句柄缓冲区中等待传递到文件描述符。然后截断文件描述符并关闭文件句柄,刷新字符串,因此它显示在文件中。
使用 fflush,将some string
发送到文件描述符,然后然后将其截断。如果没有进一步刷新,文件将被截断。
答案 1 :(得分:2)
如果你想字面上“截断文件然后写”,那么它就足够了:
f=fopen("/home/user1/refresh.txt","w");
fputs("some string",f);
fclose(f);
以w
模式打开文件会截断它(而不是模式a
,用于追加到最后)。
同样调用fclose
将刷新输出缓冲区,以免数据丢失。
答案 2 :(得分:2)
在使用FILE流和文件描述符访问同一个打开文件之间切换时,POSIX要求您采取特定操作(确保没有任何丑陋的缓冲副作用使您的程序变得混乱)。这在XSH 2.5.1 Interaction of File Descriptors and Standard I/O Streams。
中有所描述在您的情况下,我认为只需在fflush
之前拨打ftruncate
即可,就像您正在做的那样。根据2.5.1的规则省略此步骤会导致未定义的行为。