在进行文件输入输出操作时可否免去文件变量参数?
可以,方法是设置默认输入输出文件。System单元提供了两个正文文件变量Input和Output,它们是默认的输入输出文件参数,在程序启动时,这两个变量会自动指向并打开默认的输入输出设备(如键盘和显示器),在程序结束后,这两个变量会自动关闭所指向的文件。你可以通过改变这两个变量所指向的文件来自定义默认输入输出文件,下面是一个简单的样例:
var
S: string;
procedure SetIOFiles(const InputName, OutputName: string);
begin
Close(Input);
Assign(Input, InputName);
Reset(Input);
Close(Output);
Assign(Output, OutputName);
Rewrite(Output);
end;
begin
SetIOFiles('Input.txt', 'Output.txt');
Readln(S); { inputs S from text file "Input.txt" }
Writeln(S); { outputs S to text file "Output.txt" }
end.
在DOS下,把文件名设为空串或者“con”可以指向默认的输入输出设备(如键盘和显示器)。
注意,在Free Pascal中,正文文件变量Input和Output不会在程序结束时自动关闭所指向的文件,这可能会造成输出数据遗失,因此你需要在程序结束的地方明确地关闭它们。
函数SeekEoln、SeekEof和Eoln、Eof有什么区别?
SeekEoln和Eoln用于判断文件行结束,SeekEof和Eof用于判断文件结束,但它们之间还是有区别的。Eoln和Eof只判断当前的所在位置是否位于行结束符上或者文件尾部,而SeekEoln和SeekEof会自动跳过所有连续的空格和制表符再进行判断,因此,在执行函数SeekEoln或SeekEof后,当前的所在位置不会是空格或者制表符。
为何我的程序结束后其输出文件无内容?
这可能是由于在输出数据后没有关闭输出文件所造成的,或许是你忘了在程序结束的地方关闭文件,也或许是在关闭文件前你的程序就在某个地方终止了。Pascal在向正文文件输出数据时,不一定立即就写进磁盘里,只要剩余缓冲区足够,Pascal会先把数据复制到正文文件变量内置的缓冲区中去,直到缓冲区满或者关闭文件时才真正把缓冲区内的数据写进磁盘文件中。但你可以在输出数据后调用System单元的过程Flush(var F: Text)来强制把缓冲区内所有的数据立即写进磁盘文件中并清空缓冲区。
如何设置正文文件缓冲区的大小?
Pascal不提供直接设置缓冲区大小的功能,但提供设置缓冲区的功能。在System单元中含有一个过程SetTextBuf(var F: Text; var Buf [ ; Size: Word ] ),使用它可以为正文文件自定义缓冲区,下面是一个简单的样例:
var
F: Text;
Buf: array[0..4095] of Byte;
begin
Assign(F, 'Input.txt');
SetTextBuf(F, Buf, SizeOf(Buf)); { or SetTextBuf(F, Buf); }
Reset(F); { or Rewrite(F); }
...
Close(F);
end.
注意,SetTextBuf必须在对文件进行任何读写操作之前使用,否则将会造成数据遗失,至少要紧跟在Reset、Rewrite或Append的后面。另外,由于Pascal为每个正文文件变量都内置了一个128字节的缓冲区,因此设置尺寸小于128字节的缓冲区是毫无意义的。一般情况下,设置一个8KB或16KB左右的缓冲区就可以使正文文件读写的速度显著提高了。