Помощь с бестиповыми файлами - Free Pascal
Формулировка задачи:
Написал модуль для записи\чтения нужных мне типов данных в\из бестипового файла.Также сделал программу,тестирующую этот модуль. В общем входные данные не соответствуют выходным.
Модуль:
Тест:
unit fileworks; interface uses crt; procedure readStringFF(var s:string; var f:file; error:word); procedure readWordFF(var n:integer; var f:file; error:word); procedure readBooleanFF(var b:boolean; var f:file; error:word); procedure readRealFF(var r:real; var f:file; error:word); procedure writeStringTF(var s:string; var f:file; error:word); procedure writeWordTF(var n:integer; var f:file; error:word); procedure writeBooleanTF(var b:boolean; var f:file; error:word); procedure writeRealTF(var r:real; var f:file; error:word); implementation procedure writeWordTF(var n:integer; var f:file; error:word); begin {$I-} blockwrite(f,n,sizeof(n)); error:=ioresult; if error<>0 then writeln('Ошибка записи в файл №',error); {$I+} end; procedure writeStringTF(var s:string; var f:file; error:word); var n,i:integer; begin {$I-} n:=length(s); writeWordTF(n,f,error); if error=0 then while ((i<=n) and (error=0)) do begin blockwrite(f,s[i],1); error:=ioresult; i:=i+1; end; if error<>0 then writeln('Ошибка записи в файл №',error); {$I+} end; procedure writeBooleanTF(var b:boolean; var f:file; error:word); var n:byte; begin {$I-} case b of true: begin n:=0; blockwrite(f,n,1); end; false: begin n:=1; blockwrite(f,n,1); end; end; error:=ioresult; if error<>0 then writeln('Ошибка записи в файл №',error); {$I+} end; procedure writeRealTF(var r:real; var f:file; error:word); begin {$I-} blockwrite(f,r,sizeof(r)); error:=ioresult; if error<>0 then writeln('Ошибка записи в файл №',error); {$I+} end; procedure readRealFF(var r:real; var f:file; error:word); begin {$I-} blockread(f,r,sizeof(r)); error:=ioresult; if error<>0 then writeln('Ошибка чтения из файла №',error); {$I+} end; procedure readWordFF(var n:integer; var f:file; error:word); begin {$I-} blockread(f,n,sizeof(n)); error:=ioresult; if error<>0 then writeln('Ошибка чтения из файла №',error); {$I+} end; procedure readStringFF(var s:string; var f:file; error:word); var n:integer; c:char; begin {$I-} s:=''; readwordFF(n,f,error); if error<>0 then writeln('Ошибка чтения из файла №',error) else while ((n>0) and (error=0)) do begin blockread(f,c,1); error:=ioresult; if error<>0 then writeln('Ошибка чтения из файла №',error); s:=s+c; n:=n-1; end; {$I+} end; procedure readBooleanFF(var b:boolean; var f:file; error:word); var n:byte; begin {$I-} blockread(f,n,1); error:=ioresult; if error<>0 then writeln('Ошибка чтения из файла №',error) else case n of 0: b:=true; 1: b:=false; end; {$I+} end; begin end.
uses fileworks; var error:word; f:file;s:string;n:integer;b:boolean;r:real; begin s:='12233'; n:=123; b:=true; r:=13.23; assign(f,'test.dat'); rewrite(f,1); writeStringTF(s,f,error); writeWordTF(n,f,error); writeBooleanTF(b,f,error); writeRealTF(r,f,error); close(f); writeln('12233,123,true,13.23'); reset(f,1); readStringFF(s,f,error); readWordFF(n,f,error); readBooleanFF(b,f,error); readRealFF(r,f,error); close(f); writeln(s,',',n,',',b,',',r:6:2); readln; end.
Решение задачи: «Помощь с бестиповыми файлами»
textual
Листинг программы
procedure writeStringTF(var s:string; var f:file; error:word); var n,i:integer; begin {$I-} n:=length(s); i := 1; // <--- Необходимость этого действия не надо объяснять? writeWordTF(n,f,error); // Error не будет содержать код ошибки !!! if error=0 then while ((i<=n) and (error=0)) do begin blockwrite(f,s[i],1); error:=ioresult; i:=i+1; end; if error<>0 then writeln('Ошибка записи в файл №',error); {$I+} end;
Объяснение кода листинга программы
Список элементов кода:
- Объявление процедуры writeStringTF с параметрами s:string, f:file, error:word.
- Объявление локальных переменных n, i: integer.
- Установка длины строки s в переменную n.
- Установка значения i равным 1.
- Вызов процедуры writeWordTF с аргументами n, f, error.
- Проверка значения error на равенство 0.
- Входящий цикл while для записи каждого символа строки s в файл f.
- Увеличение значения i на 1.
- Вызов процедуры ioresult для получения кода ошибки.
- Установка значения error равным ioresult.
- Проверка значения error на равенство 0.
- Выход из цикла while при достижении условия (i>n) or (error<>0).
- Проверка значения error после цикла while.
- Если error<>0, то вывод сообщения об ошибке записи в файл.
- Вывод символа новой строки.
- Вспомогательная процедура writeWordTF с аргументами n, f, error.
- Вывод символа новой строки.
- Если error=0, то вывод сообщения об успешной записи в файл.
- Вспомогательная процедура ioresult для получения кода ошибки.
- Вспомогательная процедура blockwrite для записи каждого символа строки s в файл f.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д