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 允许将文件变量用作标准和用户定义的子程序中的参数。 下面的例子说明了这个概念。 该程序创建一个名为 rainrain.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: Tutorials Point'); 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('webmaster@www.w3ccoo.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@www.w3ccoo.com Note to Students: For details information on Pascal Programming Contact: Tutorials Point
文件处理函数
Free Pascal 提供以下用于文件处理的函数/过程 −
序号 | 函数名称和描述 |
---|---|
1 |
procedure Append(var t: Text); 以附加模式打开文件 |
2 |
procedure Assign(out f: file; const Name:); 为文件指定名称 |
3 |
procedure Assign(out f: file; p: PChar); 为文件指定名称 |
4 |
procedure Assign(out f: file; c: Char); 为文件指定名称 |
5 |
procedure Assign(out f: TypedFile; const Name:); 为文件指定名称 |
6 |
procedure Assign(out f: TypedFile; p: PChar); 为文件指定名称 |
7 |
procedure Assign(out f: TypedFile; c: Char); 为文件指定名称 |
8 |
procedure Assign(out t: Text; const s:); 为文件指定名称 |
9 |
procedure Assign(out t: Text; p: PChar); 为文件指定名称 |
10 |
procedure Assign(out t: Text; c: Char); 为文件指定名称 |
11 |
procedure BlockRead(var f: file; var Buf; count: Int64; var Result: Int64); 将文件中的数据读入内存 |
12 |
procedure BlockRead(var f: file; var Buf; count: LongInt; var Result: LongInt); 将文件中的数据读入内存 |
13 |
procedure BlockRead(var f: file; var Buf; count: Cardinal; var Result: Cardinal); 将文件中的数据读入内存 |
14 |
procedure BlockRead(var f: file; var Buf; count: Word; var Result: Word); 将文件中的数据读入内存 |
15 |
procedure BlockRead(var f: file; var Buf; count: Word; var Result: Integer); 将文件中的数据读入内存 |
16 |
procedure BlockRead(var f: file; var Buf; count: Int64); 将文件中的数据读入内存 |
17 |
procedure BlockWrite(var f: file; const Buf; Count: Int64; var Result: Int64); 将数据从内存写入文件 |
18 |
procedure BlockWrite(var f: file; const Buf; Count: LongInt; var Result: LongInt); 将数据从内存写入文件 |
19 |
procedure BlockWrite(var f: file; const Buf; Count: Cardinal; var Result: Cardinal); 将数据从内存写入文件 |
20 |
procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Word); 将数据从内存写入文件 |
21 |
procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Integer); 将数据从内存写入文件 |
22 |
procedure BlockWrite(var f: file; const Buf; Count: LongInt); 将数据从内存写入文件 |
23 |
procedure Close(var f: file); 关闭文件 |
24 |
procedure Close(var t: Text); 关闭文件 |
25 |
function EOF(var f: file):Boolean; 检查文件结尾 |
26 |
function EOF(var t: Text):Boolean; 检查文件结尾 |
27 |
function EOF: Boolean; 检查文件结尾 |
28 |
function EOLn(var t: Text):Boolean; 检查行尾 |
29 |
function EOLn: Boolean; 检查行尾 |
30 |
procedure Erase(var f: file); 从磁盘删除文件 |
31 |
procedure Erase(var t: Text); 从磁盘删除文件 |
32 |
function FilePos( var f: file):Int64; 文件中的位置 |
33 |
function FileSize(var f: file):Int64; 文件大小 |
34 |
procedure Flush(var t: Text); 将文件缓冲区写入磁盘 |
35 |
function IOResult:Word; 返回上次文件IO操作的结果 |
36 |
procedure Read(var F: Text; Args: Arguments);< 从文件读取到变量 |
37 |
procedure Read(Args: Arguments); 从文件读取到变量 |
38 |
procedure ReadLn(var F: Text; Args: Arguments); 从文件读入变量并转到下一行 |
39 |
procedure ReadLn(Args: Arguments); 从文件读取到变量并转到下一行 |
40 |
procedure Rename(var f: file; const s:); 重命名磁盘上的文件 |
41 |
procedure Rename(var f: file; p: PChar); 重命名磁盘上的文件 |
42 |
procedure Rename(var f: file; c: Char); 重命名磁盘上的文件 |
43 |
procedure Rename(var t: Text; const s); 重命名磁盘上的文件 |
44 |
procedure Rename(var t: Text; p: PChar); 重命名磁盘上的文件 |
45 |
procedure Rename( var t: Text; c: Char); 重命名磁盘上的文件 |
46 |
procedure Reset(var f: file; l: LongInt); 打开文件进行读取 |
47 |
procedure Reset(var f: file); 打开文件进行读取 |
48 |
procedure Reset(var f: TypedFile); 打开文件进行读取 |
49 |
程序重置(var t: Text); 打开文件进行读取 |
50 |
procedure Rewrite(var f: file; l: LongInt); 打开文件进行写入 |
51 |
procedure Rewrite(var f: file); 打开文件进行写入 |
52 |
procedure Rewrite(var f: TypedFile); 打开文件进行写入 |
53 |
procedure Rewrite(var t: Text); 打开文件进行写入 |
54 |
procedure Seek(var f: file; Pos: Int64); 设置文件位置 |
55 |
function SeekEOF(var t: Text):Boolean; 将文件位置设置为文件末尾 |
56 |
function SeekEOF: Boolean; 将文件位置设置为文件末尾 |
57 |
function SeekEOLn(var t: Text):Boolean; 将文件位置设置为行尾 |
58 |
function SeekEOLn: Boolean; 将文件位置设置为行尾 |
59 |
procedure SetTextBuf(var f: Text; var Buf); 设置文件缓冲区的大小 |
60 |
procedure SetTextBuf(var f: Text; var Buf; Size: SizeInt); 设置文件缓冲区的大小 |
61 |
procedure Truncate(var F: file); 截断该位置的文件 |
62 |
procedure Write(Args: Arguments); 将变量写入文件 |
63 |
procedure Write(var F: Text; Args: Arguments); 将变量写入文件 |
64 |
procedure Writeln(Args: Arguments); 将变量写入文件并附加换行符 |
65 |
procedure WriteLn(var F: Text; Args: Arguments); 将变量写入文件并附加换行符 |