我的程序是一個我想用C++編寫的常見shell。除了從命令行獲取命令之外,它還必須能夠讀取文件中的命令 - 文件名作爲可選參數傳遞,而不是通過重定向傳遞。有沒有一種優雅的方式來確定ifstream是否附加到stdin?
如果arg存在,我打開傳遞的文件名,否則打開「/ dev/stdin」。我對打開dev文件並不興奮,這不是我的主要問題,但如果有人有更好的方法,我很樂意聽到它。
最後,我必須閱讀命令給shell,但首先我必須提示如果我正在從標準輸入讀取或提示如果輸入來自文件的提示。我的問題是:有沒有更好的方法來確定在getCommand
輸入流是stdin比聲明一個全局或傳遞布爾或類似的黑客?
它發生在我身上,如果我可以以某種方式使用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))
//.......
}
「我必須提出,如果我從標準輸入讀取輸入提示」 - 這似乎是錯誤的條件。如果您正在閱讀終端,您應該提示提示。這只是反社會的編寫特殊代碼*停止*有人管道或重定向輸入到您的程序:-) –
是的,尋找輸入是一個終端。您可以使用源代碼來查找要使用的函數。或者對bash shell進行拉伸以查看它調用的文件描述符0. –
示例代碼中還有許多其他問題。通過值傳遞std :: ifstream,而不是通過引用傳遞std :: string,當它是一個out參數。 – goji