You need to enable JavaScript to run this app. C语言如何读取文本文件并将内容存入字符串数组
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 02:06:04