【发布时间】:2015-09-20 04:31:18
【问题描述】:
我有一个文本文件 text.txt 读取(为简单起见)
this is line one
this is line two
this is line three
再次为简单起见,我只是想将每行中的第一个字符设置为“x”,所以我想要的结果是
xhis is line one
xhis is line two
xhis is line three
所以我打开 text.txt 文件并尝试用所需的输出覆盖每一行到同一个文本文件。在 while 循环中,我将每行中的第一个字符设置为“x”。我还将变量“line”设置为等于一,因为如果它在第一行,我想倒退到文件的开头,以便在文件的开头而不是结尾覆盖。然后行增加,因此它将跳过下一次迭代的倒带,并应继续覆盖第 2 和第 3 行。它非常适合第一行。
有人有解决办法吗?顺便说一句,我在 stackoverflow 和其他网站上对此进行了广泛的研究,但没有运气。这是我的代码,我的输出也在下面:
#include <stdio.h>
#include <stdlib.h>
#define MAX 500
int main() {
char *buffer = malloc(sizeof(char) * MAX);
FILE *fp = fopen("text.txt", "r+");
int line = 1;
while (fgets(buffer, 500, fp) != NULL) {
buffer[0] = 'x';
if (line == 1) {
rewind(fp);
fprintf(fp, "%s", buffer);
}
else {
fprintf(fp, "%s", buffer);
}
line++;
}
free(buffer);
fclose(fp);
}
输出:
xhis is line one
this is line two
xhis is line two
e
x
【问题讨论】:
-
您不能在阅读时覆盖文件。好吧,你可以,但你得到的数据是乱码。你的操作系统是什么?如果是 Linux/Unix,只需在打开文件后删除文件 -
unlink( "text.txt" );- 然后打开一个 new 同名文件并将修改后的行写入新文件。您将有 两个FILE *变量。 -
必须位于行首。
-
就地重写文件很棘手。一个鲜为人知的重要事实是,当您阅读到要开始写作的确切位置时,您必须在开始写作之前致电
fseek(fp, 0, SEEK_CUR)@ 之类的东西。然后在你写完之后再开始阅读。 -
始终检查 (!=NULL) malloc() 的返回值以确保操作成功。始终检查 (!=NULL) fopen() 的返回值以确保操作成功。
标签: c file pointers fgets overwrite