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

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

Мне нужно сделать такую штуку: считать с консоли какую-то информацию, потом переместить курсор вначало, и еще раз ее считать, можно ли это сделать с помощью cin/scanf?

Например, для файла это можно сделать примерно так. T.е. если в файле inp.txt находится: 4 1 2 3 1, то первый цикл считает это, in.clear(); очистит флаги, in.seekg(ios::beg); установит курсор в начало файла, второй цикл снова считает эти числа, и на экране будет:

X = 1
X = 2
X = 3
X = 1

как тоже самое проделать для консоли?

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

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

http://www.cplusplus.com/reference/clibrary/cstdio/rewind/ Перемещает каретку в начало.

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

    а разве эта ф-я не для работы с файлом?

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

      rewind(stdin); прекрасно работает.

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

        тыц это у меня нифига не работает, ждет еще ввода
        можете показать код, который прекрасно работает?

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

          Такой код работает здесь в запуске. Я думал консоль от стандартного ввода на джаджах не отличается.

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

            Насколько я знаю, на джаджах ввод/вывод перенаправляется с консоли на файлы. То есть программа думает, что работает с консолью, но снаружи ей подсовывают файл и говорят, что это консоль.

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

              это врядли, когда из файла, обычно из файла и есть.
              да и вообще, хотел бы узнать именно как это сделать в консоли, где бы то ни было, хоть локально, хоть в джаждах

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

Там неправда.

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

    О_о? а как это работает (точнее, у меня как раз таки не получается сделать, чтобы это работало)?

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

      Да, действительно не работает, я думал с консолью можно обращаться точно так же, как и с файлами. Более того, ни freopen("CON", "r", stdin); не начинает читать уже выведеную информацию из потока, ни fseek(stdin, SEEK_SET, 0);. Как в первом, так и во втором случае поток ждет ввода заново. Складывается впечатление, что так действительно нельзя сделать, с потоками в стиле С.

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

Стандартные потоки лучше рассматривать именно как потоки, а не файлы — ведь они могут быть связаны с объектами, которые не поддерживают операции позиционирования, например, терминал или канал (pipe). Эти объекты позволяют считывать или записывать данные, но не более того — для них не определено такое понятие, как текущая позиция, и они наверняка не хранят все данные, которые через них прошли.

Вместо этого можно считать данные в буфер/массив и пройтись два раза по этому массиву.