Уроки Tcl

Начало Уроки Tk Файлы
Статьи Уроки Tcl Гостевая книга
Предыдущий урок - #23: Перебор значений массива

#24: Работа с файлами

Tcl работает с файловой системой через систему буферов. Этот механизм представляет файл как поток символов, который начинается с началом файла и заканчивается в конце файла. Таким образом, работа с файлом выглядит аналогично простому выводу данных на экран командой puts, только добавляется новый аргумент. Данные из файла читаются командой gets, и так же могут считываться с клавиатуры.

Перед началом работы с файлом программа должна открыть файл для каких-нибудь действий (чтение, запись, или оба) командой open. Как только файл откроется, программа может выполнить gets или puts для чтения или записи информации.

Так же программа может использовать seek для передвижения позиции в файле. После передвижения gets и puts будут работать с новой позицией.

Когда программа закончит работать с файлом, следует его закрыть. Число одновременно открытых программой файлов ограничено операционной системой.. Поэтому если не закрывать файлы, то программа может перестать работать.

Команды для работы с файлами следующие:

open имяФайла ?доступ?
    Открывает файл и возвращает указатель, который используется для доступа командами gets, puts, close и другими. имяФайла - имя файла, который будет открыт. Желательно, с указанием полного пути к нему. доступ - режим работы с файлом.
  • r - Режим чтения. Файл должен существовать.
  • r+ - Режим чтения и записи. Файл должен существовать.
  • w - Режим записи. Создаёт файл если он не существует, или обнуляет существующий.
  • w+ - Режим записи и чтения. Создаёт файл в случае необходимости, или обнуляет существующий.
  • a - Режим добавления, открывает файл для записи. Файл должен существовать. Текущая позиция устанавливается на конец файла.
  • a+ - Режим добавления, открывает на запись. Если файл не существует, то создаётся. Если существует - позиция устанавливается на конец файла.
close файл
    Файл - указатель на файл. Команда закрывает файл открытый open.
gets файл ?имяПерем?
    Считывает строку из файла, и удаляет символ новой строки.
Если задан аргумент имяПерем, gets возвращает количество прочитанных символов (или -1 если достигнут конец файла), и помещает прочитанную строку в имяПерем.
Если имяПерем не задано, то gets возвращает прочитанную строку. Пустая строка может быть возвращена в случае если прочитана пустая строка из файла, или достигнут конец файла.
puts ?-nonewline? ?файл? строка
    Записывает строку в файл. Если файл не задан, то выводится на экран.
read ?-nonewline? файл
    Читает все оставшиеся символы из файла, и возвращает как строку. Если задана опция -nonewline, то если последний символ новой строки - он будет удалён.
read файл колСимв
    Читает не более колСимв символов из файла и возвращает как строку.
seek файл позиция ?отсчет?
    Изменяет текущую позицию работы с файлом. Позиция - количество символов, на которую будет сдвинута текущая позиция. С помощью аргумента отсчет можно поменять точку отсчета позиции. Значение отсчет может быть одним из:
  • start - позиция измеряется от начала файла.
  • current - позиция измеряется от текущей позиции в файле.
  • end - позиция измеряется от конца файла.
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

Следующий урок - #25:
Горбачев "Yurez" Юрий  
Хостинг от uCoz