Предоставяне на потребителска обратна връзка чрез код за грешка на символ EOF (CTRL+D) в C++ програма

Знам, че има подобни въпроси за EOF и CTRL+D, но имам по-конкретен въпрос. Начинът, по който го разбирам, CTRL+D сигнализира края на STDIN и се обработва от компютъра, а не от работещото приложение. Трябва обаче да предоставя обратна връзка на потребителя на моята програма за EOF символ, въведен чрез (CTRL+D) или съдържащ се във входен файл, съдържащ команди. Как бих направил това?

Включих моя прост код за начина, по който мислех да го направя, но той не работи по очевидни причини:

#include <iostream>
#include <string>
using namespace std;

int input()
{
    string cmdstring;
    cin >> cmdstring;
    if (cmdstring == "bye") //Exit on "bye" command
    {
        return 1;
    }
    else if (cmdstring == "^D") //Exit on EOF character CTRL+D
    {
        return 2;
    }
    else //Continue shell prompt
    {
        return 0;
    }
}

Опитвам се да напиша моя собствена обвивка и искам да осигуря състояние на изход, когато обвивката се затвори. Благодаря ти много!

Редактиране: Промених го на cin.eof(), но пак не работи.

else if (cin.eof()) //Exit on EOF character CTRL+D
{
    return 2;
}

Освен това забравих да спомена, че този код е функция, работеща в рамките на цикъл, така че потребителят непрекъснато получава подкана, докато не предостави „чао“ или не бъде прочетен EOF знак.

int exitstatus = 0; //Tracks exit code status
do {
    exitstatus = input();
} while (exitstatus == 0);

person mallux    schedule 03.11.2014    source източник
comment
Мисля, че if(cin.eof()) трябва да го направи.   -  person Galik    schedule 04.11.2014
comment
Не знаех за това! Въпреки това, изглежда, също не работи за съжаление. Изглежда, че не улавя знака EOF, но поставя знак ^D в моя терминал, затова първоначално го имах така.   -  person mallux    schedule 04.11.2014
comment
Няма знак ^D. Обвивката прихваща знака ^D и в резултат на това задава състоянието EOF на stdin.   -  person Galik    schedule 04.11.2014
comment
Актуализирах въпроса с малко повече информация, за да помогна. :)   -  person mallux    schedule 04.11.2014
comment
Изненадан съм, че проверката на eof() не работи за вас, вярвам, че това е ефектът, който трябва да има натискането на Ctrl-D.   -  person Galik    schedule 04.11.2014


Отговори (1)


Няма знак "^D", предаден на приложението. Обвивката прихваща знака "^D" и затваря потока, карайки приложението да не регистрира повече въвеждане. В резултат на това системата I/O задава EOF състоянието на stdin.

Този код работи за мен:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string cmdstring;

    cin >> cmdstring;

    if(cmdstring == "bye") //Exit on "bye" command
    {
        return 1;
    }
    else if(cmdstring == "^D") //Exit on EOF character CTRL+D
    {
        return 2;
    }
    else if(cin.eof()) // pressing Ctrl-D should trigger this
    {
        return 3;
    }
    return 0;
}

Натискането на Ctrl-D трябва да върне код за грешка 3

person Galik    schedule 03.11.2014