[英]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", ...)
可以返回5
或EOF
以外的其他值。 因為只有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.