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

fscanf读取CSV文件异常求助:输出始终为空或0

问题分析与解决方案

你的代码存在多个核心问题,导致fscanf无法正确读取CSV数据,下面逐一拆解并修正:

1. 结构体成员类型定义错误

结构体中price、rooms、bathroom、carpark、area被定义为int数组,但CSV每一行对应单个数值,应该改为单个int变量。数组类型会导致内存地址匹配错误,读取和打印都出现异常。

错误定义:

int price[101];
int rooms[101];
// 其他int数组同理

正确定义:

int price;
int rooms;
// 其他int成员同理

2. 局部数组覆盖全局数组

read函数内重新定义了局部arr[800],读取的数据仅存于这个局部数组中,函数执行完毕后局部数组被销毁,全局arr根本没有被赋值,main函数打印的是空数据。

解决:删除read函数内的局部arr定义,直接使用全局数组。

3. feof循环的错误用法

while(!feof(f))会导致最后一次循环重复读取无效数据,因为feof只有在读取失败后才会被置位。正确的做法是通过fscanf的返回值判断是否成功读取了所有字段(本次需要读取9个字段,返回值应为9)。

4. fscanf参数传递错误

对于char数组类型的成员(如loc1、loc2),数组名本身就是首地址,不需要加&。错误的&arr[i].loc1会传递数组的地址(即指针的指针),导致fscanf写入错误地址。

5. main函数中未定义变量i

main函数中直接使用arr[i],但i是read函数的局部变量,main函数中未声明,属于未定义行为。需要在read函数中返回读取的条目数量,或者将i定义为全局变量,main函数用该值访问有效数据。

6. 文件打开未做错误检查

fopen可能因文件不存在、权限问题等失败,此时返回NULL,直接操作会导致程序崩溃。需要添加判断逻辑。


修正后的完整代码

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

// 修正结构体成员类型
struct houseData {
    char loc1[101];
    char loc2[101];
    int price;
    int rooms;
    int bathroom;
    int carpark;
    char type[101];
    int area;
    char furnish[101];
} arr[1001];

// 返回读取的条目数量
int read() {
    int i = 0;
    FILE *f = fopen("file.csv", "r");
    
    // 检查文件是否打开成功
    if (!f) {
        perror("无法打开文件");
        return -1;
    }

    // 用fscanf返回值判断读取是否成功
    while (fscanf(f, " %[^;];%[^;];%d;%d;%d;%d;%[^;];%d;%[^\n]",
                  arr[i].loc1, arr[i].loc2, &arr[i].price, &arr[i].rooms,
                  &arr[i].bathroom, &arr[i].carpark, arr[i].type, &arr[i].area, arr[i].furnish) == 9) {
        i++;
        // 跳过CSV中的空行(如果有)
        fscanf(f, "\n");
    }

    fclose(f);
    return i; // 返回读取的条目数
}

int main() {
    int count = read();
    if (count == -1) {
        return 1;
    }

    // 打印所有读取的数据,或指定某一行
    for (int j = 0; j < count; j++) {
        printf("%s %s %d %d %d %d %s %d %s\n",
               arr[j].loc1, arr[j].loc2, arr[j].price, arr[j].rooms,
               arr[j].bathroom, arr[j].carpark, arr[j].type, arr[j].area, arr[j].furnish);
    }

    return 0;   
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:15:43