C++ stringstream, возвращающий дополнительный символ?

Я пытался использовать класс C++ stringstream для выполнения относительно простых манипуляций со строками, но у меня возникла проблема с методом 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 ответа

Решение

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

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

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

Флаг 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;
}

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

изменить порядок вашего кода, как это

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

   ss.get(c);
   while(!ss.eof()) {
      cout << "char: " << c << endl;
      ss.get(c);
   }
   return 0;
}
Другие вопросы по тегам