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

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

Мне нужно сделать такую штуку: считать с консоли какую-то информацию, потом переместить курсор вначало, и еще раз ее считать, можно ли это сделать с помощью 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
  • Проголосовать: не нравится

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

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

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

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

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

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

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

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

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

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

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