ag旗舰厅官网_ag旗舰厅下载客户端

热门关键词: ag旗舰厅官网,ag旗舰厅下载客户端

ag旗舰厅

当前位置:ag旗舰厅官网 > ag旗舰厅 > Delphi中用来读写的文件类型精髓篇,delphi文件操

Delphi中用来读写的文件类型精髓篇,delphi文件操

来源:http://www.pedaLyourcycLe.com 作者:ag旗舰厅官网 时间:2019-11-12 10:46

一.旧pascal文件类型

Delphi中默认有input和output两个文件变量,使用可以不用定义,直接使用.
  但: input:只读、output:只写。用时注意以免引起异常.

用文件变量表示的文件类型,比如 F:text,F:File. 定义了三类:有类型,无类型,字符类型以及一些Delphi的文件操作函数.比如:AssignPrn,Writeln,这些文件类和Windows文件句柄不兼容

文件是由文件名标识的一组数据的集合,文件通常存放在磁盘上。源程序、学生档案记录、图形、音乐等均可以作为文件存储在磁盘上。操作系统是以文件为单位对数据进行管理的,也就是说,如果想读取外存介质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数据。要向外存介质上存储数据,也必须先建立一个文件(以文件名标识),才能向它输出数据。
在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上,以后需要时再从磁盘中输入到计算机内存。这就要用到磁盘文件。
1.文件类型 
file是一个文件类型说明符,通过file可以定义文件变量,也可以定义一些新的类型。在Delphi中支持下面3种类型的文件:即文本文件、类型文件和无类型文件(也称二进制文件)。下面依次介绍3种文件类型变量的定义及使用方法。
Delphi程序设计中,对任何一种文件的操作都可以归纳为:建立_打开_读/写_关闭。
2. 文本文件
  (**** 转载敬请注明-本文出处:南山古桃(nsgtao)的百度空间: ****)
2.1 文本文件的概念

二.Windows文件句柄(handle)

  在Delphi中定义了TextFile类型表示文本文件,由字符的ASCII码组成,最小存取单位为字符。文本文件也称为ASCII码文件。利用常见的文字编辑器可以浏览支件内容。
  文本文件是以行为单位进行读、写操作的。由于每一行长度不一定相同,不能计算出给定行在文件中的确切位置,因而只能顺序地读写。在一个打开的文本文件上同时进行读、写操作是不允许的。

面向对象的Pascal的文件句柄封装了Windows文件句柄类型,文件操作函数库则封装了Windows API函数,比如"Fileread"就是调用了Windows API数"ReadFile",Delphi提供了一个Windows API操作接口如果熟悉Windows API,可以用Windows文件句进行文件操作.

2.2 文本文件变量的定义
定义文件变量的语法格式如下:
var <文件变量名>:TextFile;
例如,Var myTextFile : TextFile;就定义了一个文本文件变量myTextFile,下面就可以通过此变量引用一个文本文件。

三.文件流(File Streams)

2.3 文本文件的使用

文件流是TFileStream类的对象实例,文件流是高层的文件操类型,TFileStream提供了一个句柄属性.用此属性可操作Windows文件句柄类型.

(1)文件变量与文件关联
在使用文件变量进行文件操作之前,需要将文件变量与要操作的文件关联,即给文件变量名赋值。文件变量赋值可以使用过程AssignFile,过程的说明语法格式如下:
procedure AssignFile(Var F;FileName:string);
其中,F为文件变量名,定义为无类型参数是为了和所有文件类型兼容;FileName是文件名字符串,是包括路径的文件全称名。例如,AssignFile (F,'e:delphiprogramextl.txt’);就将文件变量F和指定的文件e:delphiprogramextl.txt关联起来。后面所有对变量f的操作都是对指定文件的操作。

如何选择文件类型

(2)使用文件变量打开文件
使用不同的过程打开文件,有3种方式:
procedure Rewrite(var F~File[;recsize:word]);
这个过程创建并打开文件,可以对文件进行写。这里的F是一个已经和指定文件名关联的文件变量。对于一个已存在的文件,此操作将覆盖原文件;如果文件不存在,将建立一个新的空文件。若是类型文件(下一小节介绍),可用recsize指定大小。·
procedure Reset(var F:File[;RecSize:Word]);
使用Reset过程以读的方式打开一个文件,此时只能从文件中读取数据。f为文件变量,打开文件后,文件指针指向文件开头。如果试图用reset过程打开一个不存在的文件时,将有I/O错误产生。
procedure.Append(var F:’Fext);
使用Append过程向已存在的文件追加文本,这个过程仅用于文本文件。当用append过程打开文件时,文件指针指向文件的尾部,此后输入的数据将添加在文件原有数据的后面。该过程打开的文件(即F关联的文件)必须存在,否则也将出现I/O错误。
(3)读/写文件
①读取文件内容。在以读的方式打开文件后,可以使用read和readln语句来读取文件内容,其声明代码格式分别为:
procedure read([var F:’Fext;]V1[,V2,…,Vn]);
procedure readln([var F:’text;]v1[,V2,···,Vn]);
其中,F为文件变量。v1、v2、…、vn等为需要输入的变量,其类型可以为字符串、字符、整数和实数类型。read和readln的区别为后者在读取数据后,将文件指针移至下一行,上次读取的数据与回车符之间的数据被忽略。
当读取字符串时,必须用readln过程,否则读完一行数据后,再使用read读取字符串将得到空串。当读取整型和实型数据时,文件中的数据用空格分隔,且必须符合数据格式,否则将产生I/O错误。
在读取文件时,还必须判断文件指针是否已到文件尾部,此时可以用Eof函数进行判断,其声明代码如下:
function Eof[(‘var F:’rext)]:Boolean;
当文件指针指到尾部时,该函数返回值为true。
②向文件写入数据。以写的方式打开文件后,即可向其中写入数据,写人数据使用write和writeln过程,其声明代码如下:
procedure writeln([var F:’rext;]p 1[,p2,…,pn]);
procedure write([var F:‘rext;]p 1[,p2,‘·‘,pn]);
与read相似,p 1、p2、…、pn等为需要输出的变量,可以是字符串、字符、整数和实数类型。一writeln在写入数据后还会附加上回车和换行符,而下次要写入的数据将写在新的一行。
写人数据时系统自动将数据转化为字符串形式,1)~ASCII码的形式保存在文件中。

Windows文件句柄是较底层的文件操作类型,提供了灵活的同步及异步文件读写控制,以下提供用Windows文件句柄类型对文件同步及异步操作的伪代码描述:

(4)使用文件变量关闭文件
无论是输入或输出,在对文件操作完成后,都应关闭文件。关闭文件使用CloseFile过程,其声明代码如下:
procedure CloseFile(var F);
关闭文件后,系统释放打开文件时使用的资源。特别是写文件时,在调用write和writeln过程时,数据先写入内存缓冲区,只有在缓冲区满或关闭文件时,才把数据真正写入磁盘文件中,因此写完数据后不关闭文件可能丢失数据。
例2.15 使用Rewrite()过程在程序运行的当前目录下创建一个文本文件file.txt,并向文件中增加5行文本。

同步操作:

Var
textf:TextFile; //定义文件变量textf
S:String;
i:Integer;
begin 
AssignFile(textf,'file.txt'); //将文件变量textf与当前目录中的“file.txt"文件关联
Rewrite(textf); //创建文件或打开已存在的文件进行覆盖
for i:=1 to 5 do
begin
S := 'This is Line#';
writeln(textf,s,i);
end;
CloseFile(textf); //关闭已打开的文件textf
end.
被创建的文件中包含5行文本,如第3行为:This is line#3。
若要向一个已存在的文件追加新文本,应将其中的rewrite改为append。以上程序是向文件中写入字符串和整数。其实,Object Pascal对于所有的数据类型都可以这样处理。下面的程序演示了从文本文件中读取数据的方法。
写入文件 
Var 
F : Textfile; //申明变量 
Begin 
AssignFile(F,'c:ek.txt'); //让变量F和C:ek.txt关连 
ReWrite(F); {Create a new file named ek.txt} 
Writeln(F,'你要写入文本文件的内容'); //写入文件 
Closefile(F); //释放变量F 
End; 
读取文件 
Var 
F : Textfile; 
str:String; 
Begin 
AssignFile(F, 'c:ek.txt'); {Assigns the Filename} 
Reset(F); {Opens the file for reading} 
Readln(F, str); 
ShowMessage('1. line of textfile:' +str); 
Closefile(F); {Closes file F} 
End;

bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead, NULL) ;
            // check for eof
            if (bResult && nBytesRead == 0, ) {
            // we"re at the end of the file
            }

下面转自
var f:text;
...
AssignFile(f,'c:1.txt');
ReWrite(f);
Writeln(f,'This is a test');
CloseFile(f);
...
其中Rewrite是新建文件,若换成Reset则为打开文件
Writeln为行写入并换行,Write为写入不换行,Readln为读一行并换行,Read为读但不换行

异步操作:

delphi 读写文件方法有很多种:
我送你一贴:
程序设计当中我们时常遇到需要处理文件、目录及驱动器的情况,本章将对如何处理不同类型的文件进行讲述。本章包括如何使用T F i l e S t r e a m 类封装文件的输入/输出以及如何利用3 2 位Wi n d o w s 的主要特征—内存映射文件。你将学习到如何创建一个封装了内存映射文件功能的T M e m o r y M a p p e d F i l e类,并用它在文本文件中进行文本查询。本章还提供了一些关于选择驱动器、在树型目录中查询文件及获取文件版本信息的方法。本章将使你对文件、目录及驱动 器有深入的认识。
处理文件的输入/输出
你将要对三种文件进行处理:文本文件、类型文件和二进制文件。
以下几节是关于文件输入/输出的讲解。文本文件指可被任意文本编辑器读取的A S C I I 文本。类型文件指包含由程序员定义的数据类型的文件。二进制文件包含了其他所有的类型,它是对包含任意格式或无格式数据的文件的统称。

// set up overlapped structure fields
            gOverLapped.Offset = 0;
            gOverLapped.OffsetHigh = 0;
            gOverLapped.hEvent = NULL;
            // attempt an asynchronous read operation
            bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead,
            &gOverlapped) ;
            // if there was a problem, or the async. operation"s still pending ...
            if (!bResult)
            {
            // deal with the error code
            switch (dwError = GetLastError())
            {
            case ERROR_HANDLE_EOF:
            {
            // we"re reached the end of the file
            // during the call to ReadFile
            // code to handle that
            }
            case ERROR_IO_PENDING:
            {
            // asynchronous i/o is still in progress
            // do something else for a while
            GoDoSomethingElse() ;
            // check on the results of the asynchronous read
            bResu = GetOverlappedResult(hFile, &gOverlapped,
            &nBytesRead, FALSE) ;
            // if there was a problem ...
            if (!bResult)
            {
            // deal with the error code
            switch (dwError = GetLastError())
            {
            case ERROR_HANDLE_EOF:
            {
            // we"re reached the end of the file
            file://during/ asynchronous operation
            }
            // deal with other error cases
            }
            }
            } // end case
            // deal with other error cases
            } // end switch
            } // end if

文本文件的处理
本节讲述使用内建于Object Pascal 运行时库中的过程和函数处理文本文件的方法。在对文本文件进行任何处理之前,首先要打开此文本文件。声明变量:通过此变量可以来引用一个文本文件。
打 开一个文件需要两步:首先是A s s i g n F i l e ( ) ,它可以将文件变量与一个文件关联起来。例如:这时,你可以进行第二步:打开文件。有三种方式打开文件:使用R e w r i t e ( )过程创建并打开文件;对于一个已存在的文件,此操作将使文件被覆盖;使用R e s e t ( )过程只读地打开一个文件;使用Append() 过程向已存在的文件追加文本。
注意Reset()将以可读写方式打开类型文件和无类型文件。可以使用C l o s e F i l e ( )来关闭一个已打开的文件。下例是各种调用的函数。

虽然Windows文件句柄提供灵活的文件控制,但须编写更多的出错处理代码,如果对WindowsAPI不熟悉,使用Delphi推荐的旧文件变量类型.

文件的打开与关闭
AssignFile :把一个外部文件名和一个文件变量相关联
Reset :打开一个存在的文件
Rewrite :创建并打开一个新文件(或覆盖原有文件)
Append :以添加方式打开一个文件(只适用于文本文件)
CloseFile :关闭一个打开的文件
FileOpen :打开一个特定的文件并返回文件句柄
FileCreate :创建一个给定文件名的文件并返回文件句柄
FileClose :关闭一个特定句柄的文件
后边三个文件主要供系统内部使用,在文件复制的编程中也往往会用到。它们操作的对象是文件句柄而不是文件变量。

Delphi的旧文件类型使用AssignFile,使文件变量和物理文件关联,通过Delphi定义的对文件变量的各种操作,完成文件的存取和操作.使用方便.以下提供对文件变量类型的操作代码描述:

文件定位
Seek:把文件当前位置移到指定部分
FilePos:返回文件的当前位置
Eoln:返回行结束标志
EOF:返回文件结束标志
FileSeek: 改变当前文件指针的位置

var
            F: TextFile;
            S: string;
            begin
            if OpenDialog1.Execute then { Display Open dialog box }
            begin
            AssignFile(F, OpenDialog1.FileName); { File selected in dialog box }
            Reset(F);
            Readln(F, S); { Read the first line out of the file }
            Edit1.Text := S; { Put string in a TEdit control }
            CloseFile(F);
            end;
            end;

还有个问题,如何判断文件已打开?要不要读写完之后就关闭文件,下次读或者写时再打开?

文件流是流(stream classes)的子类,所以使用他的一个优点就是能自动继承其父类的属性他能很容易的和其他的流类互操作,比如你如果想把一块动态内存块写入磁盘,可以使用一个TFileStream和一个TMemoryStream来完成.

正常情况下是这样

用文件变量表示的文件类型,比如 F:text,F:File. 定义了三类:有类型,无类型,字符类型以及一些Delphi的文件操作函数.比如:...

用TFileStream 
对于通过Byte数组进行文件操作的,在FTP中经常会使用到,我也是在Delphi调用Web Service进行文件的上传和下载时找到这两个函数的,挺好用的,推荐给大家。(申明:非本人所写)

  1. 将Byte数组生成文件

procedure ByteArrayToFile(const ByteArray : TByteDynArray; const FileName : string );
var 
Count: integer;
F: FIle of Byte;
pTemp: Pointer;
begin
AssignFile( F, FileName );
Rewrite(F);
try
Count := Length( ByteArray );
pTemp := @ByteArray[0];
BlockWrite(F, pTemp^, Count );
finally
CloseFile( F );
end;
end;

  1. 将文件生成Byte数组

function FiIeToByteArray(const FileName:string ):TByteDynArray;
const 
BLOCK_SIZE=1024;
var
BytesRead,BytesToWrite,Count:integer;
F:File of Byte;
pTemp:Pointer;
begin
AssignFile( F, FileName );
Reset(F);
try
Count := FileSize( F );
SetLength(Result, Count );
pTemp := @Result[0];
BytesRead := BLOCK_SIZE;
while (BytesRead = BLOCK_SIZE ) do
begin
BytesToWrite := Min(Count, BLOCK_SIZE);
BlockRead(F, pTemp^, BytesToWrite , BytesRead );
pTemp := Pointer(LongInt(pTemp) + BLOCK_SIZE);
Count := Count-BytesRead;
end;
finally
CloseFile( F );
end;
end;

function Encrypt(mStr: string; mKey: string): string;
var
I, J: Integer;
begin
J := 1;
Result := '';
for I := 1 to Length(mStr) do begin
Result := Result + Char(Ord(mStr[I]) xor Ord(mKey[J]));
if J + 1 <= Length(mKey) then
Inc(J)
else J := 1;
end;
{自己加步骤}
end;

function Decrypt(mStr: string; mKey: string): string;
var
I, J: Integer;
begin
J := 1;
Result := '';
{自己加步骤}
for I := 1 to Length(mStr) do begin
Result := Result + Char(Ord(mStr[I]) xor Ord(mKey[J]));
if J + 1 <= Length(mKey) then
Inc(J)
else J := 1;
end;
end;

 

procedure TForm1.Button1Click(Sender: TObject);
const
cKey1 = '谁想试试怎么破';
cKey2 = '我可不愿意这样玩(1)我可不愿意这样玩(2)我可不愿意这样玩(3)';
cKey3 = 'Memo2.Text := Decrypt(Encrypt(Memo1.Text, cKey), cKey);';
var
S: string; //加密后的字符
begin
S := Encrypt(Encrypt(Encrypt(Memo1.Text, cKey1), cKey2), cKey3);
ShowMessage(S);
Memo2.Text := Decrypt(Decrypt(Decrypt(S, cKey3), cKey2), cKey1);
end;

 

本文由ag旗舰厅官网发布于ag旗舰厅,转载请注明出处:Delphi中用来读写的文件类型精髓篇,delphi文件操

关键词:

上一篇:1008姚女子花剑数

下一篇:队列练习