У меня есть следующий код, и я знаю, как он работает и что он делает, однако, совсем не так. Я не понимаю, как работают эти три строки: std :: stringstream lineStream (строка); std :: string cell; std :: getline (lineStream, cell, ';') Особенно lineStream one; Я нашел их в Google, но не получил достаточных объяснений. Не могли бы вы объяснить мне, пожалуйста, их поведение или поделиться хорошей ссылкой, пожалуйста? Заранее спасибо, у меня хороший день :)
container *begin = new container;
begin->beginBox = new box;
container *last = NULL;
std::ifstream data(filename);
std::string line;
std::getline(data, line);
for (container *i = begin; !data.eof() && std::getline(data, line);)
{
std::stringstream lineStream(line);
std::string cell;
std::getline(lineStream, cell, ';');
i->ID = atoi(cell.c_str());
for (box *j = i->beginBox; std::getline(lineStream, cell, ';'); j->next = new box, j = j->next)
{
j->apples = atoi(cell.c_str());
i->lastBox = j;
}
i->lastBox->next = NULL;
i->nextCont = new container(), last = i, i = i->nextCont, i->beginBox = new box;
}
setAutoIncrement(begin->ID + 1);
last->nextCont = NULL;
return begin;
std::stringstream lineStream(line);
Это объявляет переменную типа lineStream
типа std::stringstream
. Он передает line
строку в его конструктор (2). Тип std::stringstream
переносит строку с интерфейсом потока. Это означает, что вы можете рассматривать его как cout
и cin
, используя <<
и >>
для вставки и извлечения из строки. Здесь lineStream
, поэтому вы можете впоследствии извлечь его содержимое, используя std::getline
.
std::string cell;
Это просто объявляет пустую std::string
называемую cell
.
std::getline(lineStream, cell, ';');
Функция std::getline
(1) берет поток, который будет извлекать строку из первого аргумента. Второй аргумент - std::string
которой он будет извлекать строку. Без третьего аргумента окончание "строки" считается тем, где мы видим символ новой строки. Однако, передавая третий аргумент, этот код делает так, что линия заканчивается на ;
, Таким образом, этот вызов std::getline
будет извлекать все из потока до тех пор, пока не найдет ;
характер и помещает это содержимое в cell
. ;
символ затем отбрасывается.
Все это очень похоже на приведенный выше код:
std::ifstream data(filename);
std::string line;
std::getline(data, line);
Здесь поток является файловым потоком, а не строковым потоком, и std::getline
будет извлекать все до символа новой строки, потому что не указан третий аргумент.
!data.eof()
в условии внешнего цикла, вызовstd::getline
вернет объект потока и может быть использован непосредственно в логических выражениях.