2012-04-07 114 views
0

我已经在g ++(版本4.6.3)中尝试了以下代码的许多版本。C++ - 读取二进制文件错误或编译器错误?

int main(int argc,char *argv[]) 
{ 
    std::string fname(argv[1]); 
    std::cout<<"fname is"<<fname<<std::endl; 

    // std::fstream f(fname.c_str(), 
         std::fstream::in|std::fstream::out|std::fstream::binary); 
    std::fstream f(fname.c_str(),std::ios::in|std::ios::out|std::ios::binary);  
    unsigned char b[512]; 
    memset(b,0xff,512); 
    std::cout<<f.tellg()<<std::endl; 
    f.seekg(0,std::ios::beg); 
    std::cout<<f.tellg()<<std::endl; 
    f.read((char *)b,512); 
    for(int ii=0;ii<sizeof(sector0);ii++) 
     std::cout<<std::hex<<(int)(b[ii]) <<" "; 
    std::cout<<std::endl; 
} 

在每种情况下,结果是我通过在源代码(样品ASCII)的文件名是相同的,所以tellg报告一个1和缓冲文件相匹配。如果我传入可执行文件的文件名(我的示例二进制文件),tellg报告-1,转储全部是ff。

我做错了什么或者这是一个编译器错误?

+10

提示:这不是一个编译器错误。 – 2012-04-07 04:44:39

+0

在'std :: ios :: out'模式中是否需要打开? – keety 2012-04-07 04:50:33

+0

keety。不是这部分,而是程序的后面部分。当然,我拿出一个样本。 – 2012-04-07 04:53:15

回答

2

对不起,简短的回答,但没有太多时间。

您正在打开写入文件(std::ios::out),该文件需要对文件进行排它锁定。如果该文件已被使用,则获取该锁失败,因此打开和读取也将失败。

+0

但是为什么它像我期望的那样工作,而不是二进制文件? – 2012-04-07 08:31:48

+0

执行的二进制=正在使用。 – Sjoerd 2012-04-07 13:38:53

+0

糟糕。简化时,我最终以另一种方式复制了错误。当您尝试将错误简化为最简单的形式时,会发生这种情况。 – 2012-04-08 14:29:58