Помощь с бестиповыми файлами - 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;

Объяснение кода листинга программы

Список элементов кода:

  1. Объявление процедуры writeStringTF с параметрами s:string, f:file, error:word.
  2. Объявление локальных переменных n, i: integer.
  3. Установка длины строки s в переменную n.
  4. Установка значения i равным 1.
  5. Вызов процедуры writeWordTF с аргументами n, f, error.
  6. Проверка значения error на равенство 0.
  7. Входящий цикл while для записи каждого символа строки s в файл f.
  8. Увеличение значения i на 1.
  9. Вызов процедуры ioresult для получения кода ошибки.
  10. Установка значения error равным ioresult.
  11. Проверка значения error на равенство 0.
  12. Выход из цикла while при достижении условия (i>n) or (error<>0).
  13. Проверка значения error после цикла while.
  14. Если error<>0, то вывод сообщения об ошибке записи в файл.
  15. Вывод символа новой строки.
  16. Вспомогательная процедура writeWordTF с аргументами n, f, error.
  17. Вывод символа новой строки.
  18. Если error=0, то вывод сообщения об успешной записи в файл.
  19. Вспомогательная процедура ioresult для получения кода ошибки.
  20. Вспомогательная процедура blockwrite для записи каждого символа строки s в файл f.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.571 из 5