【问题标题】:How do I clear the contents of a file using c?如何使用c清除文件的内容?
【发布时间】:2010-03-18 17:12:26
【问题描述】:

我正在编写一些代码,以便在 for 循环的每次迭代中运行一个将数据写入文件的函数,如下所示:

int main()
{
    int i;

    /* Write data to file 100 times */
    for(i = 0; i < 100; i++)    writedata();

    return 0;
}

void writedata()
{
    /* Create file for displaying output */
    FILE *data;
    data = fopen("output.dat", "a");

    /* do other stuff */
    ...
}

如何获取它,以便在我运行程序时它会在程序开始时删除文件内容,但之后它会将数据附加到文件中?我知道在fopen() 中使用"w" 标识符将打开一个空的新文件,但我希望能够在每次通过writedata() 函数时将数据“附加”到文件中,因此使用"a" 标识符。

【问题讨论】:

    标签: c file fopen


    【解决方案1】:

    这才是你真正应该做的。这样你只需要打开一次文件,当你打开它时它会被截断。请注意,您还必须更改函数原型(无论它在哪里)。

    int main()
    {
        int i;
    
        FILE *data;
        data = fopen("output.dat", "w");
        if(!data) {
             perror("Error opening file");
             return 1;
        }
    
        /* Write data to file 100 times */
        for(i = 0; i < 100; i++)    writedata(data);
    
        fclose(data);
    
        return 0;
    }
    
    void writedata(FILE *data)
    {
    
        /* do other stuff */
        ...
    }
    

    【讨论】:

    • 另请注意,有一个系统调用 open() 也可以完成这项工作。我觉得 fopen 在这里更合适。
    【解决方案2】:

    我不明白您为什么需要这种方式,但似乎 ftruncate() POSIX 函数正是您要寻找的。​​p>

    【讨论】:

      【解决方案3】:

      你为什么一遍又一遍地打开同一个文件?

      为什么不用w+ 模式在writedata 函数之外打开它,并将文件指针传递给writedata,这样您就可以使用它/* do other stuff */

      【讨论】:

      • 对不起,我是个新手,如何将文件指针传递给 writedata 函数?我以前试过,但我想不通
      • 好的,我现在明白了,我必须使用“w”而不是“w+”,否则会出现分段错误。
      • +1 表示一遍又一遍地打开文件是多么疯狂,这是一项极其昂贵的操作。
      【解决方案4】:

      这样怎么样?不像其他一些解决方案那样简洁。

      #include<stdio.h> 
      static int t = 0;    
      void writedata()
      {
         FILE* data;
         if(t == 0) {
            data = fopen("output.dat", "w");
            t++;
         } else {
            data = fopen("output.dat", "a");
         }
      } 
      
      int main()
      {
          int i;
          for(i = 0; i < 100; i++) writedata();
          return 0;
      }
      

      【讨论】:

        【解决方案5】:

        大概是这样的:

        static void writedata(int append);
        
        int main()
        {
            int i;
        
            /* Write data to file 100 times */
            for(i = 0; i < 100; i++) 
                writedata(i == 0);
        
            return 0;
        }
        
        static void writedata(int append)
        {
            /* Create file for displaying output */
            FILE *data;
            data = fopen("output.dat", append ? "a" : "w");
        
            /* do other stuff */
            ...
        }
        

        这只是传入一个标志,告诉函数是否应该打开文件进行追加。

        更好的解决方案是稍微重构代码,只在循环之前打开文件一次,然后将FILE * 传递给函数。这样,它就不必知道它是否附加到现有文件。

        【讨论】:

          【解决方案6】:

          这样怎么样:

          void clear_file(const char *filename)
          { 
              FILE *output = fopen(filename, "w");
              fclose(output);
          }
          

          所以文件被打开写入并自动擦除。

          【讨论】:

            猜你喜欢
            • 2014-03-14
            • 2011-02-11
            • 2011-06-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多