C语言CSV类文本处理问题:Windows输出异常,Linux正常
C语言字符串分割跨平台问题修复
问题根源
- 分割位置计算错误:这是Linux下第二列多0、列偏移的核心原因。代码里的段起始位置逻辑错误——跳过首字符后,
gp1取了s+1开始的8个字符,gp2应该从s+1+8 = s+9开始,而非s+8,后续段也需依次顺延,否则会和前一段重叠,导致多0和偏移问题。 - 换行符未处理:Windows/WSL的换行符是
\r\n,Linux是\n,fgets会把这些换行符读进字符串,strlen计算长度时会包含它们,导致长度判断出错,s[28]=0的截断操作也会乱切有效字符,引发输出混乱。 - 输出文件未做打开检查:原代码打开输出文件时未判断返回值,若遇到权限不足或路径错误,程序会默默出错,输出文件要么无法生成要么内容混乱。
修复步骤
- 修正分割偏移:按「首字符后取8个,接着连续取5组4个」的规则,重新计算每个段的起始位置,确保段与段之间连续无重叠。
- 清除换行符:把字符串中的
\n和\r替换为终止符,避免干扰长度判断和内容处理。 - 增加输出文件检查:添加判断逻辑,若输出文件打开失败则报错并终止,避免无意义执行。
- 手动添加字符串终止符:虽然初始化数组时已清0,但手动添加终止符能避免极端情况下的字符串截断问题。
修改后的代码
#include <stdio.h> #include <string.h> #include <stdlib.h> const int MAX_LINES = 10000000; char s[1000]; int lines; FILE *fptrIn, *fptrOut; void convertData(char *s) { char gp1[9] = {0}; // 8个字符+终止符 char gp2[5] = {0}; //4个字符+终止符 char gp3[5] = {0}; char gp4[5] = {0}; char gp5[5] = {0}; char gp6[5] = {0}; // 修正偏移:跳过首字符后,按8、4、4、4、4、4的长度分割 strncpy(gp1, s + 1, 8); gp1[8] = '\0'; strncpy(gp2, s + 9, 4); // 1+8=9 gp2[4] = '\0'; strncpy(gp3, s + 13, 4); //9+4=13 gp3[4] = '\0'; strncpy(gp4, s + 17, 4); //13+4=17 gp4[4] = '\0'; strncpy(gp5, s + 21, 4); //17+4=21 gp5[4] = '\0'; strncpy(gp6, s + 25, 4); //21+4=25 gp6[4] = '\0'; fprintf(fptrOut, "%s;%s;%s;%s;%s;%s\n", gp1, gp2, gp3, gp4, gp5, gp6); } int main() { if ((fptrIn = fopen("test.txt", "r")) == NULL) { perror("打开输入文件失败"); return 1; } if ((fptrOut = fopen("testout1.txt", "w")) == NULL) { perror("打开输出文件失败"); fclose(fptrIn); return 1; } fprintf(fptrOut, "Position;Sens1;Sens2;Sens3;Check;Time\n"); while(fgets(s, sizeof s, fptrIn) != NULL) { lines++; // 移除换行符(处理Windows/Linux差异) char *nl = strchr(s, '\n'); if (nl) *nl = '\0'; nl = strchr(s, '\r'); if (nl) *nl = '\0'; // 需要至少29个字符:首字符+8+4*5=28个有效分割字符 if (strlen(s) < 29) { fprintf(stderr, "第%d行:长度不够,跳过\n", lines); continue; } printf("第%d行:\n%s\n", lines, s); convertData(s); if (lines == MAX_LINES) { break; } } fclose(fptrIn); fclose(fptrOut); return 0; }
修复后效果
- Linux环境:第二列不再多0,各列分割完全符合预期。
- Windows/WSL环境:换行符被正确处理,文件打开失败会明确提示,输出内容不再混乱。
内容的提问来源于stack exchange,提问作者Moujan
相关产品推荐
相关产品推荐

