Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

eofbit not set with clear in C++98

I have to make a program for homework that reads some user inputs using std::cin and std::getline(), but it is specified that the program should exit only when EXIT is typed.

I am currently trying to get Ctrl-D to do nothing, and multiple people have told me to use this snippet:

if (std::cin.eof()) {
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //some have told me to put nothing there, has not changed the behavior.
    continue;
}

The problem is, this does nothing when I test it. The eofbit flag is not reset, and getline() just continuously fails after that.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Here is my code:

int main()
{
    PhoneBook phone;
    std::string input;
    while (true){
        std::getline(std::cin, input);
        if (std::cin.eof()) {
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            continue;
        }
        if (input == "ADD")
            phone.addContact();
        else if (input == "SEARCH")
            phone.search();
        else if (input == "EXIT")
            break;
        else
            std::cerr << "Invalid command, commands are ADD, SEARCH and EXIT" << std::endl;
    }
    return (0);
}

I have to code in C++98. I compiled with clang++ using the following flags: -Wall -Werror -Wextra -std=c++98

Does anyone have an idea of what could be causing this to fail?

I have tried editing what was inside the ignore() call, tried swapping the order between clear() and ignore(), verified the eofbit variable which is still set after a call to clear().

>Solution :

This should work. You havent reset stdio stream from C which is giving you a new EOF. Remove the sync and you should be good.

#include <iostream>
#include <limits>

int main()
{
    std::ios_base::sync_with_stdio(false);
    std::string input;
    while (true){
        std::cin >> input;
        if (std::cin.eof()) {
            std::cout << "Ignore" << std::endl;
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');         
            continue;
        }
        if (input == "ADD")
            std::cout << "Adding"<< std::endl;
        else if (input == "SEARCH")
            std::cout << "Adding"<< std::endl;
        else if (input == "EXIT")
            break;
        else
            std::cerr << "Invalid command, commands are ADD, SEARCH and EXIT" << std::endl;
    }
    return (0);
} 
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading