用fstream定义一个对象,打开一个流文件,例如:
fstream file;
char *str=new char[2];
file.Open("aaa.dat",ios::in|ios::binary)
while(!file.eof())
{
file.read((str,2);
file.seekp(2,ios::cur);//因为每四位的后两位都为空
.......                //后面操作
}
delete [2]str;
但是如果这个流文件很大,例如10MB,那么这样读取文件速度很慢,读完要花很长时间,在下想通过调用某一个函数直接把流文件载入内存,以大大提高文件的读取速度,请问该调用哪个函数有这种功能?或者大家有更好的办法提供文件读取速度?
在下也尝试过用CFile类定义对象来读取文件,但觉得比fstream方法还要慢。
另外,怎样设置fstream对象缓冲区及其大小?我调用file.setbuf(char *,512)后发现居然上面的程序读取不到内容。
请大家指点,谢谢!

解决方案 »

  1.   

    上面写错了,设置缓冲区我用下面语句:
    char * buf=new char[512];
    file.setbuf(buf,512);
    把其放在file.Open("aaa.dat",ios::in  ¦ios::binary);这句后面程序就读不出文件的数据了。
      

  2.   

    void  setbuf(FILE *stream,char *buf) 给流stream指定一个缓冲区bufvoid  setvbuf(FILE *stream,char *buf,int type,unsigned size)       给流stream指定一个缓冲区buf,大小为size,类型为type,type的值见下表      ┌───┬───────────────────────────────┐      │type值│意义                                                          │      ├───┼───────────────────────────────┤      │_IOFBF│文件是完全缓冲区,当缓冲区是空时,下一个输入操作将企图填满整个缓│      │      │冲区.在输出时,在把任何数据写到文件之前,将完全填充缓冲区.      │      │_IOLBF│文件是行缓冲区.当缓冲区为空时,下一个输入操作将仍然企图填整个缓│      │      │冲区.然而在输出时,每当新行符写到文件,缓冲区就被清洗掉.        │      │_IONBF│文件是无缓冲的.buf和size参数是被忽略的.每个输入操作将直接从文 │      │      │件读,每个输出操作将立即把数据写到文件中.                      │      └───┴───────────────────────────────┘
      

  3.   

    谢谢楼上两位的指点,所有回复将都给分。
    请问在我的程序中具体该怎样使用setvbuf(FILE *stream,char *buf,int type,unsigned size)或setbuf(FILE *stream,char *buf)函数?我用的的fstream流对象而不是FILE对象.
    还有,怎样内存映射文件?
    谢谢!
      

  4.   

    file.read((str,2);//读得太小了吧,改大一点应该会快很多
      

  5.   

    因为我处理的文件中每四位的后两位都为空,前两位是有值的,故只能file.read((str,2);读出来再处理。
      

  6.   

    我说的为空是指用二进制方式打开其ASCII码为0的那些字节,我需要读出不为空的字符再处理。