C ++ stringstream, возвращающий дополнительный символ? - PullRequest
2 голосов
/ 09 октября 2009

Я пытался использовать класс струнного потока C ++ для выполнения относительно простых манипуляций со строками, но у меня возникла проблема с методом get (). По какой-то причине, когда я извлекаю выводимый символ за символом, он добавляет вторую копию последней буквы.

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
   stringstream ss("hello");
   char c;

   while(!ss.eof()) {
      ss.get(c);
      cout << "char: " << c << endl;
   }
   return 0;
}

Вывод из программы:

char: h
char: e
char: l
char: l
char: o
char: o

Буду признателен за любую помощь, которую вы можете мне дать.

Ответы [ 3 ]

8 голосов
/ 09 октября 2009

В конце потока ss.eof() еще не знает, что конец потока будет достигнут в ближайшее время, но следующее извлечение символа завершится неудачно. Поскольку извлечение не удалось из-за достижения конца потока, c не изменяется. Ваша программа не распознает ошибку ss.get(c) и снова печатает это старое значение c.

Лучшим способом проверить, есть ли еще символ, который можно прочитать из потока, был бы цикл, подобный этому:

while (ss.get(c)) {
   cout << "char: " << c << endl;
}
2 голосов
/ 09 октября 2009

это из-за порядка цикла. Ваше чтение \ 0 и EOF.

измените порядок кода следующим образом

int main() {
   stringstream ss("hello");
   char c;

   ss.get(c);
   while(!ss.eof()) {
      cout << "char: " << c << endl;
      ss.get(c);
   }
   return 0;
}
1 голос
/ 09 октября 2009

Флаг EOF устанавливается только если вы пытаетесь прочитать PAST конец файла. Следующий код устраняет проблему, проверяя EOF после get (), а не перед ним:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
   stringstream ss("hello");
   char c;

   while(1) {
      ss.get(c);
      if(ss.eof())
          break;

      cout << "char: " << c << endl;
   }
   return 0;
}
...