C语言如何读取文本文件并将内容存入字符串数组
读取字典文件到二维字符数组的修正实现
原代码存在的核心问题
- 误用
feof()作为循环判断条件:feof()仅在读取操作真正遇到文件末尾后才会置位EOF标记,直接将其作为while循环判断条件,会多执行一次循环体,极端情况下还会因为操作空指针导致程序崩溃 - 缺少文件打开失败的校验:
fopen()在路径错误、权限不足等场景下会返回NULL,不做判断直接操作文件指针会直接触发程序异常 - 遗漏了标准库头文件引用、文件关闭操作,循环体内没有实际的读取和存储逻辑
- 存在缓冲区越界风险:没有限制单次读取的字符串长度,容易把15长度的数组写溢出
适配场景的修正代码
结合给定约束(共999个单词、单字长度不超过15字符),可以按照边界安全的原则实现读取逻辑:
#include <stdio.h> #include <string.h> #define MAX_WORD_COUNT 999 #define MAX_WORD_LENGTH 15 int main(int argc, char** argv) { char dict[MAX_WORD_COUNT][MAX_WORD_LENGTH]; FILE *fp; int current_word_idx = 0; fp = fopen("dictionary.txt", "r"); // 校验文件打开状态,失败时打印系统错误提示 if (fp == NULL) { perror("无法打开目标文件"); return -1; } // 循环读取,直到读满数组容量或文件读取结束 while (current_word_idx < MAX_WORD_COUNT) { // 限制最多读取14个有效字符,预留1个位置存字符串结束符\0,避免越界 // fscanf返回值为成功匹配的参数数量,返回1代表成功读入一个完整单词 if (fscanf(fp, "%14s", dict[current_word_idx]) != 1) { break; } current_word_idx++; } fclose(fp); // 操作完成后主动关闭文件流 return 0; }
关键注意点
- 读取格式用
%14s而非%15s:因为C语言的字符串必须以\0作为结束标记,长度为15的字符数组最多存放14个有效单词字符,否则会出现内存越界 - 不要依赖
feof()做循环判断:通过读取函数的实际返回值判断是否成功读入内容,是规避feof经典误用问题的最可靠方式 - 注意文件名拼写匹配:如果实际文件名为描述中拼写的
dictonary.txt,需要把fopen里的路径改成对应名称,否则会触发文件打开失败
内容的提问来源于stack exchange,提问作者Kazumi411
相关产品推荐
相关产品推荐

