Найти - Пользователи
Полная версия: Чтение чисел из stdin до EOF
Начало » Python для новичков » Чтение чисел из stdin до EOF
1 2
zayac
Добрый день!
Нужно читать и обрабатывать числа из стандартного потока до тех пор, пока не встретиться EOF. Аналогичный код на C++ выглядит так:
int num;
while (cin>>num)
do_something(num)
Как такое сделать на Python?
Спасибо
bw
Для чтения используем метод raw_input() и файловый объект sys.stdin.
Что такое EOF я не понял. Так же и что такое числа.

..bw
zayac
Про raw_input и sys.stdin я знаю. Мне не нужно считывать всю строку целиком. Мне нужно считать символ до первого разделительного символа(пробел, табуляция, конец строки), обработать, затем считать следующий.
EOF - символ конца файла. В консоли вызывается как CTRL+Z
guranvir
Ну а почему не считать всю строку, а ее уже посимвольно разбирать?
zayac
Количество чисел может достигать 2^30. Хранить все ни к чему. Это задачка с ACM.
В С/С++ так можно сделать. Почему тут нельзя? Я даже код аналогичный привел.
bw
Ничего не понимаю: sys.stdin.read(1)

> В консоли вызывается как CTRL+Z
В этом случае ловите исключение KeyboardInterrupt. Но если источник не “клавиатура”, а /dev/random, тогда я не понимаю как интерпретировать EOF/CTRL+Z.

$ python -c“import sys; print repr(sys.stdin.read(1))”
ы
'\xd1'
$ echo “qwerty” | python -c“import sys; print repr(sys.stdin.read(1))”
'q'
$ python -c“import sys; print repr(sys.stdin.read(1))”
^CTraceback (most recent call last):
File “<string>”, line 1, in <module>
KeyboardInterrupt

> Я даже код аналогичный привел.
Я так же знаю C++, как вы Python.

p.s.
>>> import sys
>>> type(sys.stdin)
<type 'file'>
>>> help(file)
Help on class file in module __builtin__:

class file(object)
| file(name[, mode[, buffering]]) -> file object
|
| Open a file. The mode can be 'r', 'w' or 'a' for reading (default),
...
| read(...)
| read([size]) -> read at most size bytes, returned as a string.
...
| readline(...)
| readline([size]) -> next line from the file, as a string.
...
..bw
Alex2ndr
Вообще задача весьма низкоуровневая и решать ее средствами питона довольно странно… Ну да ладно - в академических целях:
EOF это символ с кодом -1 (вообще от платформы зависит). Т е в C, где есть getchar это обычно делается примерно так же как и показали:
#define EOF -1 
...
main()
{
int c;

while ((c = getchar()) != EOF)
//do_something
...
}
Получаем по одному символу, сравниваем их с -1 (ну или проверяем на то, что они больше 0) и в случае нахождения прекращаем цикл.
Такой же функционал в питоне можно сделать с полпинка:
for i in s:
if ord(i)<0: break
#do_something
где s должен быть некий генератор, отдающий по одному символу за раз(аналог getchar()).

НО основная проблема тут как раз в том, как сделать такой вот генератор позволяющий получать по одному символу за раз, в обход буфера консоли и тд и тп. Имхо в общем случае не самая простая задача. Вы бы уточнили условия(хотя бы платформу).
bw
> ord(i)<0
Долго смеялся.

> не самая простая задача
def S():
while True:
yield sys.stdin.read(1)

s = iter(S())
..bw
Alex2ndr
bw
> ord(i)<0
Долго смеялся.
Над чем, если не секрет?

bw
> не самая простая задача
Код:

def S():
while True:
yield sys.stdin.read(1)

s = iter(S())
И что ваш код делает? Опять же если не секрет :)
zayac
Теперь понятнее. Спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB