在"r +"模式下打开时,在C中清除/截断文件

Mar*_*ant 5 c fopen truncate clear c89

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

/* 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Nik*_* C. 5

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

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

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

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

my_file = freopen(NULL, "w+", my_file);
Run Code Online (Sandbox Code Playgroud)

如果您根本不需要读取文件,则在“ w”模式下也可以。

  • @askmish 使用内核调用会使其不可移植。就像使用 POSIX 或 w32 API 一样。做到这一点的唯一方法是使用特定于平台的代码。可移植代码(即纯 ANSI C)无法做到这一点。 (3认同)