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

C语言CSV类文本处理问题:Windows输出异常,Linux正常

C语言字符串分割跨平台问题修复

问题根源

  1. 分割位置计算错误:这是Linux下第二列多0、列偏移的核心原因。代码里的段起始位置逻辑错误——跳过首字符后,gp1取了s+1开始的8个字符,gp2应该从s+1+8 = s+9开始,而非s+8,后续段也需依次顺延,否则会和前一段重叠,导致多0和偏移问题。
  2. 换行符未处理:Windows/WSL的换行符是\r\n,Linux是\n,fgets会把这些换行符读进字符串,strlen计算长度时会包含它们,导致长度判断出错,s[28]=0的截断操作也会乱切有效字符,引发输出混乱。
  3. 输出文件未做打开检查:原代码打开输出文件时未判断返回值,若遇到权限不足或路径错误,程序会默默出错,输出文件要么无法生成要么内容混乱。

修复步骤

  1. 修正分割偏移:按「首字符后取8个,接着连续取5组4个」的规则,重新计算每个段的起始位置,确保段与段之间连续无重叠。
  2. 清除换行符:把字符串中的\n和\r替换为终止符,避免干扰长度判断和内容处理。
  3. 增加输出文件检查:添加判断逻辑,若输出文件打开失败则报错并终止,避免无意义执行。
  4. 手动添加字符串终止符:虽然初始化数组时已清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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:45:45