Скачиваний:
46
Добавлен:
10.02.2015
Размер:
36.86 Кб
Скачать

Практикум 14. Конвертирование файлов

1.Вывести содержимое типизированного файла в текстовый файл.

2.Добавить в текстовый файл несколько строк.

3.Снова преобразовать текстовый файл в типизированный.

О конвертировании файлов

Под конвертированием файлов понимают преобразование формата представления данных в файле, включая как внутреннее представление данных, так и формат записи.

Например, в типизированном файле «File of double» значение 3.14 будет занимать 8 байт, а в текстовом файле строка из 4 символов «3.14» займет 4 байта.

Ситуация когда надо конвертировать файл встречается довольно часто. Рассматриваемая задача как раз относится к таким типичным ситуациям.

Type TSportMan = record

FIO, Club : string[50]; Time : real;

bh, bm, bl : 0..5;

end;

 

Var SportMan : TSportMan;

ns, i : word;

fs : File of TSportMan;

 

ft : Text;

 

BEGIN

AssignFile(fs, 'Bi_Athlon.dat');

Reset(fs);

ns:=0;

while not EoF(fs) do begin

inc(ns); read(fs, SportMan); with SportMan do

writeln(FIO:20, Club:10, Time:7:2, bh:3, bm:3, bl:3);

end;

CloseFile(fs);

Readln;

END.

BEGIN

AssignFile(fs, 'Bi_Athlon.dat');

AssignFile(ft, 'Bi_Athlon.txt');

Reset(fs); Rewrite(ft); ns:=0; while not EoF(fs) do

begin

inc(ns); read(fs, SportMan); with SportMan do

begin

writeln( FIO:20, Club:10, Time:7:2, bh:3, bm:3, bl:3);

writeln(ft, FIO:20, Club:10, Time:7:2, bh:3, bm:3, bl:3);

end;

end;

CloseFile(fs); CloseFile(ft); Readln;

END.

// Добавление записей в конец текстового файла Append(ft);

while True do begin

writeln('Add record ? No: Enter/Yes: Any String'); with SportMan do

begin

write('FIO = '); readln(FIO); if FIO = '' then Break; write('Club = '); readln(Club);

write('Time (min.sec) ='); readln(Time); write('bh bm bl (0..5)='); readln(bh, bm, bl); writeln( FIO:20, Club:10, Time:7:2,

bh:3, bm:3, bl:3); writeln(ft, FIO:20, Club:10, Time:7:2,

bh:3, bm:3, bl:3);

end;

end;

CloseFile(ft);

Readln;

END.

Довольно распространенная ошибка чтения из текстового файла, когда запись содержит строки и числа

CloseFile(ft);

 

// Обратное преобразование

из текстового в типизированный

файл

 

Reset(fs);

 

Reset(ft);

 

while not EoF(ft) do

 

begin

 

with SportMan do

// читаем из текстового

readln(ft, FIO, Club, Time, bh, bm, bl);

write(fs, SportMan);

// записываем в типизированный

with SportMan do

// выводим на экран

writeln(FIO:20, Club:10, Time:7:2, bh:3, bm:3,

bl:3);

end;

CloseFile(fs);

CloseFile(ft);

Readln;

END.

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

1.Выделить из строки слова и, зная к какому типу принадлежат данные, содержащиеся в этом слове, выполнить соответствующее преобразование типов. Недостаток: поля ФИО и КЛУБ могут содержать пробелы, которые служат разделителем слов.

2.Если известно как записывалась строка, по какому формату, можно копировать фрагменты нужной длины с последующим удалением из строки. Недостаток: надо знать формат записи.

Поскольку данные имеют разные типы, есть смысл возвращать результат через вариантную переменную

Function StrToVariant(Var s : string; n : word) : variant;

Begin

//копируем фрагмент длиной n

//и удаляем его

Result:=copy(s, 1, n); delete(s, 1, n); End;

CloseFile(ft);

// Обратное преобразование из текстового в типизированный файл

Reset(fs);

 

Reset(ft);

 

while not EoF(ft) do

 

begin

 

readln(ft, s);

// Читаем в строку (s + Var)

with SportMan do

 

begin

 

FIO:=StrToVariant(s, 20);

Club:=StrToVariant(s, 10); Time:=StrToVariant(s, 7); bh:=StrToVariant(s, 3); bm:=StrToVariant(s, 3); bl:=StrToVariant(s, 3);

end;

 

 

записываем в типизированный

write(fs, SportMan);

//

with

SportMan do

//

выводим на экран

writeln(FIO:20, Club:10, Time:7:2, bh:3, bm:3, bl:3);

end;

CloseFile(fs);

CloseFile(ft);

Readln;

END.