#c #overloading
#c #перегрузка
Вопрос:
В настоящее время моя перегруженная operator>>
функция принимает входные [4: 1 2 3 4 ]
данные и работает нормально. Но как я могу игнорировать любое количество пробелов, чтобы он мог принимать [ 4 : 1 2 3 4 ]
, т.е. Любое количество пробелов перед вводом?
istreamamp; operator>>( istream amp; stream, my_vector amp; vector_a ) {
string token2;
int vec_size;
vector<double> temp_vec;
bool push = false;
while (stream >> token2) {
if (token2[0] == '[' amp;amp; token2[2] ==':') {
push = true;
}
if (token2 == "]") {
break;
}
else if(!(token2[0] == '[' amp;amp; token2[2] ==':')) {
stream.setstate(ios::badbit);
}
if(push) {
istringstream str(token2);
double v;
if (str >> v)
temp_vec.push_back(v);
vector_a.set_data(temp_vec);
}
}
return stream;
}
Ответ №1:
stream >> std::ws;
Извлекает как можно больше пробельных символов из текущей позиции во входной последовательности. Извлечение останавливается, как только найден символ, не содержащий пробелов. Эти извлеченные символы пробела не сохраняются ни в одной переменной.
Обратите внимание, что это приведет к пропуску пробелов, даже если skipws
флаг ранее unsetf
был в исходном потоке, поэтому вы должны сделать это в любом случае.
Комментарии:
1. Я поместил stream >> token2>> std::ws в мое условие цикла while, но, похоже, оно все еще не работает. Я полагаю, это то, что вы имели в виду?
2. @cody: Ваша проблема не в пробелах, а в понимании того, что такое «токен». Вместо чтения строки, прочитайте a
char
(за которым следуетws
), затем anint
(за которым следуетws
), а затем ещеchar
один .
Ответ №2:
Я думаю, что я бы сделал что-то в этом порядке:
stream.setf(std::skipws);
char open_bracket, close_bracket, colon;
unsigned num_items, temp_item;
stream >> open_bracket;
stream >> num_items;
stream >> colon;
for (int i=0; i<num_items; i ) {
stream >> temp_item;
temp_vec.push_back(temp_item);
}
stream >> close_bracket;
if (open_bracket != '[' || close_bracket != ']' || colon != ':')
stream.setstate(ios::failbit);
Обратите внимание, что бит, устанавливаемый для неудачного преобразования, — это failbit, а не badbit . badbit предназначен для таких вещей, как неудачная попытка чтения с диска.
Комментарии:
1. И теперь вы изменили состояние
skipws
флага, явно установленного пользователем. По крайней мере, попытайтесь восстановить его исходное значение.2. @K-ballo: И, как обычно, для этого есть библиотека Boost :-] boost.io государственные вкладчики