
- •Практикум 14. Конвертирование файлов
- •О конвертировании файлов
- •BEGIN
- •BEGIN
- •// Добавление записей в конец текстового файла Append(ft);
- •Довольно распространенная ошибка чтения из текстового файла, когда запись содержит строки и числа
- •Проблема заключается в необходимости предварительного анализа данных, содержащихся в строке. Имеется как минимум
- •CloseFile(ft);
Практикум 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.