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

如何在C语言中从文本文件读取输入?含fgets结合二维数组实现

Hey there! Let's break down your questions step by step and fix up that code you shared.

1. 如何在C语言中从文本文件读取输入?

C语言提供了几种常用函数来读取文本文件,各有适用场景:

  • fgetc():逐个读取文件中的字符,每次调用返回一个字符,直到遇到文件结束符(EOF)。适合需要逐字符处理的场景,比如统计字符数、替换特定字符。示例:
    int c;
    FILE *fptr = fopen("example.txt", "r");
    if (fptr != NULL) {
        while ((c = fgetc(fptr)) != EOF) {
            putchar(c); // 输出读取到的字符
        }
        fclose(fptr);
    }
    
  • fscanf():按照指定格式读取数据,比如读取整数、浮点数、字符串。适合读取结构化的文本数据,但它会自动跳过空白字符(空格、换行、制表符),读取字符串时会在遇到空白字符时停止。示例:
    char name[50];
    int age;
    FILE *fptr = fopen("data.txt", "r");
    if (fptr != NULL) {
        fscanf(fptr, "%s %d", name, &age); // 读取名字和年龄
        printf("Name: %s, Age: %d\n", name, age);
        fclose(fptr);
    }
    
  • fgets():读取整行文本(包括换行符),直到遇到换行符、达到指定最大字符数或文件结束。它能一次性读取一行,是处理多行文本的首选方法,还能避免缓冲区溢出(只要数组大小设置合理)——这也是你第二个问题要用到的方法。
2. 使用fgets()结合二维数组实现从文本文件读取输入

先提个关键问题:你提供的代码里用了fopen(fname, "w"),这个是写入模式,会清空文件内容甚至创建新文件,根本没法读取!我们要改成"r"模式(只读模式)才能读取文件内容。

下面是修改并完善后的完整代码,附带详细注释:

#include <stdio.h>
#include <stdlib.h>

int main() { 
    // 二维数组:最多存储1000行,每行最多999个字符+1个结束符'\0'
    char text[1000][1000]; 
    FILE *fptr; 
    char fname[100]; 
    int line_count = 0; // 记录读取的行数

    printf("input file name: "); 
    scanf("%s", fname); 

    // 以只读模式打开文件
    fptr = fopen(fname, "r"); 
    if (fptr == NULL) { 
        printf("Error in opening file\n"); 
        exit(1); // 退出程序,返回错误码1
    } 

    // 逐行读取文件,直到fgets返回NULL(文件末尾或读取错误)
    while (fgets(text[line_count], sizeof(text[line_count]), fptr) != NULL) {
        line_count++;
        // 防止数组越界:如果超过1000行就停止
        if (line_count >= 1000) {
            printf("Warning: Reached maximum line limit (1000 lines)\n");
            break;
        }
    }

    // 验证读取结果:输出所有读取到的行
    printf("\n--- Read %d lines from file ---\n", line_count);
    for (int i = 0; i < line_count; i++) {
        printf("%s", text[i]);
    }

    // 记得关闭文件!释放系统资源
    fclose(fptr);
    return 0;
}

代码关键点说明:

  • 二维数组text:第一维代表行号,第二维存储每行的文本内容,这样可以把每一行单独存在一个数组元素里,方便后续处理。
  • fgets()参数:text[line_count]是当前要存储行的数组地址,sizeof(text[line_count])指定了每行最多读取的字符数(这里是1000,包含结束符),fptr是文件指针。
  • 数组越界防护:添加了line_count >= 1000的判断,避免因为文件行数过多导致数组溢出,引发程序崩溃。
  • 关闭文件:使用fclose(fptr)关闭文件,释放系统资源,这是必须的操作,否则可能会导致资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:50:32