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

C语言读取大行数TXT文件无输出问题求助

问题排查与修复

核心问题分析

你的代码存在几个致命问题,导致读取大文件时失效:

  1. 数组容量不足:char str[101][101] 最多只能存储100行数据(索引0到100),读取4000行时会直接触发数组越界,破坏程序内存结构,导致无输出甚至崩溃。
  2. 错误的循环终止条件:while (!feof(fin)) 是C语言读取文件的典型错误——feof只有在读取操作尝试越过文件末尾后才会置位,这会导致循环多执行一次,且当读取失败时(比如数组满了)仍会继续递增count,最终遍历非法内存。
  3. 未检查文件打开状态:如果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:35:27