私のプログラムは、C++ で記述しようとしている一般的なシェルです。コマンド ラインからコマンドを取得するだけでなく、ファイル内のコマンドを読み取ることができる必要があります。ファイル名は、リダイレクトではなく、オプションの引数として渡されます。
引数が存在する場合は、渡されたファイル名を開きます。それ以外の場合は、「/dev/stdin」を開きます。私は開発ファイルを開くことにわくわくしていません。それは私の主な質問ではありませんが、誰かがより良い方法を持っているなら、私はそれを聞きたいです.
最終的には、シェルに与えられたコマンドを読み取る必要がありますが、最初に、標準入力から読み取る場合はプロンプトを表示するか、入力がファイルからのものである場合はプロンプトをスキップする必要があります。getCommand
私の質問は次のとおりです。グローバルを宣言したり、ブール値や同様のハックを渡すよりも、入力ストリームが標準入力であるかどうかを判断するより良い方法はありますか?
/dev ファイルを開くのではなく、どうにかして std::cin を使用できれば、ストリームを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))
//.......
}