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

