Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ftruncate在用fopen打开的文件上_C_Linux - Fatal编程技术网

ftruncate在用fopen打开的文件上

ftruncate在用fopen打开的文件上,c,linux,C,Linux,平台是ARM上的UbuntuLinux。 我想在文件中写入字符串,但每次都要截断文件,然后写入字符串,即不追加 我有以下代码: f=fopen("/home/user1/refresh.txt","w"); fputs( "{"some string",f); fflush(f); ftruncate(fileno(f),(off_t)0); flcose(f); 如果我运行它,然后检查该文件,它的长度将为零,打开时,其中将没有任何内容。 如果我删除fflush调用,它将不是0(将是11),并

平台是ARM上的UbuntuLinux。 我想在文件中写入字符串,但每次都要截断文件,然后写入字符串,即不追加

我有以下代码:

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

如果您想真正地“截断文件,然后写入”,那么就足以:

f=fopen("/home/user1/refresh.txt","w");
fputs("some string",f);
fclose(f);
在模式
w
下打开文件将截断它(与模式
a
相反,后者用于附加到末尾)


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

您不应该像这样混合使用文件句柄和文件描述符调用

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


使用fflush,
将一些字符串
发送到文件描述符,然后截断它。在不进行进一步刷新的情况下,文件将保持截断状态。

POSIX要求您在使用文件流和文件描述符访问同一打开的文件之间切换时,采取特定的操作(确保缓冲不会导致程序失控)。这在中进行了描述


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

如果不刷新缓冲区,则可能会发生这样的情况:在截断后,它只在
fclose
上刷新。我能做什么,一个函数接受文件句柄,另一个接受描述符?我能做什么,一个函数接受句柄,另一个接受描述符?至于事件的顺序,我认为在没有“fflush”的情况下,“fputs”和truncate都将排队,当文件关闭时1。字符串将被写入和2。文件将被截断。@user1523271,这取决于您试图实现的目标。有很多方法可以做到这一点,比如你拥有什么,或者用
“w”
模式关闭和重新打开。你应该把你的问题表述为业务需要,而不是技术选择。这样,可能的解决方案的数量就大大增加了。换句话说,退一步,告诉我们您想要实现什么,而不是如何实现。顺便说一下,这个“排队”是文件句柄的一个属性。当您ftruncate时,实际上是在绕过队列。这就是这里发生的事情,很好的解释。但我不同意混合使用文件句柄和文件描述符调用是根本错误的观点。有一些奇怪的行为(像这样)需要注意,但这并不是天生的坏习惯,有时你别无选择。我考虑过这一点,但我做不到,这段代码将在循环中调用,并且听说打开和关闭文件是一个昂贵的操作,因此,它将引入延迟,我将称之为“fflush”,从时间上看,这会是昂贵的吗?不再是这样,你所做的事情的基本成本。