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
相关产品推荐
相关产品推荐

