Строковый поток С++, возвращающий дополнительный символ?
Вопрос
Я пытался использовать класс stringstream 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
Любая помощь, которую вы можете мне оказать в этом вопросе, будет оценена по достоинству.
Решение
В конце потока ss.eof()
еще не знает, что конец потока скоро будет достигнут, но последующее извлечение символа не удается.Поскольку извлечение не удалось из-за достижения конца потока, c
не изменен.Ваша программа этого не распознает ss.get(c)
не удалось и печатает это старое значение c
снова.
Лучшим способом проверить, есть ли еще символ, который можно прочитать из потока, будет такой цикл:
while (ss.get(c)) {
cout << "char: " << c << endl;
}
Другие советы
это из-за порядка цикла.Вы читаете \0 и EOF.
измените порядок вашего кода следующим образом
int main() {
stringstream ss("hello");
char c;
ss.get(c);
while(!ss.eof()) {
cout << "char: " << c << endl;
ss.get(c);
}
return 0;
}
Флаг EOF устанавливается только в том случае, если вы пытаетесь прочитать ПОСЛЕ конца файла.Следующий код устраняет проблему, проверяя наличие 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;
}