所以我们正在学习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
答案 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检查值。