Форум сайта python.su
Добрый день!
Нужно читать и обрабатывать числа из стандартного потока до тех пор, пока не встретиться EOF. Аналогичный код на C++ выглядит так:
int num;
while (cin>>num)
do_something(num)
Офлайн
Для чтения используем метод raw_input() и файловый объект sys.stdin.
Что такое EOF я не понял. Так же и что такое числа.
..bw
Офлайн
Про raw_input и sys.stdin я знаю. Мне не нужно считывать всю строку целиком. Мне нужно считать символ до первого разделительного символа(пробел, табуляция, конец строки), обработать, затем считать следующий.
EOF - символ конца файла. В консоли вызывается как CTRL+Z
Офлайн
Ну а почему не считать всю строку, а ее уже посимвольно разбирать?
Офлайн
Количество чисел может достигать 2^30. Хранить все ни к чему. Это задачка с ACM.
В С/С++ так можно сделать. Почему тут нельзя? Я даже код аналогичный привел.
Офлайн
Ничего не понимаю: 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.
...
Отредактировано (Авг. 17, 2010 11:19:21)
Офлайн
Вообще задача весьма низкоуровневая и решать ее средствами питона довольно странно… Ну да ладно - в академических целях:
EOF это символ с кодом -1 (вообще от платформы зависит). Т е в C, где есть getchar это обычно делается примерно так же как и показали:
#define EOF -1
...
main()
{
int c;
while ((c = getchar()) != EOF)
//do_something
...
}
for i in s:
if ord(i)<0: break
#do_something
Отредактировано (Авг. 17, 2010 12:25:28)
Офлайн
> ord(i)<0
Долго смеялся.
> не самая простая задача
def S():
while True:
yield sys.stdin.read(1)
s = iter(S())
Офлайн
bwНад чем, если не секрет?
> ord(i)<0
Долго смеялся.
bwИ что ваш код делает? Опять же если не секрет :)
> не самая простая задача
Код:
def S():
while True:
yield sys.stdin.read(1)
s = iter(S())
Офлайн
Теперь понятнее. Спасибо
Офлайн