我的程序是一个我试图用 C++ 编写的通用 shell。除了从命令行获取命令外,它还必须能够读取文件中的命令——文件名作为可选参数传递,而不是通过重定向传递。
如果 arg 存在,我打开传递的文件名,否则我打开“/dev/stdin”。我对打开开发文件并不感到兴奋,这不是我的主要问题,但如果有人有更好的方法,我很想听听。
最终我必须读取给 shell 的命令,但首先我必须显示提示,如果我从标准输入读取,或者如果输入来自文件,则跳过提示。getCommand
我的问题是:有没有比声明全局或传递布尔或类似黑客更好的方法来确定输入流是否为标准输入?
我突然想到,如果我能以某种方式使用 std::cin 而不是打开 /dev 文件,我可以将流作为istream
. 这样会更容易区分两者吗?例如if (source == cin)
?
感谢您的任何建议。
bool getCommand(ifstream source, std::string command)
{
if (source == stdin)
//print prompt to stdout
// do the rest of stuff
return true;
}
int main(int argc, char *argv[])
{
std::ifstream input;
std::string command;
if (argc == 2)
{
input.open(argv[1], std::ifstream::in);
if (! input)
{
perror("input command file stream open");
exit(EXIT_FAILURE);
}
}
else
{
input.open("/dev/stdin", std::ifstream::in);
if (! input)
{
perror("input stdin stream open");
exit(EXIT_FAILURE);
}
}
//.......
if (getCommand(input, command))
//.......
}