Чтение по одному байту за раз с помощью .get()

Итак, я читаю входной файл, который содержит:

lololololololol

Мне нужно прочитать его, используя двоичный код по одному байту за раз, для чего-то, что я буду делать позже. Для этого я использую get(), чтобы прочитать его, а затем сохранить в char. Кажется, он работает правильно, за исключением последнего символа, который он считывает. Вектор, который он считывает, содержит:

lololololololol
�

Я не совсем уверен, что это за последнее значение, но оно полностью отбрасывает мой окончательный вывод. Итак, мой вопрос: есть ли причина, по которой get() будет читать значение или байт из моего текстового документа, которого там нет? Или это чтение чего-то, о чем я не знаю?

код:

while(istr.good()) {
    temp = istr.get();
    input.push_back(temp);
}

person David Dennis    schedule 13.02.2016    source источник
comment
get возвращает EOF при достижении конца файла. good не будет сообщать о конце файла, пока это не произойдет. Итак, загадочный символ — это маркер EOF.   -  person Jonathan Potter    schedule 14.02.2016
comment
@JonathanPotter Пожалуйста, не отвечайте в комментариях.   -  person emlai    schedule 14.02.2016
comment
Пример из учебника, почему while (stream is good) { read from stream; use data } неправильно. Поток не станет плохим до тех пор, пока после вы не попытаетесь прочитать за конец буфера. .good() не говорит о будущем.   -  person Lightness Races in Orbit    schedule 14.02.2016


Ответы (1)


Он читает символ EOF (конец файла). Вам нужно выполнить проверку после чтения, чтобы избежать вставки в вектор:

while(temp = istr.get(), istr.good()) // comma operator
    input.push_back(temp);

Или вы можете использовать вторую std::istream_base::get перегрузку и позволить istr неявно преобразовать в bool:

while(istr.get(temp))
    input.push_back(temp);

Или попробуйте более сложные подходы. operator>> и std::getline также отлично подходят для такого типа ввода.

person LogicStuff    schedule 13.02.2016