Поток строк C

#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 (ie bool canReadMore = (bool)textIn; ) и приведений в стиле функции. Предпочтительный подход заключается в использовании явного стиля C static_cast вместо этого, например: bool canReadMore = static_cast<bool>(textIn);