[英]Fscanf returns the same values in a loop once a line is reached that does not contain a value that is being scanned for
我正在嘗試創建一個程序,該程序從文本文件讀取並對存儲在不同帳號(由數字1-5表示)中的值執行功能,以及在這些帳號旁邊使用字符來執行某些功能(即“ 1 D 200.00”表示帳戶1的值增加了200。 文本文件以這種方式格式化
20000.00
10000.00
2500.00
67500.00
15000.00
2 W 200.00
4 D 50.00
1 B
2 U
3 W 125.00
掃描前5個值,然后將其用於表示帳戶1-5的初始值。 然后,每個后續的讀取行都表示要對這些現在存儲的值執行的操作。 例如,讀為“ 2 W 200.00”的行以目標帳戶2為目標,請對該帳戶使用撤回功能,然后使用浮點數修改功能(因此從帳戶2的值中減去200.00)。
作為測試以適當方式掃描和存儲值的一種方式,我首先讓程序運行一個循環,在該循環中,程序將掃描前5行后的所有值並進行打印。 這是代碼:
FILE*bankfile;
bankfile = fopen("bankfile.txt","r+");
for(i = 1; i < 15; i++)
{
if(i < 6)
{
fscanf(bankfile,"%f",&accValue);
switch(i)
{
case 1:
acc1 = accValue;
break;
case 2:
acc2 = accValue;
break;
case 3:
acc3 = accValue;
break;
case 4:
acc4 = accValue;
break;
case 5:
acc5 = accValue;
break;
}
}
else
{
fscanf(bankfile,"%d %c %f",&accNum,&accAction,&actValue);
printf("%d %c %f\n",accNum,accAction,actValue);
}
}
printf("Exited Loop");
當我運行此代碼時,前兩行將按預期打印,但是一旦到達第一行且其中不包含正在掃描的浮點值,程序將繼續重復打印相同的值,直到循環中斷。 這是打印的內容:
2 W 200.00
4 D 50.00
1 B 2.00
1 B 2.00
1 B 2.00
直到程序完成。
有什么方法可以使該程序識別出該行不存在actValue的值,然后繼續下一行?
函數
fscanf()
返回成功填充的參數列表的項目數。 由於匹配失敗,讀取錯誤或文件結尾的范圍,此計數可以與預期的項目數匹配或更少(甚至為零)。
您可以測試fscanf()
的返回值,如果無法讀取預期的項目數,則退出循環。
輸入文件可能有問題:如果讀取失敗,則測試該值可讓您打印錯誤消息。
在文件行中:
1 B
2 U
程序讀取1 B 2
,然后嘗試將U
讀取為整數並且失敗。
由於換行是文件格式的關鍵部分,請遵循@BlueMoon的建議:使用fgets()
讀取整行,然后使用sscanf()
解析該行。
不要在同一字符串上多次使用sscanf()
或讀取使用sscanf多次讀取字符串
您還可以測試sscanf()
的返回值以檢查是否已成功讀取該行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.