void replaceString(char* file, char* str, char* replace)
{
FILE* fp = fopen(file,"rt");
char buffer[BUFFER];
while(fgets(buffer,BUFFER,fp)!=NULL)
{
char* s;
s=strstr(buffer,str);
if(s!=NULL)
{
strcpy(s,replace);
printf("%s is replaced by %s\n",str,replace);
}
}
fclose(fp);
}
int main(int argc, char **argv)
{
char* file= "text.txt";
replaceString(file,"is","was");
printFile(file);
return 0;
}
伙计我是文件操作的新手,试图找到并替换另一个字符串。请帮忙!我试图以“rt”模式打开文件。在一些示例代码中看到了这一点。不确定模式。我猜我需要使用temp.txt文件来做到这一点!可以在一个文件中完成而不使用任何其他文件吗?
答案 0 :(得分:2)
以下是您算法中的一些错误。
您一次阅读并查看一个字符缓冲区,没有重叠。如果缓冲区之间出现str
怎么办? (即str
的第一部分位于缓冲区的末尾,第二部分位于下一个缓冲区的开头。)
您尝试使用str
直接在缓冲区中使用replace
覆盖strcpy
。如果两个字符串长度不同怎么办?如果replace
比str
短,那么str
的结尾仍然是replace
,如果str
更长,则会覆盖strcpy
后面的文字
即使它们的长度相同,strncpy
也会在副本末尾添加最后的0个字符(这就是它们告诉你字符串结束的方式)。你绝对不希望如此。也许BUFFER
在这里是一个更好的建议,但如果两个字符串的长度不同,它仍然无效。
您替换缓冲区中的字符串,但对“已更正”的缓冲区不执行任何操作!缓冲区不是文件,文件的内容被COPIED到缓冲区中。所以你改变了副本然后什么都没改变。该文件不会更改。您需要将更改写入文件,最好是另一个文件。
编写这样的替换并不像你想象的那么简单。我可以尝试帮助你,但如果你只是想学习使用文件并且仍然不熟悉字符串,那可能会有点过头了。
如果你有足够的内存来一次读取整个文件(如果replace
大于文件大小),那么在单个文件中执行替换很容易,但是如果不是特别适合{{ {1}}超过str
。
答案 1 :(得分:1)
此代码替换所有出现的“orig”文本。您可以根据需要进行修改:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void
replaceAllString(char *buf, const char *orig, const char *replace)
{
int olen, rlen;
char *s, *d;
char *tmpbuf;
if (!buf || !*buf || !orig || !*orig || !replace)
return;
tmpbuf = malloc(strlen(buf) + 1);
if (tmpbuf == NULL)
return;
olen = strlen(orig);
rlen = strlen(replace);
s = buf;
d = tmpbuf;
while (*s) {
if (strncmp(s, orig, olen) == 0) {
strcpy(d, replace);
s += olen;
d += rlen;
}
else
*d++ = *s++;
}
*d = '\0';
strcpy(buf, tmpbuf);
free(tmpbuf);
}
int
main(int argc, char **argv)
{
char str[] = "malatya istanbul madrid newyork";
replaceString(str, "malatya", "ankara");
printf("%s\n", str);
replaceString(str, "madrid", "tokyo");
printf("%s\n", str);
return 0;
}
答案 2 :(得分:0)
"rt"
模式仅供参考。使用"r+"
模式。这将打开读写文件。
答案 3 :(得分:0)
我会考虑使用缓冲区并对此进行处理。
#include <stdio.h>
#include <string.h>
int main ( ) {
char buff[BUFSIZ]; // the input line
char newbuff[BUFSIZ]; // the results of any editing
char findme[] = "hello";
char replacewith[] = "world";
FILE *in, *out;
in = fopen( "file.txt", "r" );
out= fopen( "new.txt", "w" );
while ( fgets( buff, BUFSIZ, in ) != NULL ) {
if ( strstr( buff, findme ) != NULL ) {
// do 1 or more replacements
// the result should be placed in newbuff
// just watch you dont overflow newbuff...
} else {
// nothing to do - the input line is the output line
strcpy( newbuff, buff );
}
fputs( newbuff, out );
}
fclose( in );
fclose( out );
return 0;
}