同时从文件中写入和读取

时间:2015-04-16 14:21:29

标签: c file readfile writefile

我一直在尝试同时从文件中读取和写入,并且我试图将text.txt内容中的所有选项卡替换为空格。这是我的代码:

int main()
{
   FILE* filePtr = fopen("text.txt", "w+");

   char c;
   c = fgetc(filePtr);
   fpos_t num;
   while(c != EOF)
   {
       if(c == '\t')
       {
           fgetpos(filePtr, &num);
           num--;
           fsetpos(filePtr, &num);
           fputc(' ', filePtr);
       }
       c = fgetc(filePtr);
   }
}

text.txt的内容如下:

你好我的名字\ t是\ t杰克!

当我运行此代码时,text.txt文件中的输出只是空格。那里没有人物。我该怎么做才能让替换按预期进行?

4 个答案:

答案 0 :(得分:7)

您的代码存在三个主要问题:

  1. 以模式"w+"打开文件截断文件(删除所有内容)。您可以读取和写入它,但原始内容将丢失。模式"r+"将打开它进行读写,而不更改内容,文件位置最初位于文件的开头。

  2. 对类型fpos_t的值执行算术是不安全的。无论如何它是不必要的;有一种更简单的方法可以将文件位置移动相对数量。

  3. 完成后,您不会关闭文件。

  4. 您的代码的这种变体适合我:

    #include <stdio.h>
    
    int main(void)
    {
       FILE* filePtr = fopen("text.txt", "r+");
       char c;
    
       while((c = fgetc(filePtr)) != EOF)
       {
           if(c == '\t')
           {
               fseek(filePtr, -1, SEEK_CUR);
               fputc(' ', filePtr);
           }
       }
       fclose(filePtr);
       return 0;
    }
    

答案 1 :(得分:2)

引用cplusplus.com

  

&#34; W +&#34;写/更新:创建一个空文件并打开它进行更新(两者都有   用于输入和输出)。如果已存在具有相同名称的文件   内容被丢弃,文件被视为新的空文件。

您应该使用&#34; r +&#34;。

  

&#34; R +&#34;读/更新:打开文件进行更新(包括输入和输出)。   该文件必须存在。

答案 2 :(得分:1)

这里的代码有两个主要问题:

  1. &#34; R +&#34;这里必须使用模式而不是&#34; w +&#34;。
  2. &#34; w +&#34;模式删除文件的所有内容,如果它从之前退出然后写入文件,而&#34; r +&#34;模式使您可以使用之前的当前数据。

    1. 从读取切换到写入或从写入切换到读取数据时,必须使用位置设置功能。<​​/ li>

      来自Pelles C帮助文件:

        

      当使用更新模式打开文件时(&#39; +&#39;作为mode参数中的第二个或第三个字符),可以在关联的流上执行输入和输出。但是,如果没有对fflush功能或文件定位功能(fseek,fsetpos或rewind)的干预调用,输出不应直接输入,并且输入不应直接跟随输出而不干预文件定位函数,除非输入操作遇到文件结尾。

      这是对我有用的代码:

      int main(void)
      {
          FILE* filePtr = fopen("text.txt", "r+");
          char c;
          while( (c = fgetc(filePtr)) != EOF )
          {
              if(c == '\t')
              {
                  fseek(filePtr, -1, SEEK_CUR);
                  fputc(' ', filePtr);
                  fseek(filePtr, 0, SEEK_CUR);
              }
          }
      
          fclose(filePtr)
          return 0;
      }
      

答案 3 :(得分:0)

问题是您正在使用w+ fopen标志并尝试递减一个复杂类型的fpos_t变量。您应该使用r+,然后递减num.__pos以使其正常工作