io — C ++: getline () прочитал всю строку?

Как я могу это проверить std::istream::getline() достиг разделителя, вместо того, чтобы просто максимизировать входной буфер?

Я понимаю, что могу использовать gcount() определить, было ли прочитано меньше байтов, чем в буфере, но что, если строка для чтения равна длине буфера? Достигнув \n будет выглядеть точно так же, как не достигнув \n,

1

Решение

Условия прекращения std::istream::getline() довольно точны: если функция останавливается, потому что n - 1 были сохранены, но новая строка не была достигнута, флаг std::ios_base::failbit установлено. То есть вы можете просто проверить состояние потока, чтобы определить, была ли достигнута новая строка.

Тем не менее, если вам не требуется защита от враждебных источников ваших данных (например, подключение к Интернету отправляет вам данные до тех пор, пока вам не хватит памяти, все в одной строке), вам следует std::string версия:

std::string line;
std::getline(in, line);
0

Другие решения

Не используйте член getline совсем. Следующее всегда будет работать, используя функцию free:

#include <string>

std::string line;

if (!std::getline(infile, line)) { /* error */ }

// entire line in "line"

(Ответ на ваш актуальный вопрос заключается в том, что вы должны использоватьgetline в петле. Но зачем.)

4

По вопросам рекламы [email protected]