Как мне установить EOF на istream без чтения форматированного ввода? - PullRequest
1 голос
/ 02 апреля 2009

Я делаю чтение файла символ за символом, используя istream :: get (). Как мне закончить эту функцию чем-нибудь, чтобы проверить, не осталось ли ничего для чтения в отформатированном файле (например, только пробел) и установить соответствующие флаги (EOF, bad и т. Д.)?

Ответы [ 5 ]

1 голос
/ 12 апреля 2016

Вы можете в любое время удалить любое количество начальных (или конечных) пробелов из потока, прочитав std::ws. Например, если бы мы читали файл из STDIN, мы бы сделали:

std::cin >> std::ws

Благодарим этот комментарий к другой версии этого вопроса, заданной четыре года спустя.

1 голос
/ 02 апреля 2009

Создайте istream::sentry в потоке. Это будет иметь несколько побочных эффектов , один из которых нам нужен:

Если установлен флаг формата skipws и конструктор не передан true в качестве второго аргумента ( noskipws ), все ведущие пробельные символы (для конкретной локали) извлекаются и выбрасываются. Если эта операция исчерпывает источник символов, функция устанавливает флаги внутреннего состояния failbit и eofbit

0 голосов
/ 06 апреля 2009

istream не сильно поможет - он работает как задумано. Тем не менее, он делегирует фактическое чтение в streambufs. Если ваша оболочка streambuf обрезает завершающие пробелы, чтение потока istream из этого streambuf не заметит его.

0 голосов
/ 03 апреля 2009

По умолчанию все отформатированные операции извлечения (перегрузки operator>>()) пропускают пробелы до извлечения элемента - вы уверены, что хотите разойтись с этим подходом?

Если да, то вы, вероятно, могли бы достичь того, чего хотите, путем получения нового класса my_istream из istream и переопределения каждого operator>>() для вызова следующего метода в конце:

void skip_whitespace() {
    char ch;
    ios_base old_flags = flags(ios_base::skipws);
    *this >> ch;    // Skips over whitespace to read a character
    flags(old_flags);

    if (*this) {    // I.e. not at end of file and no errors occurred
        unget();
    }
}

Это довольно много работы. Здесь я опускаю несколько деталей (например, тот факт, что более общим решением было бы переопределить шаблон класса basic_istream<CharT, Traits>).

0 голосов
/ 02 апреля 2009

Как мне закончить эту функцию чем-нибудь, чтобы проверить, не осталось ли что-либо для чтения в отформатированном файле (например, только пробел)?

Пробельные символы - это символы в потоке. Вы не можете предполагать, что поток будет выполнять интеллектуальную обработку для вас. До тех пор, пока вы не напишите свой собственный поток фильтрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...