簡體   English   中英

使用.txt文件作為輸入時C-陷入無限循環

[英]C - run into infinite loop when using .txt files as input

我一個月前才剛剛開始學習C,這是我編寫的用於檢測數據列表峰值的代碼。 當我在終端中執行“ input data.txt”時,它會以某種方式陷入無限循環,但是當我通過標准輸入aka鍵盤手動鍵入完全相同的數據時,它會完美地工作。 任何想法為什么會陷入無限循環?

謝謝!

int main(void)
{
    int data1 = 0;
    int data2 = 0;
    int data3 = 0;
    int counter = 1;

    scanf("%d %d %d", &data1, &data2, &data3);
    puts("Number  Magnitude");

    while (data3!= EOF){
        if ((data1<=data2)&&(data2>data3)){
            printf("%*d%*d\n", 4,counter,11, data2);
            counter++;

        }
        data1 = data2;
        data2 = data3;
        scanf("%d", &data3);

     }
return 0;
}

從stdin嘗試輸入時,如何停止輸入? 用Ctrl-Z嗎?

您需要測試從scanf返回的結果:

返回值成功時,該函數返回已成功填充的參數列表的項目數。 由於匹配失敗,讀取錯誤或文件結尾的范圍,此計數可以與預期的項目數匹配或更少(甚至為零)。

如果讀取時發生讀取錯誤或到達文件末尾,則會設置正確的指示符(低或錯誤)。 並且,如果在成功讀取任何數據之前發生任何一種情況,則返回EOF。 http://www.cplusplus.com/reference/cstdio/scanf/

將循環的最后一行更改為

if (scanf("%d", &data3) < 1)
   break;

-這也意味着您的while語句可以更改為

while (1) /* forever */
scanf("%d", &data3);

上面函數的默認輸入流被重定向到

printf("%*d%*d\n", 4,counter,11, data2);

函數的輸出。 您必須區分它。

詳細代碼與此有關。 只需讓輸入函數(fscanf)從文件中讀取數字就可以了

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    int data1 = 0, data2 = 0, data3 = 0;
    int counter = 1;
    puts("Number Magnitude");

    FILE *fp = fopen(argv[1], "r+");
    if(fscanf(fp, "%d %d", &data1, &data2) != EOF){
        while (fscanf(fp, "%d", &data3) != EOF) {
            if((data1 <= data2) && (data2 > data3)){
                printf("%*d%*d\n", 4, counter++, 11, data2);
            }
            data1 = data2;
            data2 = data3;
        }
    }
    fclose(fp);
    return 0;
}

這樣的輸出:

$ cat data.txt

3 3 4 5 5 5 4 2 1 191 3 43 2 3 0

$ ./a.out data.txt

數量幅度1 5 2 191 3 43 4 3

我在這里可能會感到困惑,但是您使用默認的輸入/輸出(可能是終端,使用scanf而不是文件)進行掃描。 嘗試創建文件指針並使用fscanf。 例如

FILE *data;
data=fopen("data.txt", "r+");
fscanf(data,"%d",&data1);
fclose(data);

首先,您要為data1data2data3分配值,並且您還要求用戶提供輸入值。 您要求輸入值,或者為這些變量分配一些確定的值。 同樣,在while循環中, EOF是未定義的,因此請將其更改為某個值或適當的條件。

暫無
暫無

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

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