Expecting input from std::cin (Unix C++)

22 浏览
0 Comments

Expecting input from std::cin (Unix C++)

我正在编写一个命令行应用程序,它可以从命令行参数或cin中接收数据。\n有没有办法检查用户是否通过管道输入了数据($ ./myapp < test.txt),并且只在没有数据输入时显示键盘输入提示?\n如果我检查!cin.good() / cin.eof()等,提示永远不会出现。

0
0 Comments

在Unix C++中,当我们从标准输入流(std::cin)中期望输入时,有时可能会遇到"Expecting input from std::cin"的问题。这个问题的出现原因可能是由于标准输入流没有及时接收到输入数据,导致程序在等待输入时被阻塞。

要解决这个问题,我们可以使用fstat(2)函数和S_ISFIFO宏来判断标准输入流是否为空。fstat(2)函数用于获取文件的状态信息,S_ISFIFO宏用于判断文件是否为一个FIFO(先进先出)文件。

下面是一个可能的解决方法的示例代码:

#include 
#include 
int main() {
    struct stat fileStat;
    fstat(0, &fileStat); // 0表示标准输入流的文件描述符
    if (S_ISFIFO(fileStat.st_mode)) {
        std::cout << "Expecting input from std::cin" << std::endl;
        // 处理接收到的输入数据
    }
    else {
        std::cout << "No input from std::cin" << std::endl;
    }
    return 0;
}

在上述代码中,我们使用fstat(2)函数来获取标准输入流的文件状态信息,并将其存储在fileStat结构体中。然后,我们使用S_ISFIFO宏来判断文件是否为一个FIFO文件。如果是,我们输出"Expecting input from std::cin",并可以继续处理接收到的输入数据。如果不是,我们输出"No input from std::cin"。

通过使用fstat(2)和S_ISFIFO,我们可以判断标准输入流是否为空,从而避免程序在等待输入时被阻塞的问题。这种方法可以帮助我们更好地处理从std::cin中期望输入的情况。

0
0 Comments

问题:Expecting input from std::cin (Unix C++)这个问题的出现的原因以及解决方法

在Unix C++中,当我们期望从标准输入(std::cin)获取输入时,可能会遇到一个问题,即无法接收到预期的输入。要解决这个问题,我们首先需要了解问题的原因。

原因是,当我们使用std::cin来获取输入时,它默认会从标准输入流中读取数据。然而,有时我们的程序可能无法从标准输入流中获取到输入,这可能会导致程序无法按预期运行。

解决这个问题的方法是使用isatty(STDIN_FILENO)函数来判断标准输入是否是一个终端(tty),也就是一个交互式终端。这个函数会返回一个布尔值,表示标准输入是否是一个终端。

我们可以通过以下代码来判断标准输入是否是一个终端:

#include 
bool isStdinTerminal() {
   return isatty(STDIN_FILENO);
}

在上述代码中,我们使用了isatty(STDIN_FILENO)函数来判断标准输入是否是一个终端。如果返回值为true,则表示标准输入是一个终端,我们可以正常获取输入。如果返回值为false,则表示标准输入不是一个终端,我们需要采取其他方法来获取输入。

通过判断标准输入是否是一个终端,我们可以根据不同的情况采取不同的处理方式。例如,如果标准输入不是一个终端,我们可以尝试从其他来源获取输入,如文件或管道。

在Unix C++中,当我们期望从标准输入(std::cin)获取输入时,可能会遇到无法接收到预期输入的问题。要解决这个问题,我们可以使用isatty(STDIN_FILENO)函数来判断标准输入是否是一个终端。通过判断标准输入是否是一个终端,我们可以采取不同的处理方式来获取输入。

0