我还没有实现这一点,我仍然在思考的阶段,但我必须要经过一个文件,并替换某些字符串用另一个字符串。 例如,
<img src="/images/logo.gif" ...
应该成为
<img src="/proxy/www.example.com/images/logo.gif" ...
我如何能处理这有什么建议? 也许存在一些“字符串替换” C函数,会为我做到这一点,我不知道......?
现在,如果我不得不写这个功能我自己,我会作为参数的文件,替换字符串,替换字符串给它。 然后我会去手动通过文件和查找字符串的出现并重新创建它。 然而,这似乎是非常低效的。 有没有更好的方式来做到这一点?
谢谢,斯托伊奇
没有,在C中没有的功能,在整个文件中替换字符串。 你必须自己实现它。
这就是说,你正在展示我们的是HTML和HTML是棘手的,因为它是分层的。 你需要正确地分析它? 因为如果你是,任务要困难得多。 鉴于它的功课,我对此表示怀疑,所以你可能会做的不够:
- 打开该文件,并将其加载到内存(假设它是不是太大 - 如果是这样,你可以写到一个临时文件,并将其移动到原来选好后)
- 连续使用
strstr
查找字符串锚你需要开始更换 - 更换
- 重复步骤2和3直到完文件后
- 写回文件
由于它的功课,我的假设是串不能跨越多行去。 如果这个假设是正确的(和禁止使用“的HTML替换文本”的复杂性),则:
1读取下一行
2替换字符串和写入线(到另一个文件)
3如果没有结束时,转到#1
4 WIN \ O /
或许老师要别的东西耸肩
首先,C是一个真棒语言,但是是最痛苦的语言之一,做这类手术的,只是不得不说。
你可以安全地假设整个文件的内容可以存放在内存? 如果是这样的话:
allocate buffer big enough to hold file contents
read entire file into buffer
inputPtr = 0
while(inputPtr < size of buffer) {
replacePosition = strstr(inputPtr, stringToReplace);
if (replacePosition != NULL)
writeUntil = replacePosition - 1
else
writeUntil = end of buffer
write out buffer from inputPtr to writeUntil inclusive (could be 0 bytes)
if (replacePosition == NULL) break
write out the replacement string
inputPtr = replacePosition + strlen(stringToReplace)
}
由于这是家庭作业,我不会给你一个答案,但我会指出,旅行的人一个经典问题。
在C语言中,这是最简单的读取一个固定的字节数(你可以尝试做一行行,但如果线太长,这反过来读取字节固定数量的)。 如果你想替换字符串结束了一个缓冲区和第二缓冲区之间越来越分裂:
buf1 -> "...<img src=\"/ima"
buf2 -> "ges/logo.gif\"..."
你不会是能够做到在内存中一个简单的搜索替换。
你试试这个strcpy函数,
指定的URL在一个字符串中,并通过strcpy函数替换它。
您应该调查sed命令。 看看它做什么和做同样的事情。
它可以作为一个过滤器,所以用它来代替在一个文件中的东西时,你经常做的是捕获输出到一个文件,然后用新文件取代旧文件。
您可以使用下列程序来搜索和文件中的替换字符串。
int main()
{
.....
replaceIPAddress( "System.cfg", "172.16.116.157", "127.0.0.1");
.....
}
void replaceIPAddress( char * confFileName, char *text_to_find , char *text_to_replace )
{
FILE *input = fopen(confFileName, "r");
FILE *output = fopen("temp.txt", "w");
char buffer[512];
while (fgets(buffer, sizeof(buffer), input) != NULL)
{
char *pos = strstr(buffer, text_to_find);
if (pos != NULL)
{
/* Allocate memory for temporary buffer */
char *temp = calloc(
strlen(buffer) - strlen(text_to_find) + strlen(text_to_replace) + 1, 1);
/* Copy the text before the text to replace */
memcpy(temp, buffer, pos - buffer);
/* Copy in the replacement text */
memcpy(temp + (pos - buffer), text_to_replace, strlen(text_to_replace));
/* Copy the remaining text from after the replace text */
memcpy(temp + (pos - buffer) + strlen(text_to_replace),
pos + strlen(text_to_find),
1 + strlen(buffer) - ((pos - buffer) + strlen(text_to_find)));
fputs(temp, output);
free(temp);
}
else
fputs(buffer, output);
}
fclose(output);
fclose(input);
/* Rename the temporary file to the original file */
rename("temp.txt", confFileName);
}