3

平台是 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可能会大大增加执行时间。

4

3 回答 3

5

您不应该像那样真正混合文件句柄和文件描述符调用。

如果没有 fflush,几乎可以肯定的是,它some string正在文件句柄缓冲区中等待传递给文件描述符。然后截断文件描述符并关闭文件句柄,刷新字符串,因此它显示在文件中。

使用fflush,some string将其发送到文件描述符,然后将其截断。在没有进一步刷新的情况下,文件将保持截断状态。

于 2012-11-21T13:38:33.340 回答
2

POSIX 要求您在使用 FILE 流和文件描述符来访问同一个打开的文件之间切换时采取特定的操作(确保缓冲的丑陋副作用不会使您的程序失控)。这在XSH 2.5.1 Interaction of File Descriptors and Standard I/O Streams 中有描述

在你的情况下,我相信就像你正在做的那样,在fflush之前打电话就足够了。ftruncate根据 2.5.1 的规则,省略此步骤会导致未定义的行为。

于 2012-11-21T14:43:44.977 回答
2

如果您想从字面上“截断文件然后写入”,则足以:

f=fopen("/home/user1/refresh.txt","w");
fputs("some string",f);
fclose(f);

以模式打开文件w将截断它(与a用于追加到末尾的模式相反)。

同时调用fclose将刷新输出缓冲区,因此不会丢失数据。

于 2012-11-21T13:36:02.103 回答