Автор: Пользователь скрыл имя, 07 Декабря 2011 в 22:34, лекция
Лекции по информатике.Потоки+нижний уровень
1.7. Файловый ввод-вывод в стиле языка С.
1.7.1. Файловый ввод-вывод с помощью потоков в стиле языка С.
Пример.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <io.h>
#include <string.h>
void main(void)
{ int i=5, j;
char s[10], s1[10];
int handle; // переменная под дескриптор
strсpy(s,”Иванов”);
if ((handle = open(”Test.txt”, 0_WRONLY|0_CREAT|0_BINARY)) = = -1)
{ShowMessage(“Ошибка создания файла”); return; }
write(handle, &i, sizeof(int)); // запись порядкового номера
write(handle, s, strlen(s)+1); // запись фамилии
close(handle); // закрытие файла
if((handle=open(“Test.
{ ShowMessage(“Ошибка открытия файла по чтению”); return; }
read(handle, &j, sizeof(int));
read(handle, s1,strlen(s)+1);
close(handle);
return; }
Пример
чтения/записи в стиле классического языка
С++, с использованием функций нижнего
уровня и дескрипторов.
1.7.3. Файловый ввод/вывод с помощью компонент Builder С++(для использования в лабораторной работе №4).
Достоинства файлового ввода-вывода с помощью компонент С++Builder:
Пример.
TStringList *MyList = new TStringList; //отложенное выделение памяти
AnsiString MyFile = “c:\\MyTest\\Test.dat”;
…
try
{MyList->LoadFromFile (MyFile);}
catch(…)
{ShowMessage (“Файл”\”+MyFile+”\”Не найден”);}
// Воспользовавшись свойством объекта BuilderC++ - списка строк Strings(i), i= " 0,MyList.Count-1
// свойство count содержит число строк в списке
For (i=0; i< MyList.Count ;i++)
{TEdit1->Ttext = MyList - >Strings(i); }
MyList ->SaveToFile(MyFile); //
сохранение файла
Весь текст располагается в свойстве списка строк Strings(int index). Каждая строка имеет тип данных AnsiString, т.е. обработав ее, можно получить требуемые данные, если известна последовательность размещения байт, например:
INN NSF DSF SUMMA INN
12 байт 2 байт 10 байт 8
байт 12 байт 2 байта 10 байт…
Рассмотрим основные методы класса TStringList, которые можно использовать в организации работы с файлами.
void Delete (Номер-Строки);
int
void Clear(void);
int
Add (const System:: Ans String S);
Данный метод возвращает индекс добавленной строки S.
void
Append (const System:: Ansi String S );
Данный метод не возвращает индекс добавленной строки S.
void
Insert (int Index, const System: :AnsiString S);
В визуальной системы программирования IDE Builder используются два метода, которые позволяют, во-первых, записать данные из потока, чтобы затем сохранить их в файле, во-вторых, сохранять данные считанные из файла в поток:
void
LoadFromStream(TStream*stream)
void
SaveToStream(TStream*Stream);
Более простым способом организации загрузки файла, его редактирования и сохранения является использование многострочных окон визуальной системы программирования IDE - Builder С++ – TMemo и TRichEdit. Последнее окно позволяет работать не только с обычными файлами, но и с файлами обогащенного формата RTF(например, созданными в редакторе «Word»).
В этом случае данные вводятся-выводятся в свойство Lines, которое имеет тип данных TStrings, а значит к нему применимы все вышеперечисленные методы.
TMemo * Memo1 = new TMemo;
{Memo1
или RishEdit1} - > Lines - > LoadFromFile(MyFile);
Компоненты Memo и RichEdit являются окнами редактирования многострочного текста. В них встроено использование “горячих” клавиш редактирования:
[^+C] – копирование выделенного фрагмента(строки),
[^+X] – удаление выделенного фрагмента(строки),
[^+V] – вставка из буфера,
[^+Z] – отмена выполненного действия.
Здесь также, использование методов Add, Clear и других позволяет организовать и программное редактирование строк файла.
При
открытии/закрытии файлов можно воспользоваться
стандартными диалогами операционной
системы WINDOWS.
1.7.4 Средства организации диалога при работе с файлами (для использования в лабораторной работе №5).
В визуальной системы программирования IDE - Builder С++ на панели «Мастеров» есть вкладка [Dialogs], которая позволяет использовать две специальные компоненты по открытию и сохранению файлов, которые как и компонента организации операционного меню –MainMenu - не видимы в процессе эксплуатации.
Экземпляр класса TOpenData создается кнопкой (класс открытия файла), как показано на рисунке 7.
Рис. 7. Размещение компоненты TOpenData в форме Form1.
По умолчанию свойству Name присваивается значение OpenDialog1. Наиболее важные свойства Вкладки Properties в Инспекторе объектов Object Inspector следующие.
а) Title – заголовок окна поиска файла.
б) Filter – служит для первоначальной фильтрации файлов (причем как по расширению, так и по наименованию). Допускается создание сложных масок с помощью оператора побитового сложения.
Проще всего свойство Filter задать с помощью редактора фильтров, вызываемого, если нажать кнопку […] справа от имени этого свойства в Инспекторе (см. рис. 8).
Рис. 8. Свойства Инспектора объектов Object Inspector компоненты TopenData.
в) Для открытия и сохранения файлов без указания их расширения можно использовать свойство DefaultExt = txt.
г) Свойство +Options, (подсвойство ofFileMustExist), позволяет управлять открытием несуществующего файла (=false).
д) В свойстве InitialDir – указывается открываемая директория по умолчанию.
Для открытия файла используется метод Execute():
AnsiString File_Name_Str; // Имя экземпляра класса
OpenDialog1- > Execute()
Метод возвращает значение true, если файл открыт конкретно, и false - в противном случае. Нужное имя будет сохранено в свойстве FileName экземпляра класса TОpenDialog.
File_Name->Str = OpenDialog-> FileName;
RichEdit1->
Экземпляр класса ТSaveDialog(класс сохранения файла служит для сохранения информации из файла в нужном окне, создавая стандартное окно сохранения операционной системы WINDOWS:
Рис. 9. Размещение компоненты ТSaveDialog в форме Form1.
Работа с данным экземпляром класса аналогична работе со свойствами класса TOpenDialog. Только при выполнении метода Execute() производится сохранение информации из файла, открытого методом
OpenDialog1->Execute();,
а свойство FileName будет иметь имя файла, используемого для сохранения.
Пример.
….
AnsiString F_N_Str;
// Метод реализации вызова пункта главного меню открытия файла - N6:
void_fastcall
TForm1::N6Click(Tobject*
{OpenDialog1->Еxecuti(); // вызов стандартного окна открытия файла
F_N_Str = OpenDialog1->FileName; // сохранение в переменой имени открытого файла
}
// Метод реализации вызова пункта главного меню сохранения файла – N7:
void fastcall TForm1: :N7click(TObject*Sender)
{
SaveDialog1->FileName = F_N_Str; // чтобы подставить имя в окне сохраняемого файла
SaveDialog1 ->Execute(); // вызов стандартного окна сохраняемого файла
RichEdit1->lines->
}
Пример (см. рис 10) окон открытия и сохранения файла:
Рис. 10. Примеры
использования компонент ТsaveD
1.7.5. Организация ввода-вывода в файлы в Builder С++(для использования в лабораторной работе №5).
В Builder С++ сохраняются способы работы с файлами:
Кроме того, Builder С++ добавлен свой набор функций, содержащихся в стандартном модуле “SysUtils”, что не требует подключения новых заголовочных файлов! Основными функциями здесь являются следующие.
1) Функция создания файла имеет формат:
int
FileCreate(Идентификатор-
AnsiString*
Отметим особенность, что идентификатор файла должен содержать полный путь доступа по каталогам. Если файл уже существует, то он уничтожается без предупреждения. При выполнении функция FileCreat() возвращает либо значение дескриптора, либо значение -1 (при ошибке). Символ разделитель окаймляется “\” чертой - \.
Const AnsiString File_Name = “c:\\tmp\\game.sol”;
int descr;
deskr = FileCreat(File_Name);
if(descr = = -1)
{ShowMessage (“Ошибка opening”); Return;}
2) Функция проверки существования файла:
bool
FileExists(Идентификатор-