2014-01-30 49 views
2

所以我們正在學習scanf和輸入重定向。我必須從標準輸入讀取數據並將其存儲在預定大小的數組中。之後,我們必須要求用戶輸入一個整數x,然後在數組中進行一些基本搜索。命令行中的用戶必須使用「./a.out < somefile.txt」來提供數據。我正在通過scanf讀取這些數據,並使用了一個while循環,當scanf讀取EOF時終止。問題是,當我想重新使用scanf來要求用戶輸入整數x來在數組中搜索時。 scanf總是返回-1並將0存儲在x中,所以我似乎無法使用scanf。我對scanf的活動感到困惑。下面我提供了我的程序的簡單代碼和一個示例.txt文件。用戶在命令行通過重定向進入在使用scanf讀取數據時重定向輸入問題

的data.txt文件「<」

1 
2 
3 
4 
5 
6 

現在我的示例程序

int main(){ 

    int arr[6], i = 0, value, x; 

    while(scanf("%d",&value) != EOF){ 
     arr[i] = value; 
     i++; 
    } 

    printf("Enter integer to search for: "); 
    scanf("%i", &x); 
    printf("You entered %i", x); 
    return 0; 
} 

現在,這是輸出,它只是運行,不等待供用戶輸入數據

Enter integer to search for: 
You entered 0 
+0

無法重現它。 – haccks

+0

@haccks:你可能需要在你的data.txt結尾處有一個換行符。 – nmichaels

回答

2

你遇到的問題是標準是唯一你從中獲得輸入的地方,並且由於它被重定向,它不再連接到你的終端。您需要查看fscanf並使用/dev/tty而不是嘗試從標準掃描中獲取交互式用戶輸入。

您可能還想看看scanf的返回值以確保其成功。

+0

好吧,看來我可能誤解了項目任務。用戶不必重定向輸入,而只需逐個輸入數據值,直到輸入某個整數。我想感謝你的回覆,我現在更瞭解重定向,你的解釋是有道理的。 –

0

從報價:

問: 「更多」我試圖寫這樣一個程序如果stdin被重定向,我怎樣才能回到交互式鍵盤?

- 答:沒有便攜的方式做到這一點。在Unix下,您可以打開特殊文件/dev/tty。在MS-DOS下,您可以嘗試打開「文件」CON,或者使用例程或BIOS調用(如getch),這些調用可能會轉到鍵盤,無論輸入是否重定向。

我已經爲Unix的一個版本做了一個快速檢查。如果foo.c的是你的示例程序的修改版本:

#include <stdio.h> 

#define NUMBER(x) ((int)(sizeof(x)/sizeof(x)[0])) 

int main(void) { 
    int arr[6], i = 0, value, x; 
    while (i < NUMBER(arr) && scanf("%d", &value) == 1) 
     arr[i++] = value; 
    printf("Have read in %d values\n", i); 

    if (!freopen("/dev/tty", "r", stdin)) { 
     perror("freopen"); 
     return -1; 
    } 
    printf("Enter integer to search for: "); 
    scanf("%i", &x); 
    printf("You entered %i\n", x); 
    return 0; 
} 

然後在RHEL 5,既GNOME終端和的xterm:

$ cat test.txt 
1 
2 
3 
$ foo < test.txt 
Have read in 3 values 
Enter integer to search for: 99 
You entered 99 
0

您使用scanf函數的返回值,根據EOF進行檢查。 scanf的返回值是成功讀取的變量數量,或類似的數量,而不是分配給IN scanf的值。您需要根據EOF檢查值。