我的代码目前看起来像这样(这些步骤分为多个功能):
/* open file */
FILE *file = fopen(filename, "r+");
if(!file) {
/* read the file */
/* modify the data */
/* truncate file (how does this work?)*/
/* write new data into file */
/* close file */
fclose(file);
}
我知道我可以在"w"
模式下打开文件,但在这种情况下我不想这样做。我知道ftruncate
/ unistd.h
中有一个函数sys/types.h
,但我不想使用这些函数,我的代码应该是高度可移植的(在Windows上也是如此)。
是否有可能在不关闭/重新打开文件的情况下清除文件?
答案 0 :(得分:5)
使用标准C,唯一的方法是在" w +"中重新打开文件。每次需要截断时都有模式。您可以使用freopen()
。 " W +"将继续允许从中读取,因此无需再次关闭并重新打开" r +"模式。 " w +"的语义是:
开放阅读和写作。如果文件不存在,则创建该文件,否则将被截断。流位于文件的开头。
(取自fopen(3)手册页。)
使用freopen()
时,您可以将NULL指针作为文件名参数传递:
my_file = freopen(NULL, "w+", my_file);
如果您根本不需要再阅读文件,那么" w"模式也会很好。
答案 1 :(得分:3)
您可以编写如下函数:(伪代码)
if(this is linux box)
use truncate()
else if (this is windows box)
use _chsize_s()
这是满足您要求的最直接的解决方案。
请参阅:msdn.microsoft.com上的man truncate和_chsize_s
并包含必要的头文件。