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

C语言读取CSV文件时while循环无法遍历全部数据行问题

问题原因

代码无法读取完整6行数据的核心问题有3个:

  1. 数据类型完全不匹配:test1.csv中存储的都是带小数的浮点数(如-3.000、0.9这类值),但定义的存储数组A是int整型,fscanf使用的%d格式符仅能读取整数,从第一行开始读取就会因匹配失败直接跳出循环,根本读不到有效数据。
  2. 缺少文件打开校验:如果文件路径输入错误、权限不足导致fopen执行失败,fp会是空指针,后续直接操作会触发程序崩溃。
  3. 缺少文件资源释放逻辑,读取完成后没有关闭文件句柄,会造成资源泄漏。
修正方案

按以下规则修改代码即可正常读取全部6行数据:

  • 将存储CSV数据的二维数组A的类型从int A[50][2]改为double A[50][2],适配浮点型数据存储
  • 将fscanf的读取格式符从%d改为%lf,匹配双精度浮点数的读取规则
  • 增加fopen返回值的空判断,打开失败时直接输出提示并退出程序
  • 读取完成后调用fclose(fp)关闭文件句柄
  • 补全main函数的标准返回值
修正后可运行代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main () {
    // 变量声明
    FILE *fp;
    int c=0;
    double poly;
    char file[100];
    double A[50][2]; // 改为double类型存储浮点数据

    // 输入多项式阶数
    printf("Please input a polynomial order (1-4): ");
    scanf("%lf",&poly);

    // 输入要打开的文件名
    printf("Please enter the name of the data file to open: ");
    scanf("%s",file);
    printf("\n");

    fp = fopen(file,"r");
    // 增加文件打开失败校验
    if (fp == NULL) {
        printf("Failed to open file %s\n", file);
        return 1;
    }

    // 逐行扫描存储文件内容,格式符改为%lf匹配浮点数
    while (fscanf(fp, "%lf,%lf,",&A[c][0],&A[c][1])==2) {
        c++;
        printf("reading line %d\n",c);
    }

    printf("Total data points (x,y) read from file: %d\n",c);

    // 关闭文件
    fclose(fp);
    return 0;
}
测试效果

用提供的test1.csv运行修正后的代码,会依次输出reading line 1到reading line 6,最后统计的有效数据点总数为6,和预期结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 08:15:35