如何使用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
相关产品推荐
相关产品推荐

