#c #stream
#c #поток
Вопрос:
Я только учусь использовать потоки в C , и у меня есть один вопрос.
Я думал, что каждый поток имеет состояние true или false. Я хочу ввести каждое слово из приведенной ниже строки и 1, пока не появится слово, но я получаю сообщение об ошибке:
не удается преобразовать ‘std::istringstream {он же std::__cxx11::basic_istringstream<char>}’ в ‘bool’ при инициализации
bool canReadMore = textIn;
Это должно быть похоже:
антилопа 1 ant 1 антагонист 1 антидепрессант 1
Что я делаю не так?
int main() {
std:: string text = "antilope ant antagonist antidepressant";
std:: istringstream textIn(text);
for(int i = 0; i < 5; i ){
std:: string s;
textIn >> s;
bool canReadMore = textIn;
std::cout << s << std:: endl;
std::cout << canReadMore << std:: endl;
}
return 0;
}
``1
Ответ №1:
Начиная с C 11, std::istringstream
оператор bool
является явным. Это означает, что вы должны явно выполнить приведение самостоятельно:
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string text = "antilope ant antagonist antidepressant";
std::istringstream textIn(text);
for (int i = 0; i < 5; i ) {
std::string s;
textIn >> s;
bool canReadMore = bool(textIn);
std::cout << s << std::endl;
std::cout << canReadMore << std::endl;
}
return 0;
}
Вывод:
./a.out
antilope
1
ant
1
antagonist
1
antidepressant
1
0
Теперь, если вы используете std::stringstream
в контексте bool, преобразование будет автоматическим. Это идиоматическое использование:
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string text = "antilope ant antagonist antidepressant";
std::istringstream textIn(text);
std::string s;
while (textIn >> s) {
std::cout << s << "n";
}
}
Вывод:
antilope
ant
antagonist
antidepressant
Комментарии:
1.Что еще более важно, обратите внимание, как в исходной версии перед завершением цикла печатается пустая строка. Это потому, что
fail
флаг устанавливается после чтения строки (>>
). Поэтому его следует проверять после>>
, а не до.2. Большое вам спасибо
3. Обратите внимание, что
bool canReadMore = bool(textIn)
это приведение в стиле функции, и, хотя это будет работать, следует по возможности избегать приведений в стиле старого C (iebool canReadMore = (bool)textIn;
) и приведений в стиле функции. Предпочтительный подход заключается в использовании явного стиля Cstatic_cast
вместо этого, например:bool canReadMore = static_cast<bool>(textIn);