我在C中有以下代码。我正在尝试查找以已知单词开头的行,以便用新信息写回该行。我发现的问题是,当我找到它时,流fp已经在我想要编辑的行之后,所以我需要回到那一行才能编写它。我怎么能这样做?感谢。
FILE *fp;
char line[256];
char description[128];
memset(description, 0, sizeof (description));
if (!(fp = (FILE*) fopen("/etc/samba/smb.conf", "r+"))) {
printf("Error opening smb.conf\n");
return -1;
}
while (fgets(line, sizeof line, fp)) {
if (!strncmp(line, "comment =", 9)) {
sscanf(line, "comment = %[^\t\n]", description);
printf("Old comment found: %s\n",description);
fprintf(fp, "comment = %s\n", "New Comment here");
}
}
fclose(fp);
答案 0 :(得分:4)
即使有办法“回到上一行”,你的方法也不会有效。它只会在你用一条完全相同长度的线替换时才有效。 (你可以使用空白填充来插入比原始行更短的行,但如果你想插入的数据比原来那样多,那就不行了。)
创建一个新文件,将所有内容复制(根据需要进行修改),并在成功完成后替换原始文件。
备选方案,在内存中读取文件(根据需要修改),并覆盖原始文件。
如果没有上述内容,您无法在文件中间“插入”。
答案 1 :(得分:2)
假设文件不是很大,最简单的方法可能是将整个文件读入一个字符串数组,修改你想要的那些字符串,然后将它们全部写回磁盘。
编辑:我确实有必要指出,除非你需要的内容超出你的问题所暗示的范围,sed
可能比从头开始编写你自己的程序更好。