使用scanf读取数据时重定向输入问题

时间:2014-01-30 18:58:17

标签: c

所以我们正在学习scanf和输入的重定向。我必须从stdin中读取数据并将其存储在预定大小的数组中。之后我们必须要求用户输入整数x并对数组中的整数进行基本搜索。命令行中的用户必须使用“./a.out< somefile.txt”来提供数据。我正在通过scanf读取这些数据,我使用了一个while循环,当scanf读取EOF时终止。问题是当我想重新使用scanf要求用户输入整数x以在数组中搜索时。 scanf总是返回-1并在x中存储0,所以我似乎无法使用scanf。我对scanf的活动感到困惑。下面我提供了一个简单的程序代码和一个示例.txt文件。

用户通过重定向“&lt;”

在命令行输入的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

3 个答案:

答案 0 :(得分:2)

您遇到的问题是,标准输入是您从中获取输入的唯一位置,并且由于它被重定向,因此它不再连接到您的终端。您需要查看fscanf并使用/dev/tty,而不是尝试从标准扫描中获取交互式用户输入。

您可能还想查看scanf的返回值,以确保它成功。

答案 1 :(得分:0)

引自http://c-faq.com/stdio/devtty.html

  

问:我正在尝试编写类似“更多”的程序。如果重定向stdin,如何返回交互式键盘?

     

答:没有便携式方法可以做到这一点。在Unix下,您可以打开特殊文件/dev/tty。在MS-DOS下,您可以尝试打开“文件”CON,或使用例如getch的例程或BIOS调用,无论是否重定向输入,都可以转到键盘。

我已经对一个版本的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-terminal和xterm:

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

答案 2 :(得分:0)

您正在使用scanf的返回值并针对EOF进行检查。 scanf的返回值是成功读取的变量数,或类似的变量,而不是IN scanf中分配的值。您需要根据EOF检查值。