C语言读取未知行数文本文件并分割字符串问题求助
解决C语言读取多行文本并分割字符串的问题
嘿,我明白你的困扰了——当前代码只调用了一次fgets(),所以只能读取文件的第一行,自然没法处理后续内容。而且你不想用数组存储所有行,完全没问题,我们可以用逐行循环读取+逐行分割的方式来实现,完全不需要预先分配大数组。
问题根源
你现在的代码只执行了一次fgets(text, R, file);,这意味着程序只会从文件里读取一行内容,之后就直接进入分割逻辑了,后续的行根本没机会被读取。
解决思路
核心就是用一个循环持续调用fgets(),直到它返回NULL(表示已经读到文件末尾)。每次读取到一行后,就用strtok()对这一行进行分割处理,处理完当前行再读取下一行,这样就能覆盖所有行数未知的文本了。
另外还要注意几个细节:
- 别忘了先打开文件!你原代码里没有
fopen()的调用,这会导致file指针是无效的,程序运行会崩溃。 - 你的文本里有括号
(),可以把它们也加入分割符集合,这样分割出来的内容会更干净。 fgets()会把换行符\n也读进text数组里,如果不想让换行符影响分割,可以手动把它替换成\0。
修改后的完整代码
#include <stdio.h> #include <string.h> #define R 1024 // 定义一个合适的缓冲区大小,根据你的需求调整 int main() { FILE *file = fopen("your_file.txt", "r"); // 替换成你的文件名 if (file == NULL) { perror("Failed to open file"); return 1; } char text[R]; char *splitter; // 循环读取每一行,直到文件末尾 while (fgets(text, R, file) != NULL) { // 去掉换行符(如果存在),避免影响分割 text[strcspn(text, "\n")] = '\0'; // 分割当前行的字符串 splitter = strtok(text, " ,.-;()"); // 加入括号作为分割符 while (splitter != NULL) { printf("%s\n", splitter); splitter = strtok(NULL, " ,.-;()"); } } fclose(file); // 别忘了关闭文件 return 0; }
代码解释
- 文件打开与错误处理:先用
fopen()打开文件,并且检查是否成功打开,避免空指针错误。 - 逐行读取循环:
while (fgets(text, R, file) != NULL)会持续读取每一行,直到文件结束。 - 去除换行符:
strcspn(text, "\n")会找到换行符的位置,把它替换成字符串结束符\0,这样分割的时候不会把换行符当成内容的一部分。 - 逐行分割:每次处理新行时,重新调用
strtok(text, ...)传入当前行的缓冲区,之后用strtok(NULL, ...)继续分割当前行的剩余内容,处理完当前行后,下一次循环会读取新的行,重新初始化strtok的状态,不会和上一行的分割冲突。
这个方案完全不需要预先知道行数或每行的字符串数量,逐行处理的方式也很节省内存,符合你的需求。
内容的提问来源于stack exchange,提问作者Konstantinos Loukaidis
相关产品推荐
相关产品推荐

