由于程序需要,我得一个一个字节的读文件
 在tc 中    FILE *fp;
  char ch;
  if((fp=fopen("1.dat","rb"))==NULL)
     exit(0);
  ch = fgetc(fp);
  while(ch!=EOF)
    { ch = fgetc(fp);}
  fclose(fp);//就是读一个文件 我循环500次 用了5秒不到 .  1.dat 为 54.8K 在VC中 
  CFile sourceFile;
  BYTE buffer[1];
  DWORD dwRead;
  CFileException ex;
  for(int i=0;i<500;i++)
  {   
    if (!sourceFile.Open("1.dat",CFile::modeRead | CFile::shareDenyWrite, &ex)
)
   {
          AfxMessageBox("打开文件错误");
   }
   do
      {
         dwRead = sourceFile.Read(buffer, 1);
      }      while (dwRead > 0);
      sourceFile.Close();

  }  
//这里所用的时间居然是 50秒 . 
  50/5=10
 
大家有什么好的方法 可以提高在VC中读取的速度.  前提是一个一个字节的读.
并且读文件的模式要 :CFile::modeRead | CFile::shareDenyWrite
  谢谢 !
另: 
  打开和关闭文件放在循环里 影响不大 0.01%  
  读文件的模式也没影响.
  dwRead = sourceFile.Read(buffer, 1);好像这个语句比较费时间. //不是很难 是非常非常的难.

解决方案 »

  1.   

    你非得一个一个字节的读?不能先读n个到szBuf中,再从szBuf中一个一个读,那样磁盘IO才一次,不就快了?
      

  2.   

    是的 我只能一个一个字节的读.而且必须. 
      可是为什么在TC中用的时间那么少? 它是把文件读到内存去了 然后在读内存 ?
      在VC中 难道是直接从磁盘读 ?
      

  3.   

    同意 livelivelive(神仙般的生活)
      

  4.   

    CFile sourceFile;
      BYTE buffer[1];
      DWORD dwRead;
      CFileException ex;
      if (!sourceFile.Open("1.dat",CFile::modeRead | CFile::shareDenyWrite, &ex))
       {
              AfxMessageBox("打开文件错误");
       }
      while(sourceFile.Read(buffer, 1) > 0);
      sourceFile.Close();
    同TC中类似功能。

      

  5.   

    dz_w(快乐之星) 看这里一下 谢谢.
    问题很负责
    http://expert.csdn.net/Expert/topic/1894/1894147.xml?temp=.9261743
      

  6.   

    首先,不清楚你的for循环是干什么的。是你用来测试的吗?还是有目的的?此处看来除了你去测试读500遍文件之外,没有其它目 的,所以这个for应该去掉,只留下do...while就可以了其次,如果是一个固定文件的话,没有必要一个字节一个字节地读,一次读完,然后再对读出的内容进行一个字节一个字节地处理,是一样的,不一样的是,速度会快得多第三,如果不是什么秘密,可以把你为什么要一个字节一个字节地读的原因说出来,这样也有助于问题的解决,或是或以换一种方式去解决。当然如果是秘密的话,就不必要了。
      

  7.   

    我做了个压缩程序  原本用TC那中方式打开文件(fopen)速度很快 
    可是换了VC中这种方式打开文件慢了很多.
    压缩一个文件看不出来 压缩多个文件时间差了有5倍
      所以做了个循环读文件比较 发现VC这种方式慢了很多. 
    TC下的FOPEN打开了文件 没关闭时 再用fopen就打不开这个文件了 
      我要的是能同时多个线程读它.
    所以换了VC这种打开方式.
      多谢各位了. 压缩代码都一样 就是读一个字节耗费的时间不一样.如果一次读入整个文件 再对读出的内容进行一个字节一个字节地处理 那样我的程序就得有很大得改动.
      

  8.   

    楼主自己的程序有问题,文件开500次,再关500次。你自己试试把门打开,再关好、锁上,再开500次试试。你把文件打开一次就好了,然后一个一个的读就好了。把打开文件的语句写在for循环的外面撒。