首页 > 解决方案 > 从标准输入读取文件后读取用户输入

问题描述

我有一个程序,我从命令行开始,将文件推送到stdin

main.exe < file.bin

我从文件中读取了所有内容,如下所示:

freopen(NULL, "rb", stdin);    // it's a binary file
long* buffer = new long[16000];
while ( fread(buffer, sizeof(long), 16000, stdin) == 16000);

读取所有数字后,我希望用户通过按任意键确认程序继续,但此时stdin可能包含EOF并且程序会跳过用户的确认。

printf("Press any key to continue");
getchar();    // user doesn't get a chance to press anything, program flows right through 

如果您想重现它,这是整个程序。但是要重现,您必须在执行之前将文件推送到标准输入。

#include <stdio.h>

int main()
{
    freopen(NULL, "rb", stdin);
    long* buffer = new long[16000];
    while ( fread(buffer, sizeof(long), 16000, stdin) == 16000);
    printf("Press any key to continue");
    getchar();
    delete[] buffer;
    return 0;
}

问题是如何使getchar()调用从用户的键盘中获取一个字符,而不是从已经读取的文件中获取。

该程序以 C++17 运行,但使用了大量 C 风格的代码。如果您知道如何使用 C++ 流来执行此操作,请随时发布。我使用的是 Windows 10,但我也希望看到一些可移植的代码。

标签: c++c

解决方案


如果通过 将文件file.bin用作标准输入main.exe < file.bin,则不能同时使用标准 C 或 C++ 库将控制台用作标准输入。也许您可以尝试使用 WinAPI https://docs.microsoft.com/en-us/windows/console/readconsoleinput 不幸的是,使用 std::cin 读取二进制数据是不可能的:从 std::cin 读取二进制数据


推荐阅读