用fopen打开文件的ftruncate

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

你不应该真的混合文件句柄和文件描述符调用。

在没有fflush的情况下几乎肯定会发生的是, some string正在文件句柄缓冲区中等待传递到文件描述符。 然后截断文件描述符并关闭文件句柄,刷新字符串,因此它显示在文件中。

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

如果你想从字面上“截断文件然后写”,那么它足以:

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

在模式w打开文件将截断它(而不是模式a用于附加到结尾)。

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

POSIX要求您在使用FILE流和文件描述符之间切换以访问相同的打开文件时,采取特定操作(确保缓冲的任何难看的副作用都不会使您的程序变得混乱)。 这在XSH 2.5.1文件描述符和标准I / O流的交互中有所描述 。

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