用fopen打开文件的ftruncate

时间:2012-11-21 13:31:52

标签: c linux

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

3 个答案:

答案 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的规则省略此步骤会导致未定义的行为。