Подтвердить что ты не робот

Как повторно использовать stringstream

Эти потоки НЕ отвечают мне:

сброс строкового потока

Как очистить переменную stringstream?

        std::ifstream file( szFIleName_p );
        if( !file ) return false;

        // create a string stream for parsing

        std::stringstream szBuffer;

        std::string szLine;     // current line
        std::string szKeyWord;  // first word on the line identifying what data it contains

while( !file.eof()){

            // read line by line

            std::getline(file, szLine);

            // ignore empty lines

            if(szLine == "") continue;

            szBuffer.str("");
            szBuffer.str(szLine);
            szBuffer>>szKeyWord;

szKeyword всегда будет содержать первое слово, szBuffer не является reset, не может найти ясный пример в любом месте, как использовать stringstream.

Новый код после ответа:

...
            szBuffer.str(szLine);
            szBuffer.clear();
            szBuffer>>szKeyWord;
...

Хорошо, это моя окончательная версия:

        std::string szLine;     // current line
        std::string szKeyWord;  // first word on the line identifying what data it contains

        // read line by line

        while( std::getline(file, szLine) ){

            // ignore empty lines

            if(szLine == "") continue;

            // create a string stream for parsing

            std::istringstream szBuffer(szLine);
            szBuffer>>szKeyWord;
4b9b3361

Ответ 1

Вы не clear() поток после вызова str(""). Посмотрите еще раз на этот ответ, это также объясняет, почему вы должны reset использовать str(std::string()). И в вашем случае вы можете также reset содержимое, используя только str(szLine).

Если вы не вызываете clear(), флаги потока (например, eof) не будут reset, что приведет к неожиданному поведению;)

Ответ 2

Это зависит от того, что вы делаете с ним. В целом проще просто создайте новый istringstream или ostringstream. Для "reset" потока, вам нужно очистить свой буфер, очистить любые флаги ошибок, reset any флаги форматирования, а также точность и заполнение, re imbue с помощью оригинальная локаль, и не забывайте о какой-либо расширенной информации о форматировании генерируется со значением, возвращаемым из xalloc. В целом невозможно исправьте.

И пока я нахожусь в этом, ваша петля ошибочна и, вероятно, приведет к последняя строка обрабатывается дважды. file.eof() имеет только полезное значение после неудачного ввода (и даже тогда он не на 100% надежный). Вы хотите:

std::string line;
while ( std::getline( file, line ) ) {
    if ( !line.empty() ) {
        std::istringstream buffer( line );
        //  ...
    }
}

(На самом деле, вы, вероятно, хотите обрезать пробел с пробела из строки перед тестом на пустое.)

Ответ 3

В большинстве случаев проще создать новый istringstream или ostringstream вместо сброса тех же.

Однако, если вы хотите их обидеть:

  • Показывать флаги потока (во избежание неожиданного поведения) с помощью clear ().

  • Хотя вы можете исправить содержимое своего stringstream с помощью str (""), для эффективности мы можем предпочесть str(std::string()).

Ответ 4

ss - строка. Используйте

  • первый шаг: ss.clear();
  • второй шаг: ss.str("");

для повторного использования строкового потока - полностью очистить поток строк.

Ответ 5

Если у вас есть поток в члене класса, используйте unique_ptr<stringstream>, затем просто reset(new stringstream(...)) для повторного использования.