fscanf无法正确阅读输入的问题

8yoxcaq7  于 2023-01-20  发布在  其他
关注(0)|答案(1)|浏览(124)

我在使用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;   
}
jv2fixgn

jv2fixgn1#

您的代码中有很多问题。下面的版本可能会有所帮助。此版本中的错误消息远非理想(例如,这没有区分输入格式错误和阅读数据错误,也没有提供关于错误位置的很多细节),并且仍然存在关于某些输入的未定义行为的可能性,(参见Is scanf("%d", ...) as bad as gets?)但这应该为您指出正确的方向,嗯,至少它可能有助于改进您对scanf的使用,但可以提出一个非常合理的论点,即“正确的方向”是完全停止使用scanf,用scanf做对事情是非常困难的,尝试这样做会比仅仅使用fgets复杂得多。但是对于简单的用例来说,使用scanf仍然是毫无意义的。请参见http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html和许多其他资源,这些资源解释了为什么scanf是一个糟糕的选择。

#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];
};

int
read(FILE * f, struct houseData *h)
{
        return 9 == fscanf(f, " %100[^;]; %100[^;]; %d; %d; %d; %d; "
                "%100[^;]; %d; %100[^\n]", h->loc1, h->loc2, &h->price,
                 &h->rooms, &h->bathroom, &h->carpark, h->type, &h->area,
                 h->furnish);
}

int
main(int argc, char **argv)
{
        int rv;
        FILE *f = argc > 1 ? fopen(argv[1], "r") : stdin;
        if( f == NULL ){
                perror(argv[1]);
                return EXIT_FAILURE;
        }
        struct houseData h;
        int i = 0;
        while( read(f, &h) ){
                printf("%d: %s %s %d %d %d %d %s %d %s\n", ++i,
                         h.loc1, h.loc2, h.price, h.rooms, h.bathroom,
                         h.carpark, h.type, h.area, h.furnish);
        }
        if( ! feof(f) ){
                fprintf(stderr, "Error near line %d\n", i);
        }
        fclose(f);
}

相关问题