我用c ++构建了一个简单的Linux shell。它可以采用标准bash命令,重定向到文件等。但是,我想要的是它能够接收输入,例如,如果我有一个包含
的commands.txt文件ls -l /
some_invalid_command
echo this displays stuff
我把它管道输入我的a.out就好了
$./a.out < commands.txt
我想让它在里面运行命令就像我输入它们一样。但是,当我这样做时,我遇到了一个无限循环,'$'提示反复显示,直到我按下ctrl + c。我很确定原因是我没有在我的代码中的任何地方检查文件结尾。
所以我的问题是,在这种情况下,如何检查文件结尾?我认为这个角色是'^ d',但我不确定我该如何检查。这样的事情会起作用吗?
if (inputString == "\^d") {
exit = true;
}
我只担心我可能想在文件运行后向shell输入更多信息。将exit设置为true会告诉shell关闭。
编辑:请求的代码......
void Shell::getInput() {
emptyQueue();
cout << "$ ";
getline(cin, inputString);
fillQueue();
};
void Shell::fillQueue() {
if (inputString.empty()) {
return;
};
int i = inputString.find_first_not_of(" ");
int j = inputString.find_last_not_of(" \r\n");
int k;
string stringToAdd;
while (i != -1) {
k = i;
while (inputString.at(k) != ' ') {
if (k == j) {
break;
};
k++;
};
if (k != j) {
k--;
};
stringToAdd = inputString.substr(i, k - i + 1);
i = inputString.find_first_not_of(" ", k + 1);
commandQueue.push_back(stringToAdd);
};
i = 0;
while (i < commandQueue.size()) {
pointers[i] = commandQueue[i].c_str();
i++;
};
};
答案 0 :(得分:1)
文件结尾不是字符本身。
当你到达文件末尾时,任何读取更多字符的尝试都会返回,并显示已读取0个字符。
您没有显示有问题的代码,但您必须运行一个循环,从标准输入读取下一行文本。通常,您可以明确检查读取的字符数是0,还是使用std::istream
eof()
方法。
答案 1 :(得分:1)
如果在(默认)文本模式下打开文件,则 Ctrl + D 将转换为文件末尾。因此,您必须确保循环,直到没有输入为止,通常是:
while ( getline(cin, inputString) ) { // or while (cin>>inputString)
...
}
答案 2 :(得分:1)
void Shell::getInput() {
emptyQueue();
cout << "$ ";
getline(cin, inputString);
if(feof(stdin)) {
exit = true;
return;
};
fillQueue();
};