如何快速读取二进制文件

dim mybyte(100000) as byte
...
get #1,100000 ,mybyte()
...
能行吗?
朋友们有什么好办法?
四楼ljl88900 - 探花 十一级 ,有些实用,但我是任意文件对象,如对大图片:
s = StrConv(BB, vbUnicode) '读出来的字符变量 是空的.
k4me - 状元 十四级
wangwei_sa - 魔法师 四级
都是很好的建议.
谢谢.
ljl88900 - 探花 十一级
ReDim BB(FileLen(FileName) - 1)中
FileLen(FileName)的大小是否限制?如<32767?

  
  快速读取二进制文件的方法如下:
  1、打开文件。

  打开文件可以有两种方式,第一种可以使用fstream类的构造函数。fstream file("test.dat",ios_base::in|ios_base::out|ios_base::app); 另外一种方法就是使用
  open函数。fstream file;file.open("test.dat",ios_base::in|ios_base::out|ios_base::app);
  这样就可以打开一个可读写的文件了。如果文件不存在的话,就会创建一个新文件并且以读写方式打开。这里需要说明一点,如果文件不存在的话,open函数中第二个参数必须包含ios_base::out|ios_base::app,否则就不能正确创建文件。
  
  2、写文件。
  先进性写文件的操作否则读一个空文件是没有意义的。
  既然是写二进制文件可以向文件中写入一个整形值。写二进制字符只能使用write
  函数。但是write函数的原形是write(const char * ch, int size)。第一个参数是char *
  类型,所以需要把将要写入文件的int类型转换成char *类型。这里的转换困扰了我好几天,不过终于弄明白了。代码如下。int temp; file.write((char *)(&temp),sizeof(temp));
  3、读文件。
  可以写文件了,读文件就好办多了。读文件需要用到read函数。其参数和write
  大致相同,read(const char * ch, int size)。要把内容读到int类型变量中同样涉及到一个类型转换的问题。和写文件一样。int readInt; file.read((char(&readInt),sizeof(readInt)); 这样文件中的int值就读入到int型变量
  readInt中了。
  
  4、文件指针。
  在文件的读写过程中往往需要对文件进行选择性读取。所以需要进行文件指针的移动。这是需要用到seekg和seekp函数。在fstream类中有两个文件指针,一个是读取文件的指针
  ,一个是写文件的指针分别用tellg和tellp文件来取得指针的位置。同样seekg和seekp两个函数分别是对这两个指针进行移动的函数。这两个函数的参数都是一样的。先对几个枚举类型进行一下说明:
  ios_base::beg ——文件开始位置ios_base::cur ——文件当前位置ios_base::end ——文件末尾位置下面以seekg为例说明一下指针移动的方法:file.seekg(3) ——指针移动到第三个字符的位置file.seekg(ios_base::beg) ——指针移动到文件开头file.seekg(ios_base::end) ——指针移动到文件末尾file.seekg(-3,ios_base::cur) ——
  指针当前位置向前移动三个字符file.seekg(3,ios_base::cur) ——指针当前位置向后移动三个字符file.seekg(3,file.tellg()) ——指针当前位置向后移动三个字符file.seekg(file.tellg()+3) ——指针当前位置向后移动三个字符
  
  5、对文件操作完毕后别忘了关闭文件。
  
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-09-19
Visual C++
如何:读取二进制文件

下面的代码示例演示如何从文件中读取二进制数据。使用了 System.IO 命名空间中的两个类:FileStream 和 BinaryReader。FileStream 表示实际的文件。BinaryReader 为允许二进制访问的流提供接口。

下面的代码示例使用由如何:编写二进制文件中的代码创建的称为 data.bin 的文件。
示例

// binary_read.cpp
// compile with: /clr
#using<system.dll>
using namespace System;
using namespace System::IO;

int main()
{
String^ fileName = "data.bin";
try
{
FileStream^ fs = gcnew FileStream(fileName, FileMode::Open);
BinaryReader^ br = gcnew BinaryReader(fs);

Console::WriteLine("contents of {0}:", fileName);
while (br->BaseStream->Position < br->BaseStream->Length)
Console::WriteLine(br->ReadInt32().ToString());

fs->Close( );
}
catch (Exception^ e)
{
if (dynamic_cast<FileNotFoundException^>(e))
Console::WriteLine("File '{0}' not found", fileName);
else
Console::WriteLine("Exception: ({0})", e);
return -1;
}
return 0;
}

★★补充★★
手上的一个VB项目(过程中发现,.Net果然是好啊),需要在一个ActiveX中实现HTTP下载功能,我是采用InternetreadFile这个API来实现,一开始的代码我是这么写的

Function Gethttpdownload(sUrl As String) As boolen

Dim s As String
Dim hOpen As Long
Dim hOpenUrl As Long
Dim bDoLoop As Boolean
Dim bRet As Boolean
Dim sReadBuffer As String * 2048
Dim lNumberOfBytesRead As Long
hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
hOpenUrl = InternetOpenUrl(hOpen, sUrl, vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
bDoLoop = True
Do While bDoLoop
sReadBuffer = vbNullString
bRet = InternetReadFile(hOpenUrl, sReadBuffer, Len(sReadBuffer), lNumberOfBytesRead)
s = s & Left$(sReadBuffer, lNumberOfBytesRead)
If Not CBool(lNumberOfBytesRead) Then bDoLoop = False
Loop
FileName = "E:\BitSpirit\Torrent\121212.torrent"
F1 = FreeFile
Open FileName For Binary As F1
Put F1, , s
Close F1
If hOpen <> 0 Then InternetCloseHandle (hOpen)
Gethttpdownload = true
End Function

上面方法,用来获取服务器上的文本类型的文件一点问题,都没有,但是用来下载二进制文件的时候 就出现问题了,里面的数据怎么也不对,研究了下载下来的文件后发现,问题外话应该是在接收数据的变量是个STRING的定长字符串上。但是在网上查了好久,甚至M$ MSDN上的一个用VB来实现下载的程也是用 string类型来接收数据的而且网上的代码写法,基本上也都是这个样,好来才好现,都是从MSDN上的哪个例程上演变过来的.
我想如果能用一个byte数组来代替定长字符串,哪可能就没有问题了,但是查看了一个VB 对Internetreadfile的申明
Public Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
发现其定义ByVal sBuffer As String 看来只能用String了,在网上查找过程中,发现人家用VC写的程序中这人参数可以是其它的,所以查看了一下Internetreadfile的原型。发现的确可以, 所以我把internetreadfile的定义修改了一下,为了通用,我为新的internetreadfile定义了一个别名。Internetreadfilebyte申明如下:
Public Declare Function InternetReadFileByte Lib "wininet.dll" Alias "InternetReadFile" (ByVal hFile As Long, ByRef sBuffer As Byte, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
试了一下的确可以,重新修改函数,(在这过程中发现,如果要取到正确数据,还必须取得文件大小。所以增加了HttpQueryInfo的定义)最后完整的函数
Function FileDownload(sUrl As Variant) As Boolean
Dim b(99) As Byte
Dim EndByte() As Byte
Dim s As String
Dim hOpen As Long
Dim hOpenUrl As Long
Dim bDoLoop As Boolean
Dim bRet As Boolean
Dim bbuffer As Byte
Dim sReadBuffer As String
Dim FileName As String
Dim lNumberOfBytesRead As Long
Dim F1 As Integer
Dim strsize As String
Dim size As Long
strsize = String$(1024, " ")

F1 = FreeFile
stTotal = vbNullString
FileName = "E:\BitSpirit\Torrent\121212.torrent"
Open FileName For Binary As F1
hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
hOpenUrl = InternetOpenUrl(hOpen, sUrl, vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
bDoLoop = True
HttpQueryInfo hOpenUrl, HTTP_QUERY_CONTENT_LENGTH Or HTTP_QUERY_FLAG_NUMBER, ByVal strsize, Len(strsize), 0
size = CLng(Trim(strsize))
For j = 1 To size \ 100
bDoLoop = InternetReadFileByte(hOpenUrl, b(0), 100, lNumberOfBytesRead)

Put F1, , b
If Not CBool(lNumberOfBytesRead) Then Exit For
Next
If size Mod 100 <> 0 Then
tmp = (size Mod 100) - 1
ReDim EndByte(tmp)
bDoLoop = InternetReadFileByte(hOpenUrl, EndByte(0), tmp + 1, lNumberOfBytesRead)
Put F1, , EndByte
End If

If hOpenUrl <> 0 Then InternetCloseHandle (hOpenUrl)
If hOpen <> 0 Then InternetCloseHandle (hOpen)

Close #1
FileDownload = True
End Function
测试了一下,完全成功:)本回答被提问者采纳
第2个回答  2008-12-11
100K太少,目前机器缓冲可以做到20M以上,可以大幅降低磁盘读取次数.如果为了转移文件,每次Get 20000000.最好检测是否同盘,如果是在两个物理驱动器之间,可以同时操作读写.
第3个回答  2008-12-13
根据你的反馈,修改如下:
可以,但需要改进。这样做的好处时速度很快,特别适用于大型文件的读取。
举例如下:

'读文件至变量
Private Sub Command1_Click()
dim FileName As String
Dim i As Integer, s As String, BB() As Byte
FileName="c:\1.dat"
If Dir(FileName) = "" Then Exit sub
i = FreeFile
ReDim BB(FileLen(FileName) - 1)'按文件长度读取
Open FileName For Binary As #i
Get #i, , BB
Close #i
s=bb '*****适用于非文本文件*****
's = StrConv(BB, vbUnicode) '*****适用于文本文件*****
End Sub
第4个回答  2008-12-11
其实一般的方法,主要代码也就这么几句(但希望得到尽可能的优化):
while(1){
if( bitLeft <= 0 ){
cByte = *inP++;
bitLeft = 8;
}
code = ( cByte >> ( 8 - bitLeft ) );

while( cSize > bitLeft )
{
cByte = *inP++;
code |= ( cByte << bitLeft );
bitLeft += 8;
}
bitLeft -= cSize;
code &= code_mask[cSize];
........
}

其中cSize表示码的长度(如10),从inP中读数据到一个code

从论坛上面借鉴的,不知道是不是你想要的

如何快速读取二进制文件
快速读取二进制文件的方法如下:1、打开文件。打开文件可以有两种方式,第一种可以使用fstream类的构造函数。fstream file("test.dat",ios_base::in|ios_base::out|ios_base::app); 另外一种方法就是使用 open函数。fstream file;file.open("test.dat",ios_base::in|ios_base::out|ios_base::...

二进制文件的读取与写入使用方法
读取二进制文件通常需要一个二进制文件读取器,它可以按字节或按块读取文件。写入二进制文件则需要一个二进制文件写入器,它可以按字节或按块写入数据。在实际操作中,我们需要打开二进制文件,并使用相应的读取或写入函数来读取或写入数据。读取二进制文件时,我们需要将读取的数据转换为相应的数据类型,如...

可以使用记事本打开二进制的文件吗?
对于二进制文件,应该使用专门设计的软件或工具来打开和查看。例如,图像文件应该使用图像查看器打开,音频文件应该使用音频播放器打开,以此类推。这些工具知道如何正确解释二进制数据,并将其转换为人类可理解的形式。

求高手求解,怎么读取二进制文件 有一个整数文件(二进制文件),怎么读取...
用C++编译器,编一个代码,先把该二进制文件输入到内存,然后用cout流再把他从内存提取到显示器里就可以了。你说的是整数文件(十进制),那直接用“cout<<”就可以了,不过怎样编排,依情况而定。

c语言读取二进制数据文件
1、数据流:程序与数据间的交互是以流的形式进行。在C语言文件存取时,打开文件操作,关闭数据流。2、缓冲区:程序执行时,提供的额外内存以暂时存放数据。缓冲区作用是为了提高存取效率,内存的存取速度比磁盘快。3、文件类型:分为文本文件和二进制文件两种。补充:1、文本文件:字符编码的方式进行保存。

如何读取二进制文件
将文件以二进制模式打开,比如:fp=fopen("a.bin","rb");利用二进制文件读取函数读取数据,比如:fread(buffer,1,256,fp);关闭文件,fclose(fp);

如何查看二进制文件的文件内容?
1、百度搜索HexEditor.dll下载到本地,2、下载HexEditor.dll后,将插件HexEditor.dll放到notepad++安装目录的plugins目录下,3、在notepad++安装目录的plugins目录下才行,放入后需要重启软件。4、选择二进制文件后,右击,在弹出的菜单栏中选择Notepad++打开。5、这时可以看到二制文件为乱码,点击顶部菜单栏...

c#中,读二进制文件
如果单纯从文件里取内容的话,使用StreamReader最方便,该类对象有两个方法,ReadLine和ReadToEnd,前者一次只取一行,后者一次取得全部,你这种用后者即可,然后再用字符串分割函数Split("\\r\\nr ")就能返回一个以“回车换行,"r"和空格”分割的数组,数组中不包含分隔内容,但数组的第一个元素你需要判断...

如何查看二进制文件的文件内容
C++ 及 VB 指令突显,可同时编辑多个文件,而且即使开启很大的文件速度也不会慢。1、运行UltraEdit软件;2、菜单栏、文件、打开、选取一个二进制文件;3、打开这个文件;4、上图显示区域左侧是地址,中间部分是每个字节的16进制双字符表示,右侧区域显示是可见的单字节ASCII字符及双字节乱码。

c语言读取二进制数据文件
1、二进制文本使用fopen函数的二进制模式“rb”就可以打开。对于程序来说,不管后缀名如何,文件分为两种类型:文本文件和二进制文件。 C语言里有一系列文件操作函数。区分文本和二进制文件,需要在打开文件时设置不同的控制符mode的变量即可。2、fopen的函数原型:FILE * fopen(const char * path,const...

相似回答