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,提问作者김민겸
相关产品推荐
相关产品推荐

