You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用getc()而非fscanf()从文件读取数据存入数组?

可以用getc()实现从文件读取行到数组

当然可以用getc()完成这个需求,核心思路是逐个读取字符,把每行的字符存入二维数组,遇到换行或文件结束时标记当前行的结束。以下是实现代码和关键说明:

实现代码

#include <stdio.h>

#define MAX_ROWS 3    // 对应文件里的3行内容
#define MAX_COLS 20   // 假设每行最多20个字符(包含结束符)

int main(void)
{
    setvbuf(stdout, NULL, _IONBF, 0);
    FILE *file = fopen("file.txt", "r");
    
    // 检查文件是否成功打开
    if (file == NULL) {
        perror("无法打开文件");
        return 1;
    }

    char arr[MAX_ROWS][MAX_COLS];
    int row = 0;
    int col = 0;
    int ch;

    while (((ch = getc(file)) != EOF) && row < MAX_ROWS) {
        if (ch == '\n') {
            // 遇到换行,标记当前行结束,切换到下一行
            arr[row][col] = '\0';
            row++;
            col = 0;
        } else {
            // 字符不是换行,存入当前行,注意不要超过列数上限
            if (col < MAX_COLS - 1) {
                arr[row][col] = ch;
                col++;
            }
            // 如果列数满了,后续字符会被截断,避免数组越界
        }
    }

    // 处理文件结束但最后一行没有换行的情况
    if (row < MAX_ROWS && col > 0) {
        arr[row][col] = '\0';
    }

    fclose(file);

    // 验证结果:打印数组内容
    printf("数组内容:\n");
    for (int i = 0; i < MAX_ROWS; i++) {
        printf("arr[%d] = %s\n", i, arr[i]);
    }

    return 0;
}

关键细节说明

  • 数组定义:用二维字符数组arr[MAX_ROWS][MAX_COLS]存储每行内容,MAX_ROWS对应文件的行数,MAX_COLS限制每行的最大长度(要留一个位置存字符串结束符'\0')。
  • 错误处理:必须检查fopen的返回值,避免文件不存在或权限不足时程序崩溃。
  • 字符处理逻辑:
    • 读到换行符时,给当前行添加字符串结束符,然后切换到下一行。
    • 读到普通字符时,只要没超过列数上限就存入数组,防止越界。
    • 文件结束时,如果最后一行没有换行,也要手动添加结束符,保证字符串合法。
  • 边界控制:循环里加入row < MAX_ROWS的判断,避免数组行索引越界。

内容的提问来源于stack exchange,提问作者Rosaline

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:35:21