[c ++]检查文件结尾

时间:2016-02-15 00:14:30

标签: c++ linux bash shell

我用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++;
        };
};

3 个答案:

答案 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();
};