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

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;
}

代码解释

  1. 文件打开与错误处理:先用fopen()打开文件,并且检查是否成功打开,避免空指针错误。
  2. 逐行读取循环:while (fgets(text, R, file) != NULL)会持续读取每一行,直到文件结束。
  3. 去除换行符:strcspn(text, "\n")会找到换行符的位置,把它替换成字符串结束符\0,这样分割的时候不会把换行符当成内容的一部分。
  4. 逐行分割:每次处理新行时,重新调用strtok(text, ...)传入当前行的缓冲区,之后用strtok(NULL, ...)继续分割当前行的剩余内容,处理完当前行后,下一次循环会读取新的行,重新初始化strtok的状态,不会和上一行的分割冲突。

这个方案完全不需要预先知道行数或每行的字符串数量,逐行处理的方式也很节省内存,符合你的需求。

内容的提问来源于stack exchange,提问作者Konstantinos Loukaidis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:46:15