C语言读取大行数TXT文件无输出问题求助
问题排查与修复
核心问题分析
你的代码存在几个致命问题,导致读取大文件时失效:
- 数组容量不足:
char str[101][101]最多只能存储100行数据(索引0到100),读取4000行时会直接触发数组越界,破坏程序内存结构,导致无输出甚至崩溃。 - 错误的循环终止条件:
while (!feof(fin))是C语言读取文件的典型错误——feof只有在读取操作尝试越过文件末尾后才会置位,这会导致循环多执行一次,且当读取失败时(比如数组满了)仍会继续递增count,最终遍历非法内存。 - 未检查文件打开状态:如果
fopen失败(比如文件不存在、权限不足),fin会是NULL,后续操作直接触发未定义行为。
修复后的代码
#include <stdio.h> #include <stdlib.h> #define MAX_LINES 4000 // 适配4000行的需求 #define LINE_LEN 101 int main() { char str[MAX_LINES][LINE_LEN]; FILE *fin = fopen("test.txt", "r"); // 必须检查文件是否打开成功 if (fin == NULL) { printf("无法打开文件\n"); return 1; } int count = 0; // 用fscanf的返回值判断是否读取成功,避免feof的问题 while (count < MAX_LINES && fscanf(fin, "%s", str[count]) == 1) { count++; } fclose(fin); for (int i = 0; i < count; i++) { printf("%s\n", str[i]); } return 0; }
额外优化建议
- 如果不确定文件行数,建议使用动态内存分配(比如
malloc)来避免数组大小限制。 - 如果每行可能包含空格,不要用
%s,改用fgets读取整行,处理更灵活:while (count < MAX_LINES && fgets(str[count], LINE_LEN, fin) != NULL) { // 去掉fgets自带的换行符(可选) char *newline = strchr(str[count], '\n'); if (newline) *newline = '\0'; count++; }
内容的提问来源于stack exchange,提问作者Ayu Sekar
相关产品推荐
相关产品推荐

