跳转到内容

C 语言文件读取

来自代码酷

C语言文件读取[编辑 | 编辑源代码]

文件读取是C语言中文件操作的核心功能之一,它允许程序从外部文件(如文本文件或二进制文件)中获取数据并进行处理。本章节将详细介绍C语言中文件读取的基本概念、常用函数及其实际应用。

概述[编辑 | 编辑源代码]

在C语言中,文件读取通常通过标准库函数(如fopenfreadfscanf等)实现。文件读取的基本流程包括: 1. 打开文件(fopen) 2. 读取文件内容(使用合适的函数) 3. 关闭文件(fclose

文件读取的模式通常分为:

  • 文本模式:以字符形式读取文件,适用于文本文件(如.txt)。
  • 二进制模式:以字节形式读取文件,适用于非文本文件(如.jpg.dat)。

文件读取的基本步骤[编辑 | 编辑源代码]

1. 打开文件[编辑 | 编辑源代码]

使用fopen函数打开文件,并指定读取模式(如"r"表示只读文本模式,"rb"表示只读二进制模式)。

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r"); // 打开文件
    if (file == NULL) {
        printf("文件打开失败!\n");
        return 1;
    }
    // 文件操作...
    fclose(file); // 关闭文件
    return 0;
}

2. 读取文件内容[编辑 | 编辑源代码]

C语言提供了多种文件读取函数,适用于不同场景:

逐字符读取(fgetc[编辑 | 编辑源代码]

int ch;
while ((ch = fgetc(file)) != EOF) { // 逐字符读取,直到文件末尾
    printf("%c", ch);
}

逐行读取(fgets[编辑 | 编辑源代码]

char buffer[256];
while (fgets(buffer, sizeof(buffer), file) != NULL) { // 逐行读取
    printf("%s", buffer);
}

格式化读取(fscanf[编辑 | 编辑源代码]

适用于读取结构化数据(如CSV文件):

int num;
char str[100];
fscanf(file, "%d %s", &num, str); // 读取整数和字符串
printf("数字: %d, 字符串: %s\n", num, str);

二进制读取(fread[编辑 | 编辑源代码]

int data[10];
size_t count = fread(data, sizeof(int), 10, file); // 读取10个整数
printf("读取了 %zu 个整数\n", count);

3. 关闭文件[编辑 | 编辑源代码]

使用fclose关闭文件,释放资源:

fclose(file);

实际案例[编辑 | 编辑源代码]

案例1:统计文件行数[编辑 | 编辑源代码]

#include <stdio.h>

int main() {
    FILE *file = fopen("data.txt", "r");
    if (file == NULL) {
        printf("文件打开失败!\n");
        return 1;
    }

    int lines = 0;
    char buffer[256];
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        lines++;
    }

    printf("文件共有 %d 行\n", lines);
    fclose(file);
    return 0;
}

输出:

文件共有 10 行

案例2:读取CSV文件并解析数据[编辑 | 编辑源代码]

假设data.csv内容如下:

1,John,85
2,Jane,92
3,Alice,78
#include <stdio.h>

int main() {
    FILE *file = fopen("data.csv", "r");
    if (file == NULL) {
        printf("文件打开失败!\n");
        return 1;
    }

    int id, score;
    char name[50];
    while (fscanf(file, "%d,%[^,],%d", &id, name, &score) == 3) {
        printf("ID: %d, 姓名: %s, 分数: %d\n", id, name, score);
    }

    fclose(file);
    return 0;
}

输出:

ID: 1, 姓名: John, 分数: 85
ID: 2, 姓名: Jane, 分数: 92
ID: 3, 姓名: Alice, 分数: 78

错误处理[编辑 | 编辑源代码]

文件读取时可能发生错误(如文件不存在或权限不足),因此应检查函数返回值:

  • fopen返回NULL表示失败。
  • fgets返回NULL表示读取失败或到达文件末尾。
  • fscanf返回成功匹配的参数数量。

性能优化[编辑 | 编辑源代码]

对于大文件,逐字符读取效率较低,建议使用fread批量读取:

char buffer[4096];
size_t bytes_read;
while ((bytes_read = fread(buffer, 1, sizeof(buffer), file)) > 0) {
    // 处理buffer中的数据
}

总结[编辑 | 编辑源代码]

C语言文件读取是处理外部数据的重要工具,通过合理选择函数(如fgetcfgetsfscanffread),可以实现高效的数据输入。务必注意错误处理和资源释放,以避免内存泄漏或程序崩溃。

graph TD A[开始] --> B[打开文件 fopen] B --> C{文件是否打开成功?} C -->|是| D[读取文件内容] C -->|否| E[输出错误信息] D --> F[关闭文件 fclose] F --> G[结束] E --> G

数学公式(可选)[编辑 | 编辑源代码]

文件读取的字节数可以通过以下公式计算: 解析失败 (语法错误): {\displaystyle \text{bytes\_read} = \sum_{i=1}^{n} \text{sizeof}(buffer[i]) }