2014-01-30 50 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检查值。