平台为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),当我打开它时,它将会有“一些字符串”。这是正常行为吗?调用fflush没有问题,但是我想在一个循环中完成,并且调用fflush可能会显著增加执行时间。
发布于 2012-11-21 21:38:33
你不应该像那样把文件句柄和文件描述符调用混在一起。
几乎可以肯定的是,在没有fflush的情况下,some string正在文件句柄缓冲区中等待传递到文件描述符。然后截断文件描述符并fclose文件句柄,刷新字符串,因此它显示在文件中。
使用fflush,some string被发送到文件描述符,然后您将其截断。如果不再刷新,文件将保持截断状态。
发布于 2012-11-21 21:36:02
如果你想从字面上“截断文件然后写”,那么这就足够了:
f=fopen("/home/user1/refresh.txt","w");
fputs("some string",f);
fclose(f);在w模式下打开文件将截断它(与a模式相反,该模式用于追加到末尾)。
此外,调用fclose将刷新输出缓冲区,因此不会丢失任何数据。
发布于 2012-11-21 22:43:45
POSIX要求您在使用文件流和文件描述符来访问同一打开的文件之间进行切换时,采取特定的操作(确保缓冲的丑陋副作用不会使您的程序变得混乱)。这在XSH 2.5.1 Interaction of File Descriptors and Standard I/O Streams中有描述。
在您的情况下,我认为在ftruncate之前调用fflush就足够了,就像您正在做的那样。根据2.5.1的规则,省略此步骤将导致未定义的行为。
https://stackoverflow.com/questions/13494417
复制相似问题