[C++]检查文件结尾

[c++]checking for end of file

本文关键字:文件 结尾 检查 C++      更新时间:2023-10-16

我用c++构建了一个简单的Linux shell。它可以接收标准的bash命令,重定向到文件等。但是,我想要的是它能够接受输入,例如,如果我有一个.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(" rn");
        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 个字符。

您没有显示有问题的代码,但您必须运行一个循环,该循环从标准输入中读取下一行文本。通常,您将显式检查读取的字符数是否为 0,或者如果您使用的是 std::istream eof() 方法。

如果文件以(默认(文本模式打开,则 Ctrl+D 将转换为文件末尾。 因此,您只需要确保循环直到不再有输入,通常:

while ( getline(cin, inputString) ) {  // or while (cin>>inputString)
    ...
}
void Shell::getInput() {
    emptyQueue();
    cout << "$ ";
    getline(cin, inputString);
    if(feof(stdin)) {
        exit = true;
        return;
    };
    fillQueue();
};