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

C语言用fgets读取文件:为何无法仅读取每行前5个单词?

问题原因与修正方案

你的代码之所以会输出文件全部内容,核心有两个错误:

  • 对fgets函数的参数理解错误:fgets的第二个参数是缓冲区的最大字节数,你传的5意味着每次最多读取4个字符(还要留1个位置存字符串结束符\0),这和“读取前5个单词”完全无关。循环里反复调用fgets会把文件内容按4字符分段读取并输出,最终就会把整个文件内容都打印出来。
  • 完全没有实现“单词识别”的逻辑:代码里根本没判断什么是“单词”(通常以空格、换行等空白字符分隔),自然无法只提取每行的前5个单词。

修正后的代码示例

要实现读取每行前5个单词的需求,需要先按行读取整行内容,再通过空白字符分割单词,提取前5个:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void) {
    char const* const fileName = "text.dat";

    FILE* file = fopen(fileName, "r");
    if (!file) {
        printf("\n无法打开文件: %s ", fileName);
        return -1;
    }

    char line[256]; // 用更大的缓冲区容纳整行内容
    while (fgets(line, sizeof(line), file)) {
        char* token = line;
        int wordCount = 0;
        
        // 跳过行首的空白字符
        while (isspace((unsigned char)*token)) {
            token++;
        }

        while (token && *token != '\0' && wordCount < 5) {
            // 输出当前单词
            while (*token != '\0' && !isspace((unsigned char)*token)) {
                putchar(*token);
                token++;
            }
            wordCount++;
            if (wordCount < 5) {
                putchar(' '); // 单词间加空格分隔
            }

            // 跳过单词间的空白字符
            while (isspace((unsigned char)*token)) {
                token++;
            }
        }
        putchar('\n'); // 每行结束换行
    }

    fclose(file);
    return 0;
}

代码说明

  • 先用fgets读取整行内容到足够大的缓冲区,确保能容纳一行的所有字符。
  • 使用isspace函数判断空白字符,实现单词的分割逻辑。
  • 计数读取到的单词,当达到5个时停止处理当前行,进入下一行。

内容的提问来源于stack exchange,提问作者김민겸

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:01:12