Класс stringstream. Не могу понять, как работает lineStream, его параметры;

0

У меня есть следующий код, и я знаю, как он работает и что он делает, однако, совсем не так. Я не понимаю, как работают эти три строки: 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;
  • 0
    Вам не нужен !data.eof() в условии внешнего цикла, вызов std::getline вернет объект потока и может быть использован непосредственно в логических выражениях.
  • 0
    Хорошо, спасибо.
Показать ещё 1 комментарий
Теги:
string

1 ответ

3
Лучший ответ
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 будет извлекать все до символа новой строки, потому что не указан третий аргумент.

  • 0
    Спасибо, Джозеф. Означает ли это, что stringstream lineStream является чем-то очень похожим на обычную строку, но разница в том, что stringstream позволяет использовать >> и <<?
  • 0
    это понятно с getline и string, но совсем не с streamstring
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню