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

C语言遍历缓冲区数据 提取dat文件音频通道列写入失败求助

代码核心问题

  • 写入逻辑完全错位:你在读取每一行、成功解析到第二列值b的时候,就应该直接把b写入输出文件,而不是等全部读完文件之后,错误地遍历变量bufferLength的地址写入。你后段for循环的逻辑完全不符合需求,fputs(&bufferLength, outfp)是严重错误用法:fputs要求传入C风格字符串的首地址,你传入int类型变量的地址,既会输出乱码,也完全和你要存的第二列数据无关。
  • 输出文件打开失败后没有终止程序,后续仍执行写入操作会触发未定义行为。
  • 可变长度数组char buffer[bufferLength]存在兼容性问题,并非所有C编译器都支持该语法。

修正后代码

#include <stdio.h>

int main(){
    double a = 0;
    double b = 0;
    // 固定缓冲区大小,避免兼容性问题,单行长可自行调大
    const int BUFFER_SIZE = 4096;
    char buffer[BUFFER_SIZE];

    FILE *fp = fopen("original.dat", "r");
    if (!fp){
        printf("Cant open file\n");
        return -1;
    }

    FILE *outfp = fopen("out.dat", "w");
    if(outfp == NULL)
    {
        printf("Unable to create file\n");
        fclose(fp);
        return -1;
    }

    while(fgets(buffer, BUFFER_SIZE, fp)) {  
        if (2 == sscanf(buffer, "%lf %lf", &a, &b)){
            // 解析到第二列时直接写入输出文件,格式可按需调整
            fprintf(outfp, "%f\n", b);
            // 保留原调试打印
            printf("b: %f\n", b);
        }
    }
    // 可选:判断是否为读取错误导致循环终止
    if (ferror(fp)) {
        printf("Error reading original file\n");
        fclose(fp);
        fclose(outfp);
        return -1;
    }

    printf("File transferred\n");
    fclose(outfp);
    fclose(fp);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:45:03