0

我在 g++ (版本 4.6.3 )中尝试了以下代码的许多版本。

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。

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

4

1 回答 1

2

很抱歉简短的回答,但没有太多时间。

您正在打开文件以进行写入 ( std::ios::out),这需要对文件进行排他锁。如果文件已经在使用中,获取锁失败,打开和读取也会失败。

于 2012-04-07T04:52:13.983 回答