Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Tigran84Ответов: 2

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

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
  • Что вы хотите, чтобы он делал, и каким образом он этого не делает? Peter Lewerin 04.11.2015

tcltk

Ответы

Ответ 1 · рейтинг 4 · Dinesh

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

Попробуй это

set fid [open "file_name" r]

Ссылка: open

Ответ 2 · рейтинг 1 · Peter Lewerin

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

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, пространство имен, пакет, путы

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы