在FreeBASIC中,有4种可能的方式来执行文件I / O:
1.使用内置的BASIC命令,如
Open,
Get,
Put和
Close.这种方式在FreeBASIC支持的所有平台上都是可移植的。打开的文件由“文件编号”标识,它们是FreeBASIC特有的,不能从下面传递到函数中。
2.C库FreeBASIC使用C流I / O功能,如fopen,fread,ftell,fclose(参见
C标准库函数中的Stream I / O)依赖于。这比以上方法略快,并添加了一些功能,并且仍然很便携。打开的文件由C语言中的文件指针标识,这种访问方式也是唯一的。
FileAttr功能可用于从文件编号返回流I / O指针,如1所示。以上。
3.使用C类低级I / O功能,如_open,_read,_write,_close(参见
C标准库函数中的低级别I / O)。这些功能应该是可移植的,但到目前为止,只有Win32可用的标题,所以使用它们的代码现在不会编译到任何其他平台。
4.直接与操作系统内核通信(DOS:使用DOS和DPMI INT,Win32:使用API??调用,如CreateFile,WriteFile)。这不再是便携式的。文件由OS内核生成和特定的句柄标识。
此示例显示和比较方法1。和2。并报告所使用功能返回的值。它期望2个命令行参数,提供相同大小的2个
不同文件的名称可以比较读取性能(确保文件缓存在开始测试之前为空):
例子
Data "文件I / O示例&测试GET和FREAD | (CL)2008-10-12公共领域"
Data "http://www.freebasic.net/wiki/wikka.php?wakka=ProPgFileIO"
Rem
Rem Compile With FB 0.20 Or newer
Rem
Rem In the commandline supply preferably 2 different files of same big size
Rem Default Is "BLAH" For both (bad)
Rem In both loops (Get And FREAD) the last Read can be "空" ... no problem
#include "crt\stdio.bi" '' Otherwise the "C"-stuff won't work
Dim As FILE Ptr QQ ''这是C类文件访问指针
Dim As UByte Ptr BUF ''缓冲器用于FB样和C样读取
Dim As UInteger FILN ''FB像“文件号”
Dim As UInteger AA, BB, CC, DD, EE
Dim As ULongInt II64 ''我们尝试支持文件>= 4 GiB
Dim As String VGSTEMP, VGSFILE1, VGSFILE2
? : Read VGSTEMP : ? VGSTEMP : Read VGSTEMP : ? VGSTEMP : ?
VGSTEMP=Command$(1) : VGSFILE1="BLAH"
If (VGSTEMP<>"") Then VGSFILE1=VGSTEMP
VGSTEMP=Command$(2) : VGSFILE2=VGSFILE1
If (VGSTEMP<>"") Then VGSFILE2=VGSTEMP
BUF = Allocate(32768) '' 32 KiB - hoping it won't失败,BUF可能是0 ...
? : ? "FB - OPEN - GET , """+VGSFILE1+"""": Sleep 1000
FILN = FreeFile : AA=0 : II64=0 ''AA计数每32 KiB的块已读
BB=Open (VGSFILE1 For Binary Access Read As #FILN)
''结果0在这里OK,<>0是邪恶的
'' "ACCESS READ" should prevent file creation if it doesn'存在
? "开放结果:" ; BB
If (BB=0) Then ''BB将被“重复使用”为下面的定时器
BB=Cast(UInteger,(Timer*100)) ''FB中没有UINTEGER TIMER,使单位10 ms
CC=Get (#FILN,,*BUF,32768,DD)
''CC有成功状态,0是OK,<>0是坏的
''DD是读取的数据量
''EOF是__NOT__在这里被认为是错误
? "第0个GET:";CC;"";DD
? "2字节读取:";BUF[0];"";BUF[1]
Do
AA=AA+1 : II64=II64+Cast(ULongInt,DD)
If (DD<32768) Or (CC<>0) Then Exit Do ''放弃
CC=Get (#FILN,,*BUF,32768,DD)
Loop
EE=Cast(UInteger,(Timer*100))-BB
? "时间 :";(EE+1)*10;"ms"
If (AA>1) Then ? "最后GET:";CC;"";DD
? "有__EXACTLY__";II64;"字节";AA;"电话"
Close #FILN
ENDIF
? : ? "C - FOPEN - FREAD , """+VGSFILE2+"""" : Sleep 1000
AA=0 : II64=0 ''AA计数每32 KiB的块已读
QQ=FOPEN(VGSFILE2,"rb")
''这里0是邪恶的,<>0好,与上面相反!
'' File will not be created if it doesn'存在(好)
''“rb”区分大小写,必须是小写,STRPTR似乎不是必需的
? "FOPEN结果:" ; QQ
If (QQ<>0) Then
BB=Cast(UInteger,(Timer*100)) ''FB中没有UINTEGER TIMER,使单位10 ms
DD=FREAD(BUF,1,32768,QQ) '' 1 is size of byte - can'没有:-D
''读取数据的大小,EOF上的<32768,EOF后为0,错误为“-1”
? "第0张FREAD:";DD
? "2字节读取:";BUF[0];"";BUF[1]
Do
AA=AA+1
If (DD<=32768) Then II64=II64+Cast(ULongInt,DD)
If (DD<>32768) Then Exit Do ''ERR或EOF
DD=FREAD(BUF,1,32768,QQ)
Loop
EE=Cast(UInteger,(Timer*100))-BB
? "时间 :";(EE+1)*10;"ms"
If (AA>1) Then ? "最后FREAD:";DD
? "有__EXACTLY__";II64;"字节";AA;"电话"
FCLOSE(QQ)
ENDIF
Deallocate(BUF): Sleep 1000 ''关键
End
参考