在C文件中查找和替换

时间:2010-08-09 15:04:09

标签: c file find

问题是查找并替换C文件中的字符串

我是C档案的新手。我尝试了以下代码,但我没有得到任何输出:

    #include<stdio.h>
    #include<string.h>
    int main()
    {
        FILE *f1,*f2;
        char *src,*dest,*s1,ch,ch1,ch2,ch3;
        int i;
        f1=fopen("input.txt","rw");
        f2=fopen("dummy.txt","rw");
        src="mor";
        dest="even";
        while(ch!=EOF)
        {
         ch=fgetc(f1);
         if(ch==src[0])                      //Finding 1st char of src
         {
         fgets(s1,strlen(src),f1);
         if(strcmp(src+1,s1)==0)         //Finding occurance of "src" in file
         {
          fseek(f1,strlen(src)-1,SEEK_CUR);
          while(ch1!=EOF)             //Copying remaining data into another file
          {
          ch1=fgetc(f1);
          fputc(ch1,f2);
          }
      fseek(f1,-strlen(src),SEEK_CUR);
      for(i=0;i<strlen(dest);i++)  //replacing "src" with "dest"
      {
          ch2=dest[i];
          fputc(ch2,f1);
      }
      fclose(f1);
      f1=fopen("input.txt","a");
      while(ch3!=EOF)      //Appending previosly copied data into 1st file
      {
          ch3=fgetc(f2);
          fputc(ch3,f1);
      }
     }
   }
 }
     fclose(f1);
     fclose(f2);
}

input.txt的内容为“早上”。

请将 ERROR指向逻辑并为其提供有效的代码。

先谢谢。

5 个答案:

答案 0 :(得分:3)

用C读取文件通常有点乱。我看到的第一个问题是在主循环中使用ch的方式。第一次

while (ch != EOF)
执行

,ch未初始化,如果它恰好保持EOF,则主循环根本不会执行。我通常使用以下结构来读取文件:

FILE *fInput = fopen("input.txt", "r");
int ch; /* need an int to hold EOF */

for (;;)
{
    ch = fgetc(fInput);
    if (ch == EOF) break;

    ...
}

此外,您可能需要阅读文件指针概念。例如,在阅读src的剩余部分后,您fseek()转发,并在将数据复制到f2之前跳过一些其他字符。从本质上讲,您阅读m,阅读or(使用fgets() - 并进入一个未分配的缓冲区s1,这将在不久的将来一段时间内成为您的热潮,再跳过2个字符(现在你的指针位于“早上”的最后一个n),将“ng”复制到f2,尝试在此循环中将EOF写入f2(因此上述模式用于读取{{1} }),找回两个字符(一旦你到达EOF可能会失败,这些天我的C文件功能有点生锈),写“偶数”到f1(如果我错了寻求{ {1}},将输入文件设置为“mornieven”,如果我是正确的话,不要更改它。总之,我认为代码不会按照您的意图执行。

我建议你建立你的功能。以下每一项都可以编写为一个程序,您应该在进行下一步之前进行测试和完成:

  1. 安全地读取文件并将其打印出来
  2. 检测EOF的内容,并打印输入的其余部分
  3. 将其余输入保存到第二个文件而不是打印
  4. 在第一个文件中用EOF替换src,忽略其余部分(因为用'rw'打开输入文件,这将截断输入的其余部分)。您可能需要执行fseek()来清除EOF状态。另请查看src以记录您可以使用dest
  5. 跳回的位置
  6. 最后,在用ftell()替换fseek()之后复制你保存到第二个文件的所有内容(不需要在此处关闭f1。但最好将f2作为写入打开,从第一次复制后关闭文件,并重新打开,以执行复制回f1)。
  7. 此外,当你需要一个缓冲区(例如s1)时,现在只需要使用足够大的数组,但是查看srcdest函数来为这些情况执行动态内存分配

答案 1 :(得分:2)

进行替换的一种简单方法是首先将整个文件读入缓冲区

e.g。

FILE* fpIn = fopen("file.txt","rb");
fseek(fpIn, 0L, SEEK_END);
size_t s = ftell(fpIn);
fseek(fpIn, 0L, SEEK_SET);
void* buf = malloc(s);
fread(buf,s,1,fpIn);

现在在写文件时,检查你的字符串

char src[] = "mor";
char dest[] = "even";
int lenSrc = strlen(src);
int lenDest = strlen(dest);
for (char* ch = buf; ch < buf + s; ++ch)
{
   if ( !memcmp( ch, src, lenSrc ) )
   {
     fwrite( dest, 1,lenDest, fpOut );
     ch += lenSrc;
   }
   else 
   {
     fputc( *ch, fp );
   }
}

免责声明:尚未编译此

答案 2 :(得分:1)

您在输出中打印错误的内容。打印,“ch”,而不是文件指针。

 while(ch!=EOF) 
 { 
     ch=getc(f1); 
     printf("%c",ch); 
 } 
 while(ch!=EOF) 
 { 
     ch=getc(f2); 
     printf("%c",ch); 
 }

此外,f2在输出结束时关闭。你必须重新打开它(就像你对f1一样。)

答案 3 :(得分:1)

乍一看,我看到你调用fgets的代码是错误的。您没有分配任何内存,而是将字符串读入未初始化的指针。读入数组或动态分配的内存。

答案 4 :(得分:1)

另一个问题是您将ch声明为charfgetc()会返回int,这是有充分理由的。最好能够返回任何可能的字符或EOF,因此EOF不应该是字符,因此理想情况下fgetc()会返回比char更大的类型。< / p>

结果是循环可能永远不会结束,因为ch在某些标准实现上不可能保持EOF。将其(ch1ch3)声明为int