6

我的代码目前看起来像这样(这些步骤分为多个功能):

/* 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);
}

我知道我可以使用 in 模式打开文件"w",但在这种情况下我不想这样做。我知道/中有一个函数ftruncate,但我不想使用这些函数,我的代码应该是高度可移植的(在 Windows 上也是如此)。unistd.hsys/types.h

是否有可能在不关闭/重新打开文件的情况下清除文件?

4

2 回答 2

6

使用标准 C,唯一的方法是每次需要截断时以“w+”模式重新打开文件。你可以用freopen()这个。"w+" 将继续允许从中读取,因此无需在 "r+" 模式下再次关闭并重新打开。“w+”的语义是:

开放阅读和写作。如果文件不存在,则创建该文件,否则将其截断。流位于文件的开头。

(取自 fopen(3) 手册页。)

使用时可以将 NULL 指针作为文件名参数传递freopen()

my_file = freopen(NULL, "w+", my_file);

如果您根本不需要从文件中读取,那么“w”模式也可以正常工作。

于 2012-10-19T20:01:42.037 回答
3

你可以写一个这样的函数:(伪代码)

if(this is linux box) 
use truncate()
else if (this is windows box)
use _chsize_s()

这是满足您要求的最直接的解决方案。

请参阅:msdn.microsoft.com 上的 man truncate 和 _chsize_s

并包含必要的头文件。

于 2012-10-19T19:48:10.223 回答