使用strsep()读取文本文件时出现空行/空字符问题
解决C语言读取数字文件时strsep()空行/空字符问题
嘿,我来帮你搞定这个问题!你目前的代码只完成了文件打开的基础部分,还没实现核心的行读取和数字分割逻辑,而且strsep()确实容易在处理空行、连续分隔符时返回空指针,导致输出异常。咱们一步步来完善代码并解决这个问题。
问题分析
- 你的代码缺少逐行读取文件的逻辑,也没处理写入文件的操作;
strsep()会修改原字符串,直接用读取到的行数组会破坏原始数据;- 遇到空行、连续空格/制表符时,
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
相关产品推荐
相关产品推荐

