Блог пользователя trionprog

Автор trionprog, 12 лет назад, По-русски

Пишу на С++. И тут появляется задание(тренировка СПБГУ#22 ) G,а в нём нужно вводить (я использую cin) неизвестное количество чисел,вот я и не знаю как отследить,что ввод был закончен.С файлом всё просто,а тут... Помогите

  • Проголосовать: нравится
  • +3
  • Проголосовать: не нравится

»
12 лет назад, # |
Rev. 4   Проголосовать: нравится +19 Проголосовать: не нравится
int x;
while (cin >> x) {
  // do smth
}

UPD. Some info

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

С файлом всё просто,а тут...

Можешь это место по-подробнее объяснить?

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    как я понял, топикстартеру с файлами проще потому что там EOF есть

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      BackendDeveloper имеет в виду, что тут EOF есть в точно таком же виде, как и в файлах.

    • »
      »
      »
      12 лет назад, # ^ |
      Rev. 5   Проголосовать: нравится +4 Проголосовать: не нравится

      В консоли это невозможно.

      UPD: слишком поздно написал

      UPD2: в консоли — имеется ввиду без файлов в codeblocks(или тому подобное) нажав на клавишу F9.

      UPD3: Извините за неправильный ответ. Раньше мне всегда твердили что это невозможно. Слова беру назад и большое спасибо Avitella и andreyv. Узнал что-то новое)

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится

        В linux консоли есть комбинация клавиш CTRL + D. Так что все возможно :)

      • »
        »
        »
        »
        12 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится +9 Проголосовать: не нравится

        Ещё как возможно:

        • Ctrl+Z, Enter под Windows
        • Ctrl+D под Linux
»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +8 Проголосовать: не нравится

Если нужен построчный ввод неизвестного количества данных поможет такое:

string s;
while (getline(cin, s))
    {
        //do domething
    }
»
12 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

еще же scanf-ом можно

int x; while (scanf("%d", &x) == 1){ //do smth }

»
12 лет назад, # |
Rev. 3   Проголосовать: нравится +10 Проголосовать: не нравится

Можно использовать итераторы:

  #include<iterator>

  ...

  std::istream_iterator<int> it(cin);
  std::istream_iterator<int> eos; // end-of-stream iterator
  int x;

  while (it != eos) {
    x = *it++;
    //
  }

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    В олимпиадах я такого не видел)

  • »
    »
    12 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится +1 Проголосовать: не нравится

    Моя не понимать. Вы тут объявили eos, но не инициализировали. Я правильно понимаю, что у него в стандартном конструкторе будет какая-то шняга, которая аналогична "бла-бла-бла" и позволяет понять, когда у нас конец ввода? Но тогда вопрос, в качестве так сказать инициализатора it мы передали cin, а почему без инициализатора будет то, что нам нужно? Объясните, пожалуйста, подробнее, а то лень копаться в референсах/исходниках и чекать у себя на компе, будет ли работать ваш пример.

    UPD. Скомипилилось и отработало. Объясните, почему.

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Вы понимаете правильно. Работает так потому что его так написали.

      Цитата отсюда

      A special value for this iterator exists: the end-of-stream; When an iterator is set to this value ... has been constructed using its default constructor (without associating it with any basic_istream object).