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 に答える