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