Уроки Tcl
#24: Работа с файлами |
Tcl работает с файловой системой через систему буферов. Этот механизм представляет файл как поток символов, который начинается с началом файла и заканчивается в конце файла. Таким образом, работа с файлом выглядит аналогично простому выводу данных на экран командой puts, только добавляется новый аргумент. Данные из файла читаются командой gets, и так же могут считываться с клавиатуры.
Перед началом работы с файлом программа должна открыть файл для каких-нибудь действий (чтение, запись, или оба) командой open. Как только файл откроется, программа может выполнить gets или puts для чтения или записи информации.
Так же программа может использовать seek для передвижения позиции в файле. После передвижения gets и puts будут работать с новой позицией.
Когда программа закончит работать с файлом, следует его закрыть. Число одновременно открытых программой файлов ограничено операционной системой.. Поэтому если не закрывать файлы, то программа может перестать работать.
Команды для работы с файлами следующие:
open имяФайла ?доступ? | |
Открывает файл и возвращает указатель,
который используется для доступа командами gets, puts, close и другими.
имяФайла - имя файла, который будет открыт.
Желательно, с указанием полного пути к нему.
доступ - режим работы с файлом.
| |
close файл | |
Файл - указатель на файл. Команда закрывает файл открытый open. | |
gets файл ?имяПерем? | |
Считывает строку из файла,
и удаляет символ новой строки. Если задан аргумент имяПерем, gets возвращает количество прочитанных символов (или -1 если достигнут конец файла), и помещает прочитанную строку в имяПерем. Если имяПерем не задано, то gets возвращает прочитанную строку. Пустая строка может быть возвращена в случае если прочитана пустая строка из файла, или достигнут конец файла. | |
puts ?-nonewline? ?файл? строка | |
Записывает строку в файл. Если файл не задан, то выводится на экран. | |
read ?-nonewline? файл | |
Читает все оставшиеся символы из файла, и возвращает как строку. Если задана опция -nonewline, то если последний символ новой строки - он будет удалён. | |
read файл колСимв | |
Читает не более колСимв символов из файла и возвращает как строку. | |
seek файл позиция ?отсчет? | |
Изменяет текущую позицию работы с файлом.
Позиция - количество символов, на которую будет сдвинута
текущая позиция. С помощью аргумента отсчет можно поменять
точку отсчета позиции. Значение отсчет может быть одним из:
| |
tell файл | |
Возвращает номер текущей позиции в файле. | |
flush файл | |
Записывает все данные файла, хранящиеся в буфере. | |
eof файл | |
Возвращает 1 если достигнут конец файла, иначе 0. |
Вот несколько моментов, которые следует помнить при работе с файлами:
Есть несколько стандартных указателей на файлы, которые создаются автоматически при запуске программы. Их можно использовать так же, как и обычные указатели:
Работа с файлом осуществляется через буфер. Когда вы записываете данные, то они хранятся в памяти до того момента, пока процессор освободится, и они будут записаны на диск. Можно заставить компьютер записать данные на диск командой flush. Когда вы используете close или программа завершается, данные так же скидываются на диск. Однако при сбое буфер может не записаться на диск, и данные будут потеряны.
Количество открытых файлов ограничено, поэтому помните о том, что надо закрывать неиспользуемые файлы.
Чтобы определить конец файла используйте команду eof перед чтением очередной строки.
Вы не можете изменять существующие данные файла, если файл открыт в режиме добавления (a).
Открытие в режиме w+ позволяет изменять записанные данные, но очищает файл перед использованием.
Открывая файл в режиме r+ вы можете изменять его. Но можно открыть только существующий файл.
Все данные в Tcl хранятся как строки символов. Поэтому читая двоичный файл результат получится непредсказуем.
set fileid [open "testfile" w+] seek $fileid 0 start puts $fileid "Это тест.\nПросто тест." seek $fileid 0 start set chars [gets $fileid line1]; set line2 [gets $fileid]; puts "$chars символов в строке \"$line1\"" puts "Вторая строка в файле: \"$line2\"" seek $fileid 0 start set buffer [read $fileid]; puts "\nВ файле содержится текст:\n$buffer" close $fileid |
Горбачев "Yurez" Юрий |