为什么c中的fscanf读取csv文件错误?

zaqlnxep  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(263)

我正在制作一个世界杯球队的链接列表,当加载球队时,我需要从csv文件中预加载阅读数据,但读取2个单词的国家会出错
比如说
假设这是csv文件:

Arabia Saudita, Herve, Renard, Salman, C, 0, 1

首先,我读取了国家名称、dt名称、船长名称、组和两个数值,它们是程序的一部分,但输出如下所示:

Country:Arabia DT:Saudita Herve Renard Salman C 0 1 Captain: empty Group:Empty

预期输出为
国家:阿拉伯Saudita Dt姓名:埃尔韦Dt姓氏:Renard船长姓名:Salman集团:C语言
我试着用txt文件来做,但它是一样的,因为它读取空格,程序失败或打印错误
这是代码失败的一部分

FILE *chargue = fopen("Precharge.csv", "r");
    
    while (!feof(charge)) {
        fscanf(charge, "%s\n", countryAux);
        chargecountry(&team, countryAux);
    
        fscanf(charge, "%s\n", nameDTAux);
        fscanf(charge, "%s\n", surnameDTAux);
        chargenameDT(&team, surnameDTAux, nameDTAux);
    
        chargeCapitan(&team, nameCapaux);
    
        fscanf(charge, "%c\n", &groupAux);
        chargegropu(&team, groupAux);
    
        fscanf(charge, "%d\n", &actualscoreaux);
        chargeactualscore(&team, actualscoreaux);
    
        fscanf(charge, "%d\n", &faseActualaux);
        chargeFase(&team, faseActualaux);
    
        insert(lis, team);
        forwards(lis);
    }
py49o6xq

py49o6xq1#

您的格式字串会剖析单字,而且不会在,分隔符号处停止。
不建议使用fscanf()解析csv文件(或任何文件),因为很难从错误中恢复,并且换行符与其他白色字符几乎无法区分。此外,使用while (!feof(charge))运行此循环是不正确的。
你可以学习Why is “while( !feof(file) )” always wrong?,你应该告诉你的老师这一点。这是一个常见的错误使用feof()为这个目的。
您应该改为使用fgets()一次读取一行,并使用%nnn[^,]转换说明符来解析字符字段(nnn是最大字段长度)。
以下是一个示例:

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

int main() {
    char buf[256];
    char countryAux[100];
    char nameDTAux[100];
    char surnameDTAux[100];
    char groupAux;
    int actualscoreaux, faseActualaux;
    ... // declare team, lis...

    FILE *chargue = fopen("Precharge.csv", "r");
    if (chargue == NULL) {
        fprintf(stderr, "cannot open %s: %s\n", "Precharge.csv",
                strerror(errno));
        return 1;
    }
    
    while (fgets(buf, sizeof buf, chargue)) {
        if (sscanf(buf, "%99[^,],%99[^,],%99[^,], %c ,%d ,%d",
                   countryAux, nameDTAux, surnameDTAux,
                   &groupAux, &actualscoreaux,&faseActualaux) == 6) {
            chargecountry(&team, countryAux);
            chargenameDT(&team, surnameDTAux, nameDTAux);
            chargeCapitan(&team, nameCapaux);
            chargegropu(&team, groupAux);
            chargeactualscore(&team, actualscoreaux);
            chargeFase(&team, faseActualaux);
            insert(lis, team);
            forwards(lis);
        } else {
            printf("invalid record: %s", buf);
        }
    }
    fclose(chargue);
    return 0;
}

相关问题