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;
}