簡體   English   中英

fscanf 中的值丟失

[英]Values lossing in fscanf

我用的IDE是Clion。 我想讀取存儲在 .txt 文件中的行分隔數據。 每行包含名字、姓氏、性別、ID 和年齡,分別為 str、str、str、int 和 int。

學生名單.txt

Olivia SWANSON F 29001 20
Emma ONEILL F 7900 19

我嘗試使用fscanf來讀取數據。

FILE *fp;
char fname[20];
char sname[20];
char gender[1];
int ID;
int age;
fp = fopen("C:\\Users\\Catlover\\Desktop\\DSA\\Program2\\StudentList.txt", "r");
while(fscanf(fp, "%s %s %s %d %d", fname, sname, gender, &ID, &age)!= EOF)
{
    printf("%s,%s,%s,%d,%d\n", fname, sname, gender, ID, age);
}
fclose(fp);
return 0;

但是它返回的結果看起來有點奇怪,因為它不是 output 第二個值。

結果是

Olivia,,F,29001,20
Emma,,F,7900,19

令我震驚的是,在 PellesC 中運行相同的代碼會導致正確的結果。

我以前學過C++所以C里面可能有一些重要的規則但是我沒有注意到。 誰能給我看一下?

"%s"沒有寬度

切勿在沒有寬度的*scanf()中使用"%s"來指示要讀取和保存的非空白字符的最大數量。 回想一下,在讀取之后,附加了一個null 字符 示例:如果緩沖區大小為 100,則代碼最多只能讀取 99。
char gender[1]; 對於"F"來說太小了。

錯誤檢查

fscanf(fp, "%s %s %s %d %d", ...)可以返回5EOF以外的其他值。 因為只有5是可以接受的,所以要針對它進行測試。

測試開啟成功

如果fopen()失敗, fscanf()fclose()是壞的

其他問題也存在*

但是讓我們從修復上述問題開始。


char fname[20 + 1];
char sname[20 + 1];
char gender[1 + 1];
int ID;
int age;
FILE *fp = fopen("C:\\Users\\Catlover\\Desktop\\DSA\\Program2\\StudentList.txt", "r");
if (fp) {
  while(fscanf(fp, "%20s %20s %1s %d %d", fname, sname, gender, &ID, &age) == 5) {
    printf("%s,%s,%s,%d,%d\n", fname, sname, gender, ID, age);
  }
  fclose(fp);
}
return 0;

您還需要有空間來容納null字節。

char gender[1];

char gender[2];

暫無
暫無

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

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