c语言标准io,更改文件中某行内容,文件内容并更新
时间: 2024-03-05 10:51:15 浏览: 103
在C语言中,使用标准IO库可以比较方便地实现更改文件中某行的内容。下面是一个示例代码,可以实现更改文件中第n行的内容,并确保文件内容已经更新:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE_LEN 1024
int main()
{
char* filename = "test.txt";
int line_num = 3;
char new_line[] = "This is the new content.";
FILE* fp = fopen(filename, "r+");
if (fp == NULL) {
printf("Failed to open file %s\n", filename);
return 1;
}
char line[MAX_LINE_LEN];
int current_line = 0;
int line_pos = 0;
int new_pos = 0;
while (fgets(line, MAX_LINE_LEN, fp) != NULL) {
current_line++;
if (current_line == line_num) {
line_pos = ftell(fp) - strlen(line);
new_pos = ftell(fp);
fseek(fp, line_pos, SEEK_SET);
fputs(new_line, fp);
break;
}
}
if (ferror(fp)) {
printf("Error occurred while reading file %s\n", filename);
fclose(fp);
return 1;
}
// 如果新内容比原内容短,需要将后面的内容向前移动
if (strlen(new_line) < strlen(line)) {
int n_shift = strlen(line) - strlen(new_line);
char buffer[MAX_LINE_LEN];
while (fgets(buffer, MAX_LINE_LEN, fp) != NULL) {
fseek(fp, -strlen(buffer), SEEK_CUR);
fputs(buffer, fp);
}
ftruncate(fileno(fp), ftell(fp) - n_shift);
}
fclose(fp);
printf("File %s has been updated.\n", filename);
return 0;
}
```
在以上示例代码中,我们使用了以下标准IO库函数:
- fopen:打开文件。
- fgets:逐行读取文件内容。
- ftell:获取当前文件指针位置。
- fseek:定位文件指针位置。
- fputs:写入新内容。
- ferror:检查文件读写错误。
- ftruncate:截断文件大小。
在代码中,我们首先打开文件,并使用fgets函数逐行读取文件内容。当读到需要修改的行时,我们使用ftell函数获取当前文件指针位置,并在之后使用fseek函数将文件指针定位到需要修改的行的起始位置。接着,我们使用fputs函数将新内容写入到文件中,并使用ftruncate函数截断文件大小(如果新内容比原内容短)。最后,我们关闭文件并输出更新成功的信息。
需要注意的是,以上示例代码中并没有处理文件中行末的换行符,如果需要更精细的处理可以在代码中加以修改。
阅读全文