2013-03-19 39 views
0

我嘗試在包含charint & double頭後的二進制文件閱讀:錯誤讀取二進制文件用C++

// open file 
int pos = 0,n; 
char str1,str2; 

//string str; 
ifstream fid(pfad.c_str(),std::ios::binary); 
if (fid.good() != 1) { 
    printf(" ++ Error: The elegant bunch file %s doesn't exist.\n",pfad.c_str()); 
    return 1; 
} 

// cut the header 
while (pos<5) { 
    if (fid.eof()) { 
     printf(" ++ Error: elegant bunch file is strange\n"); 
     return 1; 
    } 

    fid >> str1; 

    switch (pos) { 
     case 0: str2 = '&'; break; 
     case 1: str2 = 'd'; break; 
     case 2: str2 = 'a'; break; 
     case 3: str2 = 't'; break; 
     case 4: str2 = 'a'; break; 
    } 

    if (str1 == str2){ 
     pos ++; 
    } else { 
     pos = 0; 
    } 
} 

    // Read out the data 
    fid.seekg(19,ios_base::cur); 

std::cout << fid.tellg() << std::endl; 
fid >> n; 
std::cout << fid.tellg() << std::cout; 


printf("\n\n%i\n\n",n); 
printf("\nOK\n"); 
return 0; 

我與fid >> str1的作品就好了閱讀字符。如果我試圖用int這樣做,它會產生某種奇怪的行爲。輸出然後得到

813 

-10x6c4f0484 

0 

從而使第一個數字是在文件中的位置,第二個應該是相同的,但它看起來像一個指向我。任何人都可能試圖澄清我的困惑?

已經提前致謝。

+2

*「任何人都可以嘗試澄清我的困惑嗎?」 - 你的問題本身是以非常混亂的方式寫的。嘗試編輯它,使其更清楚您的問題是什麼請。 – LihO 2013-03-19 11:06:01

回答

1

std::operator>>(std::istream&, int&)試圖從解析從字符流中取一個整數,它不讀取二進制數據。您需要使用std::istream::read(char*, std::streamsize)函數。

+0

是的,這是它。雖然對我來說似乎相當扼殺,你必須這樣做。但是,我的經歷再一次使用高級語言。 Thx爲您的答案 – 2013-03-19 13:01:01

+0

我認爲現代C++是一種高級語言,如果需要,您可以使用低級語言;-)回到問題:這只是一個語義問題。 'operator >>'無法知道它是否應該嘗試將一個字符串解析爲一個整數或是否應該讀取二進制數據。因此,您需要了解API及其語義。順便說一句:同樣在非常高級的Python語言中,你必須爲二進制I/O調用'file.read(nbytes)'。 – 2013-03-19 13:08:33