Pascal 文件处理

  • 文件处理

    Pascal 将文件视为一系列组件,这些组件必须是统一类型。文件的类型取决于组件的类型。文件数据类型定义为-
    
    type
    file-name = file of base-type;
    
    其中,基本类型(base-type)指示文件组件的类型。基本类型可以是整数,实数,布尔值,枚举,子范围,记录,数组和集和之类的东西,除了另一种文件类型。使用var声明创建文件类型的变量-
    
    var
    f1, f2,...: file-name;
    
    以下是定义一些文件类型和文件变量的一些示例-
    
    type
       rfile = file of real;
       ifile = file of integer;
       bfile = file of boolean;
       datafile = file of record
       arrfile = file of array[1..4] of integer;
    
    var
       marks: arrfile;
       studentdata: datafile;
       rainfalldata: rfile;
       tempdata: ifile;
       choices: bfile;
    
    创建和写入文件-
    让我们写一个程序,为学生的记录创建一个数据文件。它将创建一个名为students.dat的文件,并将一个学生的数据写入其中-
    
    program DataFiles;
    type
       StudentRecord = Record
          s_name: String;
          s_addr: String;
          s_batchcode: String;
       end;
    
    var
       Student: StudentRecord;
       f: file of StudentRecord;
    
    begin
       Assign(f,'students.dat');
       Rewrite(f);
       Student.s_name := 'John Smith';
       Student.s_addr := 'United States of America';
       Student.s_batchcode := 'Computer Science';
       Write(f,Student);
       Close(f);
    end.
    
    编译并运行后,该程序将在工作目录中创建一个名为students.dat的文件。您可以使用记事本等文本编辑器打开文件,以查看John Smith的数据。
  • 从文件读取

    我们刚刚创建并写入了一个名为“students.dat”的文件。现在,让我们编写一个程序,该程序将从文件中读取学生的数据-
    
    program DataFiles;
    type
       StudentRecord = Record
          s_name: String;
          s_addr: String;
          s_batchcode: String;
       end;
    
    var
       Student: StudentRecord;
       f: file of StudentRecord;
    
    begin
       assign(f, 'students.dat');
       reset(f); 
       while not eof(f) do
       
       begin
          read(f,Student);
          writeln('Name: ',Student.s_name);
          writeln('Address: ',Student.s_addr);
          writeln('Batch Code: ', Student.s_batchcode);
       end;
       
       close(f);
    end.
    
    编译并执行上述代码后,将产生以下结果-
    
    Name: John Smith
    Address: United States of America
    Batch Code: Computer Science
    
  • 文件作为子程序参数

    Pascal 允许将文件变量用作标准和用户定义的子程序中的参数。以下示例说明了此概念。该程序将创建一个名为rainfall.txt的文件,并存储一些降雨数据。接下来,它打开文件,读取数据并计算平均降雨量。请注意,如果在子程序中使用文件参数,则必须将其声明为var参数
    
    program addFiledata;
    const
       MAX = 4;
    type
       raindata = file of real;
    
    var
       rainfile: raindata;
       filename: string;
    procedure writedata(var f: raindata);
    
    var
       data: real;
       i: integer;
    
    begin
       rewrite(f, sizeof(data));
       for i:=1 to MAX do
       
       begin
          writeln('Enter rainfall data: ');
          readln(data);
          write(f, data);
       end;
       
       close(f);
    end;
    
    procedure computeAverage(var x: raindata);
    var
       d, sum: real;
       average: real;
    
    begin
       reset(x);
       sum:= 0.0;
       while not eof(x) do
       
       begin
          read(x, d);
          sum := sum + d;
       end;
       
       average := sum/MAX;
       close(x);
       writeln('Average Rainfall: ', average:7:2);
    end;
    
    begin
       writeln('Enter the File Name: ');
       readln(filename);
       assign(rainfile, filename);
       writedata(rainfile);
       computeAverage(rainfile);
    end.
    
    编译并执行上述代码后,将产生以下结果-
    
    Enter the File Name:
    rainfall.txt
    Enter rainfall data:
    34
    Enter rainfall data:
    45
    Enter rainfall data:
    56
    Enter rainfall data:
    78
    Average Rainfall: 53.25
    
  • 文本文件

    在 Pascal 中的文本文件由字符行组成,其中每行以行尾标记结尾。您可以将以下文件声明并定义为-
    
    type
    file-name = text;
    
    普通字符文件和文本文件之间的区别在于,文本文件被分成几行,每行以特殊的行尾标记终止,由系统自动插入。以下示例创建并写入一个名为contact.txt的文本文件-
    
    program exText;
    var
       filename, data: string;
       myfile: text;
    
    begin
       writeln('Enter the file name: ');
       readln(filename);
       
       assign(myfile, filename);
       rewrite(myfile);
       
       writeln(myfile, 'Note to Students: ');
       writeln(myfile, 'For details information on Pascal Programming');
       writeln(myfile, 'Contact: 菜鸟教程');
       writeln('Completed writing'); 
       
       close(myfile);
    end.
    
    编译并执行上述代码后,将产生以下结果-
    
    Enter the file name:
    contact.txt 
    Completed writing
    
  • 附加到文件

    追加到文件意味着写入已经具有一些数据的现有文件而不会覆盖该文件。以下程序说明了这一点-
    
    program exAppendfile;
    var
       myfile: text;
       info: string;
    
    begin
       assign(myfile, 'contact.txt');
       append(myfile);
       
       writeln('Contact Details');
       writeln('good@cainiaoya.com');
       close(myfile);
       
       (* let us read from this file *)
       assign(myfile, 'contact.txt');
       reset(myfile);
       while not eof(myfile) do
       
       begin
          readln(myfile, info);
          writeln(info);
       end;
       close(myfile);
    end.
    
    编译并执行上述代码后,将产生以下结果-
    
    Contact Details
    webmaster@cainiaoya.com
    Note to Students:
    For details information on Pascal Programming
    Contact: 菜鸟教程
    
  • 文件处理函数

    Free Pascal提供以下用于文件处理的函数/过程-
    函数/过程 说明
    procedure Append(var t: Text); 以追加模式打开文件
    procedure Assign(out f: file; const Name:); 为文件分配名称
    procedure Assign(out f: file; p: PChar); 为文件分配名称
    procedure Assign(out f: file; c: Char); 为文件分配名称
    procedure Assign(out f: TypedFile; const Name:); 为文件分配名称
    procedure Assign(out f: TypedFile; p: PChar); 为文件分配名称
    procedure Assign(out f: TypedFile; c: Char); 为文件分配名称
    procedure Assign(out t: Text; const s:); 为文件分配名称
    procedure Assign(out t: Text; p: PChar); 为文件分配名称
    procedure Assign(out t: Text; c: Char); 为文件分配名称
    procedure BlockRead(var f: file; var Buf; count: Int64; var Result: Int64); 从文件读取数据到内存
    procedure BlockRead(var f: file; var Buf; count: LongInt; var Result: LongInt); 从文件读取数据到内存
    procedure BlockRead(var f: file; var Buf; count: Cardinal; var Result: Cardinal); 从文件读取数据到内存
    procedure BlockRead(var f: file; var Buf; count: Word; var Result: Word); 从文件读取数据到内存
    procedure BlockRead(var f: file; var Buf; count: Word; var Result: Integer); 从文件读取数据到内存
    procedure BlockRead(var f: file; var Buf; count: Int64); 从文件读取数据到内存
    procedure BlockWrite(var f: file; const Buf; Count: Int64; var Result: Int64); 将数据从内存写入文件
    procedure BlockWrite(var f: file; const Buf; Count: LongInt; var Result: LongInt); 将数据从内存写入文件
    procedure BlockWrite(var f: file; const Buf; Count: Cardinal; var Result: Cardinal); 将数据从内存写入文件
    procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Word); 将数据从内存写入文件
    procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Integer); 将数据从内存写入文件
    procedure BlockWrite(var f: file; const Buf; Count: LongInt); 将数据从内存写入文件
    procedure Close(var f: file); 关闭文件
    procedure Close(var t: Text); 关闭文件
    function EOF(var f: file):Boolean; 检查文件结尾
    function EOF(var t: Text):Boolean; 检查文件结尾
    function EOF: Boolean; 检查文件结尾
    function EOLn(var t: Text):Boolean; 检查行尾
    function EOLn: Boolean; 检查行尾
    procedure Erase(var f: file); 从磁盘删除文件
    procedure Erase(var t: Text); 从磁盘删除文件
    function FilePos( var f: file):Int64; 在文件中的位置
    function FileSize(var f: file):Int64; 文件大小
    procedure Flush(var t: Text); 将文件缓冲区写入磁盘
    function IOResult: Word; 返回上一次文件IO操作的结果
    procedure Read(var F: Text; Args: Arguments); 从文件读取到变量
    procedure Read(Args: Arguments); 从文件读取到变量
    procedure ReadLn(var F: Text; Args: Arguments); 从文件读取到变量并转到下一行
    procedure ReadLn(Args: Arguments); 从文件读取到变量并转到下一行
    procedure Rename(var f: file; const s:); 重命名磁盘上的文件
    procedure Rename(var f: file; p: PChar); 重命名磁盘上的文件
    procedure Rename(var f: file; c: Char); 重命名磁盘上的文件
    procedure Rename(var t: Text; const s); 重命名磁盘上的文件
    procedure Rename(var t: Text; p: PChar); 重命名磁盘上的文件
    procedure Rename( var t: Text; c: Char); 重命名磁盘上的文件
    procedure Reset(var f: file; l: LongInt); 打开文件进行读取
    procedure Reset(var f: file); 打开文件进行读取
    procedure Reset(var f: TypedFile); 打开文件进行读取
    procedure Reset(var t: Text); 打开文件进行读取
    procedure Rewrite(var f: file; l: LongInt); 打开文件进行写入
    procedure Rewrite(var f: file); 打开文件进行写入
    procedure Rewrite(var f: TypedFile); 打开文件进行写入
    procedure Rewrite(var t: Text); 打开文件进行写入
    procedure Seek(var f: file; Pos: Int64); 设置文件位置
    function SeekEOF(var t: Text):Boolean; 将文件位置设置为文件末尾
    function SeekEOF: Boolean; 将文件位置设置为文件末尾
    function SeekEOLn(var t: Text):Boolean; 将文件位置设置为行尾
    function SeekEOLn: Boolean; 将文件位置设置为行尾
    procedure SetTextBuf(var f: Text; var Buf); 设置文件缓冲区的大小
    procedure SetTextBuf(var f: Text; var Buf; Size: SizeInt); 设置文件缓冲区的大小
    procedure Truncate(var F: file); 在位置截断文件
    procedure Write(Args: Arguments); 将变量写入文件
    procedure Write(var F: Text; Args: Arguments); 将变量写入文件
    procedure Writeln(Args: Arguments); 将变量写入文件并追加换行符
    procedure WriteLn(var F: Text; Args: Arguments); 将变量写入文件并追加换行符