Как я могу это проверить std::istream::getline()
достиг разделителя, вместо того, чтобы просто максимизировать входной буфер?
Я понимаю, что могу использовать gcount()
определить, было ли прочитано меньше байтов, чем в буфере, но что, если строка для чтения равна длине буфера? Достигнув \n
будет выглядеть точно так же, как не достигнув \n
,
Условия прекращения std::istream::getline()
довольно точны: если функция останавливается, потому что n - 1
были сохранены, но новая строка не была достигнута, флаг std::ios_base::failbit
установлено. То есть вы можете просто проверить состояние потока, чтобы определить, была ли достигнута новая строка.
Тем не менее, если вам не требуется защита от враждебных источников ваших данных (например, подключение к Интернету отправляет вам данные до тех пор, пока вам не хватит памяти, все в одной строке), вам следует std::string
версия:
std::string line;
std::getline(in, line);
Не используйте член getline
совсем. Следующее всегда будет работать, используя функцию free:
#include <string>
std::string line;
if (!std::getline(infile, line)) { /* error */ }
// entire line in "line"
(Ответ на ваш актуальный вопрос заключается в том, что вы должны использоватьgetline
в петле. Но зачем.)