c - 在 C 文件中查找和替换

标签 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的内容是“morning”。

请指出逻辑中的错误,并为此提供有效的代码。

提前致谢。

最佳答案

用 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,读取 (使用 fgets() - 并进入未分配的缓冲区 s1在不久的将来的某个时间去 ka-boom 在你身上),再跳过 2 个字符(现在你的指针在“morning”的最后 n 个),将“ng”复制到 f2,尝试写 EOF到这个循环中的 f2(因此上面的模式用于读取直到 EOF),寻找两个字符返回(一旦到达 EOF 可能会失败,我的 C 文件函数有点这些天生锈了),将“even”写入 f1(如果我在 EOF 之后查找错误,则应该将输入文件设置为“mornieven”,如果我是正确的则不要更改它)。总之,我认为代码没有按照您的预期进行。

我建议您构建函数。以下每一项都可以编写为程序,您应该在进入下一步之前测试并完成:

  1. 安全地读取文件,并打印出来
  2. 检测src的内容,并打印剩余的输入
  3. 将其余输入保存到第二个文件而不是打印
  4. 将第一个文件中的 src 替换为 dest,并忽略其余部分(因为您使用“rw”打开输入文件,这将截断其余输入)。您可能需要执行 fseek() 来清除 EOF 状态。另请查看 ftell() 以记录您可以使用 fseek()
  5. 跳回的位置
  6. 最后,将src替换为dest后,将保存的所有内容复制到第二个文件中(此处无需关闭f1。但最好将f2打开为write ,从第一个文件复制后关闭,并以读取方式重新打开以执行复制回 f1)。

另外,当你需要一个缓冲区时(比如 s1),现在就使用一个足够大的数组,但是看看 malloc()free()为这些情况执行动态内存分配的函数。

关于c - 在 C 文件中查找和替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3441356/

相关文章:

c - 在C中如何使用printf输出球坐标转换为笛卡尔坐标的值?

c 结构体和 pthread 指针分配

java - 如何使用 Jersey 下载 PDF 文件?

linux - Emacs 读取大文件 ~14GB

javascript - 查找图像 ID 并替换为单击的按钮类

macos - find 缺少选项 -printf,现在怎么办?

c - 如何在c语言的文本输入文件中找到匹配括号或大括号的位置?

c - 如何使用 pthread_exit() 重用线程

c++ - Linux 的注册表等效项是什么?

javascript - 查找文件名然后查找匹配的字符串