我在使用fscanf
函数时遇到问题。它从来没有正确读取它,并且总是导致空白。
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);
上面的代码总是输出“0 0 0 0 0”。但是当我尝试使用scanf并手动输入其中一行时,它工作得很完美。
它正在阅读的文件是一个.csv文件。下面是内容:
Mont-Kiara;Kuala-Lumpur;1000000;2;2;0;Built-up;1000;Partly
Cheras;Kuala-Lumpur;310000;3;2;0;Built-up;1000;Partly
Kepong;Kuala-Lumpur;358000;3;3;0;Built-up;1000;Partly
Taman-Desa;Kuala-Lumpur;455000;2;2;0;Built-up;1000;Partly
Kepong;Kuala-Lumpur;358000;3;3;0;Built-up;1000;Partly
Kepong;Kuala-Lumpur;358000;3;3;0;Built-up;1000;Partly
下面是完整的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct houseData {
char loc1[101];
char loc2[101];
int price[101];
int rooms[101];
int bathroom[101];
int carpark[101];
char type[101];
int area[101];
char furnish[101];
} arr[1001];
int read() {
int i = 0;
struct houseData arr[800];
char temp1[100];
FILE *f = fopen("file.csv", "r");
while(!feof(f)){
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);
i++;
}
fclose(f);
}
int main() {
read();
printf("%s %s %d %d %d %d %s %d %s", 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);
return 0;
}
1条答案
按热度按时间jv2fixgn1#
您的代码中有很多问题。下面的版本可能会有所帮助。此版本中的错误消息远非理想(例如,这没有区分输入格式错误和阅读数据错误,也没有提供关于错误位置的很多细节),并且仍然存在关于某些输入的未定义行为的可能性,(参见Is
scanf("%d", ...)
as bad asgets
?)但这应该为您指出正确的方向,嗯,至少它可能有助于改进您对scanf
的使用,但可以提出一个非常合理的论点,即“正确的方向”是完全停止使用scanf
,用scanf
做对事情是非常困难的,尝试这样做会比仅仅使用fgets
复杂得多。但是对于简单的用例来说,使用scanf
仍然是毫无意义的。请参见http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html和许多其他资源,这些资源解释了为什么scanf
是一个糟糕的选择。