【问题标题】:clear/truncate file in C when already open in "r+" mode当已经以“r+”模式打开时,在 C 中清除/截断文件
【发布时间】:2012-10-19 19:19:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: c fopen truncate c89


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • OP 想要一个独立于平台的解决方案,并且不想重新打开文件。并且仍然使用 r+。 :)
    • @askmish 这是不可能的:-P
    • @Nkos:它可能,但是,最佳解决方案将非常复杂(涉及内核调用,使用缓冲机制等),鉴于 OP 的问题似乎有点过头了。 :(
    • @askmish 使用内核调用会使其不可移植。就像使用 POSIX 或 w32 API 一样。做到这一点的唯一方法是使用特定于平台的代码。可移植代码(即纯 ANSI C)无法做到这一点。
    • 同意你刚才所说的。
    【解决方案2】:

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

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

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

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

    并包含必要的头文件。

    【讨论】:

    • 我知道这行得通,但我只在确实需要时才这样做,而且没有其他办法。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2012-04-16
    • 2012-05-03
    • 2020-05-21
    • 2011-01-26
    • 2021-03-13
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多