C ++ - повторно использовать istringstream - PullRequest
19 голосов
/ 04 мая 2010

У меня есть код для чтения файлов с числами с плавающей запятой в строке, которые хранятся примерно так: «3.34 | 2.3409 | 1.0001 | ... | 1.1 |». Я хотел бы прочитать их, используя istringstream, но он не работает так, как я ожидал:

  string row;
  string strNum;

  istringstream separate;  // textovy stream pro konverzi

   while ( getline(file,row) ) {
      separate.str(row);  // = HERE is PROBLEM =
      while( getline(separate, strNum, '|') )  { // using delimiter
        flNum = strToFl(strNum);    // my conversion
        insertIntoMatrix(i,j,flNum);  // some function
        j++;
      }
      i++;
    }

В отмеченной точке строка копируется в отдельный поток только первый раз. В следующей итерации это не работает и ничего не делает. Я ожидал, что можно использовать больше раз, не создавая новый объект istringstream в каждой итерации.

Ответы [ 2 ]

27 голосов
/ 04 мая 2010

После установки строки в поток istringstream ...

separate.str(row);

... сбросить его, позвонив

separate.clear();

Это очищает все флаги iostate, которые были установлены в предыдущей итерации или путем установки строки. http://www.cplusplus.com/reference/iostream/ios/clear/

5 голосов
/ 04 мая 2010

Вам нужно добавить строку separate.clear(); после separate.str(row), чтобы очистить биты состояния, в противном случае устанавливается eofbit и последующее чтение не выполняется.

...