Я не могу прочитать файл построчно и получить строку в виде списка

Что не так в этом коде

set fid [open "file_name" a+]
while {[gets $fid line] > -1} {
    lappend short_keys_list [lindex $line 5]
    puts  $line 
}
close $fid
# while loop not working

person Tigran84    schedule 04.11.2015    source источник
comment
Что вы хотите, чтобы он делал, и каким образом он этого не делает?   -  person Peter Lewerin    schedule 04.11.2015


Ответы (2)


Поскольку вы открыли файл в режиме a+, указатель файла устанавливается на конец файла. Из-за этого вызов gets $fid line возвращает -1, поскольку ему нечего читать из файла, что приводит к завершению цикла while.

Попробуй это

set fid [open "file_name" r]

Ссылка: open

person Dinesh    schedule 04.11.2015

Вам ответили парой намеков на то, что не работает. Однако лучшее решение того, что вы, кажется, делаете, таково:

foreachLine line file_name {
    lappend short_keys_list [lindex $line 5]
    puts $line
}

Этот вызов позаботится об открытии и закрытии файла, чтении каждой строки файла и сохранении ее в указанном вами имени переменной (в данном случае line) и вызове вашего скрипта один раз для каждой строки. Чтобы это работало, вам сначала нужно подготовить пакет fileutil:

package require fileutil
namespace import ::fileutil::*

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

Документация: fileutil пакет, lappend, lindex, пространство имен, пакет, путы

person Peter Lewerin    schedule 04.11.2015