问题是查找并替换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指向逻辑并为其提供有效的代码。
先谢谢。
答案 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”,如果我是正确的话,不要更改它。总之,我认为代码不会按照您的意图执行。
我建议你建立你的功能。以下每一项都可以编写为一个程序,您应该在进行下一步之前进行测试和完成:
EOF
的内容,并打印输入的其余部分EOF
替换src
,忽略其余部分(因为用'rw'打开输入文件,这将截断输入的其余部分)。您可能需要执行fseek()来清除EOF状态。另请查看src
以记录您可以使用dest
ftell()
替换fseek()
之后复制你保存到第二个文件的所有内容(不需要在此处关闭f1。但最好将f2作为写入打开,从第一次复制后关闭文件,并重新打开,以执行复制回f1)。此外,当你需要一个缓冲区(例如s1)时,现在只需要使用足够大的数组,但是查看src
和dest
函数来为这些情况执行动态内存分配
答案 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
声明为char
。 fgetc()
会返回int
,这是有充分理由的。最好能够返回任何可能的字符或EOF
,因此EOF
不应该是字符,因此理想情况下fgetc()
会返回比char
更大的类型。< / p>
结果是循环可能永远不会结束,因为ch
在某些标准实现上不可能保持EOF
。将其(ch1
和ch3
)声明为int
。