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

C语言读取分号分隔CSV文件失败,请求技术帮助

问题描述

我有如下格式的测量数据:

40.0095;34.0;;0.065058;;392;300;;;;;;;;;;; 40.0242;;14.8;;;;;;392;300;400;300;20.0;0.0;0.0;-0.0;0.3;-0.3;1444;1494;392.9;18.6;299.7;-4.4

以此类推。我尝试用fscanf读取该文件,但无法正确读取数值,结果全是0.0。以下是我的代码:

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

double t_abs[700] ;
double t_nxtSIO[700] ;

int main( )
{
    FILE *filePointer ;
    
    filePointer = fopen("BallPlateLogData.txt", "r") ;

    if ( filePointer == NULL )
    {
        printf( "file failed to open." ) ;
    }
    else
    {
        int read = 0 ;
        int line = 0 ;
        
        printf("The file is now opened.\n") ;
        
        do{

        if (line != 0)
        {
            read = fscanf(filePointer,
                           "%lf[^;], %lf[^;]\n",
                            t_abs[line],
                            t_nxtSIO[line]) ;
        }

        line++ ;

        if (ferror(filePointer))
        {
            printf("Error reading file\n");
            return 1 ;
        }

        fclose(filePointer) ;
    
    printf("%0.1f\n", t_abs[line]) ;

    } while (!feof(filePointer)) ;
   
    }

    return 0;   
}

这段代码无法正常工作,求帮忙!


问题分析与修复

你的代码存在多个关键问题,导致无法正确读取数据:

1. fscanf格式字符串错误

你写的%lf[^;], %lf[^;]\n是错误的格式:

  • %lf是浮点数格式说明符,不能直接和[^;]扫描集拼接,正确写法应为%lf;%lf——因为你的数据用分号分隔,fscanf会自动匹配分号并读取后续浮点数。
  • 格式中的逗号是多余的,你的数据分隔符是分号,不是逗号。

2. 未传递变量地址给fscanf

fscanf需要接收变量的指针来存储读取到的值,你直接传入t_abs[line]和t_nxtSIO[line]是值传递,无法将数据写入数组。必须改成&t_abs[line]和&t_nxtSIO[line]。

3. 循环与文件操作逻辑混乱

  • 在do-while循环的第一次迭代中,你直接调用了fclose(filePointer),导致后续循环无法再读取文件(文件已关闭)。文件关闭操作应该放在循环结束后执行。
  • feof的使用逻辑错误:!feof(filePointer)不能作为循环的判断条件,应该在读取操作完成后检查是否成功读取。
  • 打印t_abs[line]时,line已经自增,此时访问的是未赋值的数组元素,自然输出0.0。

4. 冗余头文件

代码中包含了<string.h>但并未使用,可直接删除。

修复后的代码

#include <stdio.h>

double t_abs[700];
double t_nxtSIO[700];

int main()
{
    FILE *filePointer = fopen("BallPlateLogData.txt", "r");

    if (filePointer == NULL)
    {
        printf("file failed to open.\n");
        return 1;
    }

    printf("The file is now opened.\n");
    
    int line = 0;
    // 循环读取前两个分号分隔的浮点数,直到读取失败或数组满
    while (fscanf(filePointer, "%lf;%lf", &t_abs[line], &t_nxtSIO[line]) == 2)
    {
        // 打印已读取的有效值
        printf("t_abs[%d]: %.4f\n", line, t_abs[line]);
        printf("t_nxtSIO[%d]: %.1f\n", line, t_nxtSIO[line]);
        line++;
        
        // 防止数组越界
        if (line >= 700)
        {
            printf("Array is full, stopping read.\n");
            break;
        }
    }

    // 检查读取过程中是否出现错误
    if (ferror(filePointer))
    {
        printf("Error reading file\n");
        fclose(filePointer);
        return 1;
    }

    fclose(filePointer);
    return 0;
}

额外说明

如果数据行中存在连续分号(如;;)的空字段,上述代码仍能正常读取前两个数值,因为fscanf会自动跳过匹配过程中的空白和无效分隔符。如果需要读取后续字段,可扩展格式字符串,例如%lf;%lf;;%lf来读取第三个非空字段。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:27:38