在C文件中查找并替换
问题是在C文件中查找并替换字符串 我不熟悉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
#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;
...
}