簡體   English   中英

一旦到達一行,其中不包含要掃描的值,Fscanf將在循環中返回相同的值

[英]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()返回成功填充的參數列表的項目數。 由於匹配失敗,讀取錯誤或文件結尾的范圍,此計數可以與預期的項目數匹配或更少(甚至為零)。

您可以測試fscanf()的返回值,如果無法讀取預期的項目數,則退出循環。

輸入文件可能有問題:如果讀取失敗,則測試該值可讓您打印錯誤消息。

在文件行中:

1 B
2 U

程序讀取1 B 2 ,然后嘗試將U讀取為整數並且失敗。

由於換行是文件格式的關鍵部分,請遵循@BlueMoon的建議:使用fgets()讀取整行,然后使用sscanf()解析該行。

不要在同一字符串上多次使用sscanf()或讀取使用sscanf多次讀取字符串

您還可以測試sscanf()的返回值以檢查是否已成功讀取該行。

暫無
暫無

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

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