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

使用strsep()读取文本文件时出现空行/空字符问题

解决C语言读取数字文件时strsep()空行/空字符问题

嘿,我来帮你搞定这个问题!你目前的代码只完成了文件打开的基础部分,还没实现核心的行读取和数字分割逻辑,而且strsep()确实容易在处理空行、连续分隔符时返回空指针,导致输出异常。咱们一步步来完善代码并解决这个问题。

问题分析

  1. 你的代码缺少逐行读取文件的逻辑,也没处理写入文件的操作;
  2. strsep()会修改原字符串,直接用读取到的行数组会破坏原始数据;
  3. 遇到空行、连续空格/制表符时,strsep()会返回空字符串,不处理的话就会输出空行。

完整解决方案代码

下面是补全并优化后的代码,包含空行处理、正确分割数字、控制台打印+文件写入的功能:

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

#define SIZE 100  // 适当调大缓冲区,避免单行内容过长溢出

// 辅助函数:去除字符串首尾的空白字符(空格、制表符、换行等)
char* trim_whitespace(char* str) {
    // 跳过开头所有空白
    while (isspace((unsigned char)*str)) str++;
    if (*str == '\0') return str;

    // 从末尾向前跳过空白
    char* end = str + strlen(str) - 1;
    while (end > str && isspace((unsigned char)*end)) end--;

    // 添加字符串结束符
    end[1] = '\0';
    return str;
}

int main() {
    char line[SIZE];
    FILE *fileRead, *fileWrite;
    char *token, *temp_str;

    // 打开读取文件
    fileRead = fopen("/Users/USER/Documents/readfile.txt", "r");
    if (fileRead == NULL) {
        perror("无法打开读取文件");  // perror能输出更详细的错误原因
        return EXIT_FAILURE;
    }

    // 打开写入文件(不存在则创建,存在则覆盖)
    fileWrite = fopen("/Users/USER/Documents/writefile.txt", "w");
    if (fileWrite == NULL) {
        perror("无法打开写入文件");
        fclose(fileRead);  // 出错时记得关闭已打开的文件
        return EXIT_FAILURE;
    }

    // 逐行读取文件内容
    while (fgets(line, SIZE, fileRead) != NULL) {
        // 去掉fgets读取到的换行符
        line[strcspn(line, "\n")] = '\0';

        // 去除首尾空白,判断是否为空行
        char* trimmed_line = trim_whitespace(line);
        if (strlen(trimmed_line) == 0) {
            continue;  // 空行直接跳过,不处理
        }

        // 复制字符串:strsep会修改原字符串,所以用临时副本避免破坏原数组
        temp_str = malloc(strlen(trimmed_line) + 1);
        if (temp_str == NULL) {
            perror("内存分配失败");
            break;
        }
        strcpy(temp_str, trimmed_line);

        // 定义分隔符:这里用空格和制表符,可根据你的文件格式调整(比如加逗号",")
        char* delimiters = " \t";
        // 循环分割字符串
        while ((token = strsep(&temp_str, delimiters)) != NULL) {
            // 跳过分割出来的空字符串(比如连续空格导致的)
            if (strlen(token) == 0) {
                continue;
            }
            // 打印到控制台
            printf("%s\n", token);
            // 写入到目标文件
            fprintf(fileWrite, "%s\n", token);
        }

        free(temp_str);  // 记得释放临时字符串的内存
    }

    // 关闭所有打开的文件
    fclose(fileRead);
    fclose(fileWrite);

    printf("处理完成!\n");
    return EXIT_SUCCESS;
}

关键细节说明

  • 空行处理:通过trim_whitespace函数去除行首尾空白后,判断长度是否为0,是空行就直接跳过;
  • strsep()的正确用法:必须用字符串的副本,因为strsep会修改传入的指针,破坏原始数据;
  • 跳过空token:遇到连续分隔符时,strsep会返回空字符串,这时候跳过就能避免输出空行;
  • 错误处理:添加了perror输出详细错误信息,并且在打开文件失败时及时关闭已打开的资源,避免内存泄漏。

如果你的数字文件用其他分隔符(比如逗号、分号),只需要修改delimiters变量即可,比如改成" ,;\t"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:24:44