使用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读取数据时重定向输入问题的主要内容,如果未能解决你的问题,请参考以下文章

scanf()函数分析

C语言tips_2 关于scanf 读取规则小结

C语言scanf函数详解和示例

scanf 读取啥信号?

Python子进程将数据定向到标准输入

golang 使用Scanf读取用户输入