Как использовать конструктор stringstream в getline?
После qaru.site/info/35331/...
Почему я не могу использовать
getline(stringstream(line),cell,','){}
вместо
stringstream lineStream(line);
getline(lineStream,cell,','){}
?
Обновление
Я должен был уточнить, что хочу использовать getline в цикле.
Кроме того, я должен был также отметить, что мое первоначальное намерение состояло в том, чтобы прочитать файл по строкам, используя getline, и использовать строку из этой строки в новой линии getline, которая будет делить на ',', что более интуитивно понятное imo.
Из того, что я понял до сих пор, getline не предназначен для этого, потому что он принимает неконстантный вход и дает токен const; поэтому getline не может быть слепо рекурсивно.
Ответы
Ответ 1
Как показывают @James Kanze, вы можете.
Вопрос: вы действительно хотите?
Поток уничтожается в конце выражения, поэтому вы читаете только одну ячейку из него.
Если мы посмотрим на это в контексте исходного вопроса:
т.е. вы не можете использовать это в цикле:
std::string line = /* Init */;
std::stringstream lineStream(line);
std::string cell;
while(std::getline(lineStream, cell, ','))
{
// Do stuff with cell.
}
Если вы разместите свой код в этом контексте, он не будет работать должным образом:
std::string cell;
while(std::getline(std::istringstream(line).flush(), cell, ','))
{
// Do stuff with cell.
}
Поскольку выражение внутри while()
будет полностью оцениваться каждый раз. Таким образом, вы переходите в непрерывный цикл, непрерывно читающий первую ячейку.
Ответ 2
Вы можете, но это уродливо:
std::getline( std::istringstream( line ).flush(), cell, ',' );
Проблема заключается в том, что std::getline
принимает неконстантную ссылку (которая
логично, поскольку он собирается изменить поток), и вы не можете
инициализировать неконстантную ссылку с временным. Вы можете, однако,
функции вызова на нем. std::istream::flush
является членом
функция, которая возвращает неконстантную ссылку на поток, на котором он
(и если этот поток является std::istringstream
, он не делает
все остальное).
FWIW: вы, вероятно, найдете:
cell = std::string( line.cbegin(), std::find( line.cbegin(), line.cend(), ',' ) );
немного эффективнее. И, по крайней мере, на мой взгляд, легче читать и
обслуживание.