C语言文件行读写主要通过fgets(从文件读取一行,包括换行符,需指定缓冲区大小)和fputs(向文件写入字符串,需手动添加换行符)实现,操作时必须检查文件打开状态、处理文件结束条件(fgets返回NULL),并及时关闭文件,以确保正确读写文本内容并避免资源泄漏,适用于需要逐行处理文本文件的场景。

在C语言中,文件行读写是处理文本文件的常用方式。

一、基本概念

在C语言中,文件操作是通过标准库函数实现的,主要在stdio.h头文件中定义。文件行读写是指按行读取或写入文件内容,而不是按单个字符或格式化数据读写。

文件读写模式

  • "r":只读模式(打开已存在的文本文件)
  • "w":写入模式(创建新文件或清空已有文件)
  • "a":追加模式(在文件末尾添加内容)
  • "r+":读写模式(打开已存在的文件,可读可写)
  • "w+":读写模式(创建新文件或清空已有文件)
  • "a+":读写模式(在文件末尾追加内容)

二、常用行读写函数

1. 读取文件行 - fgets()

函数原型char *fgets(char *s, int size, FILE *stream);

功能:从文件中读取一行(包括换行符),最多读取size-1个字符。

使用示例

#include <stdio.h>
#define MAX_LINE 100

int main() {
    FILE *fp;
    char line[MAX_LINE];
    
    fp = fopen("example.txt", "r");
    if (fp == NULL) {
        perror("打开文件失败");
        return 1;
    }
    
    // 逐行读取文件内容
    while (fgets(line, MAX_LINE, fp) != NULL) {
        printf("%s", line);  // 输出读取到的行
    }
    
    fclose(fp);
    return 0;
}

2. 写入文件行 - fputs()

函数原型int fputs(const char *s, FILE *stream);

功能:将字符串写入文件,不自动添加换行符。

使用示例

#include <stdio.h>

int main() {
    FILE *fp;
    
    fp = fopen("example.txt", "w");
    if (fp == NULL) {
        perror("打开文件失败");
        return 1;
    }
    
    // 写入多行内容
    fputs("第一行内容\n", fp);
    fputs("第二行内容\n", fp);
    fputs("第三行内容\n", fp);
    
    fclose(fp);
    return 0;
}

三、行读写的注意事项

  1. 文件打开检查:始终检查文件是否成功打开,避免程序崩溃

    if (fp == NULL) {
        perror("打开文件失败");
        return 1;
    }
    
  2. 行长度限制fgets会限制读取的最大长度,防止缓冲区溢出

  3. 换行符处理fgets会读取换行符,fputs不会自动添加换行符,需在字符串中包含\n

  4. 文件关闭:操作完成后务必关闭文件,释放系统资源

    fclose(fp);
    
  5. 文件结束判定fgets返回NULL表示文件结束或出错

四、对比其他读写方式

读写方式函数读写单位适合场景
行读写fgets, fputs一行文本文件处理,按行处理内容
字符读写fgetc, fputc一个字符需要逐字符处理的场景
格式化读写fscanf, fprintf格式化数据需要按特定格式读写数据

五、完整示例:文件行读写操作

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *inputFile, *outputFile;
    char line[256];
    
    // 打开输入文件(只读)
    inputFile = fopen("input.txt", "r");
    if (inputFile == NULL) {
        perror("打开输入文件失败");
        return 1;
    }
    
    // 打开输出文件(写入)
    outputFile = fopen("output.txt", "w");
    if (outputFile == NULL) {
        perror("打开输出文件失败");
        fclose(inputFile);
        return 1;
    }
    
    // 逐行读取并写入
    while (fgets(line, sizeof(line), inputFile) != NULL) {
        // 处理行内容(例如添加前缀)
        char processedLine[256];
        snprintf(processedLine, sizeof(processedLine), "Processed: %s", line);
        
        // 写入处理后的行
        fputs(processedLine, outputFile);
    }
    
    // 关闭文件
    fclose(inputFile);
    fclose(outputFile);
    
    printf("文件行读写操作完成!\n");
    return 0;
}

六、常见问题

  1. 为什么fgets读取的行包含换行符?

    • fgets会将换行符\n作为行的一部分读入,这样可以保留原始文件的格式。
  2. 如何判断文件是否结束?

    • fgets返回NULL时,表示文件结束或发生错误。
  3. 为什么写入文件时内容不显示?

    • 可能是未正确添加换行符\n,或未关闭文件(缓冲区未刷新)。
  4. 如何处理长行?

    • 使用足够大的缓冲区(如MAX_LINE),或分段读取。

以上就是C语言中文件行读写的详细说明和使用方法。行读写是处理文本文件最常用的方式,适用于大多数需要按行处理文件内容的场景。