Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C文件中查找并替换_C_File_Find - Fatal编程技术网

在C文件中查找并替换

在C文件中查找并替换,c,file,find,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

问题是在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);
}
#包括
#包括
int main()
{
文件*f1,*f2;
字符*src,*dest,*s1,ch,ch1,ch2,ch3;
int i;
f1=fopen(“input.txt”、“rw”);
f2=fopen(“dummy.txt”、“rw”);
src=“mor”;
dest=“偶数”;
while(ch!=EOF)
{
ch=fgetc(f1);
if(ch==src[0])//查找src的第一个字符
{
fgets(s1,strlen(src),f1);
if(strcmp(src+1,s1)==0)//查找文件中出现的“src”
{
fseek(f1,strlen(src)-1,SEEK_CUR);
while(ch1!=EOF)//将剩余数据复制到另一个文件中
{
ch1=fgetc(f1);
fputc(ch1,f2);
}
fseek(f1,-strlen(src),SEEK_CUR);

对于(i=0;i您在输出中打印了错误的内容。请打印“ch”,而不是文件指针

while(ch!=EOF) { ch=getc(f1); printf("%c",ch); } while(ch!=EOF) { ch=getc(f2); printf("%c",ch); } while(ch!=EOF) { ch=getc(f1); printf(“%c”,ch); } while(ch!=EOF) { ch=getc(f2); printf(“%c”,ch); }
此外,f2在输出结束时关闭。您必须重新打开它(就像f1一样)。

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

e、 g

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

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 );
   }
}
charsrc[]=“mor”;
char dest[]=“偶数”;
int lenSrc=strlen(src);
int lenDest=strlen(dest);
对于(char*ch=buf;ch

免责声明:我还没有编译此文件。乍一看,我发现您调用fgets的代码是错误的。您没有分配任何内存,正在将字符串读入未初始化的指针。读入数组或动态分配的内存。

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

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
,该缓冲区将在不久的将来对您产生影响),再跳过2个字符(现在您的指针位于“晨”的最后n),将“ng”复制到
f2
,尝试在该循环中将EOF写入f2(因此上述模式将一直读取到
EOF
),然后返回两个字符(一旦到达
EOF
,它可能会失败,我的C文件函数现在有点生锈),将“偶数”写入f1(如果我在
EOF
后搜索错误,则应将输入文件设置为“mornieven”,如果我是正确的,则不更改它)。总之,我认为代码没有达到您想要的效果

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

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

  • 此外,当您需要缓冲区(如s1)时,现在只需使用足够大的数组,但请查看
    malloc()
    free()
    函数,以便在此类情况下执行动态内存分配。

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


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

    最明显的有效代码是:
    sed“s/src/dest/g”input.txt
    。直接用C做这件事没有多大意义(至少在我看来)。@Jerry Coffin…先生,但这个问题是为了测试我们对用C处理文件的理解!!!“这个问题是为了测试我们对用C处理文件的理解”-这是一个家庭作业问题吗?如果是的话,你可能想添加“家庭作业”标记。@Merlyn…我没有添加,但上次登录时有人删除了它…看起来好像又有人删除了它!!@Starsky,我明白你的意思了,先生。我在代码中更改了它。我删除了打印部分。请检查替换逻辑中是否有任何错误,先生。运行时不会更改input.txt文件,并且原始文件也不会更改最后的内容被保留了……谢谢你的帮助,先生……正如你所指出的,fgets似乎没有问题。它编译得很好,执行得很正确
    FILE *fInput = fopen("input.txt", "r");
    int ch; /* need an int to hold EOF */
    
    for (;;)
    {
        ch = fgetc(fInput);
        if (ch == EOF) break;
    
        ...
    }