По крайней мере, с Rebol2
read/lines/direct/part %file.txt 1
должен приблизиться к тому, что вы хотите
, но если вы хотите, чтобы все линии одна линия за другой, это должно быть как
f: open/lines/direct %test.txt
while [l: copy/part f 1] [print l]
В теории вы можете заменить любую функцию, даже туземцев. Я попытаюсь дать новому Foreach
foreach_: :foreach
foreach: func [
"Evaluates a block for each value(s) in a series or a file for each line."
'word [get-word! word! block!] {Word or block of words to set each time (will be local)}
data [series! file! port!] "The series to traverse"
body [block!] "Block to evaluate each time"
/local port line
] [
either any [port? data file? data] [
attempt [
port: open/direct/lines data
while [line: copy/part port 1] [
set :word line
do :body
line
]
]
attempt [close port]
] [
foreach_ :word :data :body
]
]
Вероятно, набора: слово линии части и попытку должна быть более подробно, с тем чтобы избежать конфликтов имен и получить значимые ошибки.
Но не 'открытые/линий/direct' загружать весь файл в память? Это то, чего я пытаюсь избежать, по моему вопросу. – mydoghasworms
Нет, 'open делает именно это - открывает файл. В то время как чтение читает. Ну, может быть, 'open bufferst в некоторых режимах, но есть также режим поиска, который вы могли бы использовать - http://www.rebol.com/article/0199.html – pekr
Из личного опыта я могу подтвердить, что open/lines/direct может использовать меньше памяти, чем открытые/линии. Но вы увидите разницу просто, если вы откроете большие файлы. Вероятно, существует минимальный внутренний буфер, который будет всегда заполняться первым. – sqlab