2012-04-07 113 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