使用scanf读取数据时重定向输入问题
Posted
技术标签:
【中文标题】使用scanf读取数据时重定向输入问题【英文标题】:Redirection of Input while using scanf to read data issue 【发布时间】:2014-02-23 06:28:12 【问题描述】:所以我们正在学习 scanf 和输入重定向。我必须从标准输入读取数据并将其存储在预定大小的数组中。之后我们必须向用户询问一个整数 x 并在数组中对该整数进行一些基本的搜索。命令行用户必须使用“./a.out
用户通过重定向在命令行输入的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
【问题讨论】:
@hacks:您可能需要在 data.txt 的末尾换行。 【参考方案1】:您遇到的问题是标准输入是您获得输入的唯一位置,并且由于它被重定向,它不再连接到您的终端。您需要查看 fscanf
并使用 /dev/tty
而不是尝试从标准输入进行扫描以获取交互式用户输入。
您可能还想查看scanf
的返回值以确保它成功。
【讨论】:
好吧,看来我可能误解了项目分配。用户不必重定向输入,而只需逐个输入数据值,直到输入某个整数。谢谢你的回复,我现在对重定向了解多了,你的解释很有道理。【参考方案2】:引用http://c-faq.com/stdio/devtty.html:
问:我正在尝试编写一个类似“more”的程序。如果
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-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
【讨论】:
【参考方案3】:您正在使用 scanf 的返回值并根据 EOF 检查它。 scanf 的返回值是成功读取的变量数,或者类似的东西,而不是在 scanf 中分配的值。您需要根据 EOF 检查值。
【讨论】:
以上是关于使用scanf读取数据时重定向输入问题的主要内容,如果未能解决你的问题,请参考以下文章