我有一个文本文件的text.txt读取(为简单起见)如何读取和覆盖C文本文件?
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'。我还将变量“行”设置为1,因为如果它位于第一行,我想倒回到文件的开头,以便在文件的开头而不是文件末尾进行覆盖。线然后增加,因此它将跳过下一次迭代的倒带,并应继续覆盖第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“);' - 然后打开一个具有相同名称的**新文件,并将修改的行写入新文件。你将拥有**两个** FILE *'变量。 –
它必须位于行的开头。 – BLUEPIXY
就地重写文件是非常棘手的。一个鲜为人知的重要事实是,当你读到你想开始写作的确切位置时,你必须在开始写作之前调用'fseek(fp,0,SEEK_CUR)'。然后再写完之后再开始阅读。 –