簡體   English   中英

使用fscanf多個值讀取C

[英]Reading in C using fscanf multiple values

來自以下格式的文本文件:

Name Surname ID Address
Name Surname ID Address
Name Surname ID Address

我需要提取每個變量並將其放入變量中。

我嘗試了以下兩種方法:

while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        &name2, &surname2, &id2, &address2);
}

這給了我錯誤的結果,它每行只讀取一個單詞,所以結果是這樣的:

Name: Name Surname:@,a ID:2272012 Address: ?"
Name: Surname Surname:@,a ID:2272012 Address: ?"
Name: ID Surname:@,a ID:2272012 Address: ?"
Name: Address Surname:@,a ID:2272012 Address: ?"

我使用的另一種方法是:

while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) == 4){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        &name2, &surname2, &id2, &address2);
}

它什么也沒讀,什么也沒發生。

我正在讀取的文件是.dat,用於分配作業,因此只能使用.dat。

  • 除非數據中沒有逗號,否則您不應該在格式字符串中使用逗號。
  • 如果任何字段包含空格,則此操作將無效,因為%s將停止。
  • 您需要顯示更多輸入的.dat文件。
  • 通常最好使用fgets()閱讀整行, 然后再擔心解析它。

您聲明文本文件的格式為:

string<space>string<space>numeric<space>string<newline>

如果正確,則格式字符串必須完全匹配:

strings
 |  |  numeric
 |  |  |  +-----string
 |  |  |  | +---newline
 V  V  V  V V
"%s %s %d %s\n"
   ^  ^  ^
   |  |  |
   spaces

假設每個string字段都是一個ASCII值塊,沒有空格/制表符等。您的代碼缺少定義變量的方式,大概是這樣的:

char name2[100] = {0};
char surname2[100] = {0};
int id2 = 0;
char address2[100] = {0};

在這種情況下,您不需要在fscanf字符串中使用&開頭。 因此,給定一個輸入文件:

首先發射1234 somebody@something.com
秒,但22352 goo@gle.com
他們哈哈9999 nice@lly.com

以及上面的變量declairactions,下面的代碼:

FILE * fp;
fp = fopen("test.txt", "r");
while(fscanf(fp, "%s %s %d %s\n", name2, surname2, &id2, address2) == 4) 
    printf("name: %s %s, id: %d, address %s\n", name2, surname2, id2, address2);

fclose(fp);

正確讀取/顯示值。

首先,從printf變量中刪除&

printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        name2, surname2, id2, address2);

如果您輸入的txt文件中的字段之間的分隔符是逗號,

Name,Surname , ID ,Address
Name ,Surname,ID,Address
Name,Surname,ID,Address

然后在fscanf使用以下字符串格式

while(fscanf(fp, " %[^, ] , %[^, ] , %d , %[^\n]", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        name2, surname2, id2, address2);
}

如果輸入txt文件中字段之間的分隔符為空格

Name Surname ID Address
Name Surname ID Address
Name Surname ID Address

然后在fscanf使用以下字符串格式

while(fscanf(fp, " %s %s %d %[^\n]", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        name2, surname2, id2, address2);
}
while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        &name2, &surname2, &id2, &address2);
}

我認為這是錯誤所在:

它應該是:

while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        name2, surname2, id2, address2);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM