Предоставление обратной связи пользователю с помощью кода ошибки в символе 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 на стандартный ввод.

Этот код работает для меня:

#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