我正在尝试使用fscanf读取.csv文件

我正在尝试使用fscanf读取.csv文件,c,C,我试图从csv文件中读取,但输出不是我所期望的 输出如下: |1| |Dummy,Person| || |2| |Dummy,Person| || |3| |Dummy,Person| || |4| |Dummy,Person| || 我希望它是: |1| |Dummy| |Person| |2| |Dummy| |Person| |3| |Dummy| |Person| |4| |Dummy| |Person| 我该怎么办?代码如下: struct Person {

我试图从csv文件中读取,但输出不是我所期望的 输出如下:

|1| |Dummy,Person| || 
|2| |Dummy,Person| || 
|3| |Dummy,Person| || 
|4| |Dummy,Person| ||     
我希望它是:

|1| |Dummy| |Person| 
|2| |Dummy| |Person| 
|3| |Dummy| |Person| 
|4| |Dummy| |Person| 
我该怎么办?代码如下:

struct Person {
    int id;
    char firstname[50];
    char lastname[50];
} Person;

void loadPersonInfo(FILE *fp) {
    int knt;
    int id;

    for (knt = 1; knt < 5; knt++) {
        struct Person new_person;
        char firstname[50];
        char lastname[50];

        fscanf(fp, "%d , %s ,%s ", &id, firstname, lastname);

        strcpy(new_person.firstname, firstname);
        strcpy(new_person.lastname, lastname);
        new_person.id = id;
        People[knt] = new_person;
        printf("|%d| |%s| |%s| \n", People[knt].id, People[knt].firstname,
               People[knt].lastname);
    }
}

void readFile() {
    printf("Reading Data From People.csv File.\r\n ");
    FILE *fp;
    fp = fopen("People.csv", "r");
    if (fp == NULL) {
        printf("File could not be opened \r\n");
    } else {
        loadPersonInfo(fp);
    }
    fclose(fp);
    printf("Done!\r\n");
}
struct-Person{
int-id;
charfirstname[50];
char lastname[50];
}人;
void loadPersonInfo(文件*fp){
int knt;
int-id;
对于(knt=1;knt<5;knt++){
结构人-新人;
charfirstname[50];
char lastname[50];
fscanf(fp、%d、%s、&id、firstname、lastname);
strcpy(新的\u person.firstname,firstname);
strcpy(new_person.lastname,lastname);
new_person.id=id;
人[knt]=新人;
printf(“|%d | |%s | |%s | \n”,人物[knt].id,人物[knt].firstname,
人物[knt]。姓氏);
}
}
void readFile(){
printf(“从People.csv文件读取数据。\r\n”);
文件*fp;
fp=fopen(“People.csv”,“r”);
如果(fp==NULL){
printf(“无法打开文件\r\n”);
}否则{
loadPersonInfo(fp);
}
fclose(fp);
printf(“完成!\r\n”);
}

因为
%s
没有在
上停止。它在第一个非空白字符上停止。因此,scanf中的第一个
%s
将读取该行,直到换行符,包括
和第二个字段

%[^,]
将在第一个
时停止。确保检查
fscanf
中的返回值。在未指定最大宽度的情况下,不要使用
%s
%[
,以防止溢出错误

int ret = fscanf(fp, "%d,%49[^,],%49[^\n]", &id, firstname, lastname);
if (ret != 3) { 
      // AAaaa! error
      abort();
}

对于(knt=1;knt<5;knt++)


请注意,数组是从0索引的,而不是从1索引的。

您的意思是
struct
字段的分配顺序错误吗?我对fscanf一无所知,只知道
%d,%s,%s中的间距如果CSV文件中没有示例行,
看起来可疑。因为
%s
不是在
上停止,而是在第一个非空白字符上停止。A
%[^,]
将在
上停止。检查
fscanf
@Ma'mounothman的返回值,它应该像我在问题中提到的那样输出,但是它使用firstname和lastname,中间加上逗号。我不明白为什么我没有得到我想要的输出。顺便说一句,我对c语言不熟悉。谢谢你的回答。我我会尝试一下,然后再给你回复。第二个
%49[^,]
将使用该行的其余部分、换行符和下一条记录的id。格式应为
%d、%49[^,]、%49[^\n]%*1[\n]“
。还提示空字段将导致转换失败…
fscanf()
是这项工作的快速解决方案,有许多怪癖和限制。错误恢复也非常有限。