2012-11-21 32 views
2

平台是ARM上的Ubuntu Linux。 我想写一个字符串到一个文件,但我想每次都截断文件,然后写入字符串,即没有附加。用fopen打开的文件ftruncate

我有这样的代码:

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

+0

如果不刷新缓冲区,它可以发生,这只是对'fclose'通红,截断后。 –

回答

2

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

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

打开文件中的模式w将截断它(而不是模式a这是追加到结束)。

还呼吁fclose将刷新输出缓冲器,没有数据丢失。

+0

我想到了这一点,但我不能这样做,该代码将在一个循环中被调用,听说打开和关闭文件是昂贵的操作,因此,它会引入延迟 – user1523271

3

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

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

随着的fflush,some string发送到文件描述符和然后您截断它。没有进一步的刷新,文件保持截断状态。

+0

我能做些什么,一个函数接受一个文件句柄,另一个需要描述符? – user1523271

+0

我能做些什么,一个函数需要一个句柄,另一个需要描述符?至于事件序列,我认为如果没有“fflush”,“fputs”和truncate都会排队,当文件关闭时1.字符串将被写入,并且2.文件将被截断。 – user1523271

+1

@ user1523271,这取决于你想达到的目标。有很多方法可以做到这一点,比如你有什么或者用“w”模式关闭和重新打开。您应该将您的问题称为业务需求而不是技术选项。这样,可能的解决方案数量就大大增加了。换句话说,退后一步,告诉我们你想实现而不是实现。_ – paxdiablo

2

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

就你而言,我相信只要在ftruncate之前拨打fflush即可,就像你在做的那样。根据2.5.1的规则省略此步骤会导致未定义的行为。

+0

由于我打电话给“fflush”,它会在时间上花费多少钱? – user1523271

+0

还没有任何你想做的事情的基本成本。 –

相关问题