2013-03-31 7 views
0

我想在一個給定的文件輸出讀取字符的十六進制字符數。當我對一個文本文件運行它時,它或多或少是準確的,但與其他任何東西似乎都是一樣的。 IE:大約700MB的* .mp4文件將在12K出現。我在這裏錯過了什麼?(C++)noob - 我的代碼有什麼問題?

#include <fstream> 
#include <iostream> 
using namespace std ; 

int main() 
    { 
    char letter ; 
    int i ; 
    cout << "Input the filename:" << endl; 
    string stringinput; 
     cin >> stringinput; 
    ifstream file(stringinput.c_str()) ; 
    if(! file) 
    { 
     cout << "Error opening input file, " << (stringinput) << ". Check file path and try again." << endl ; 
     return -1 ; 
    } 
    else 
     for(i = 0; ! file.eof() ; i++) 
     { 
      file.get(letter) ; 
      //cout << hex << (int) letter; 
     } 
     cout << endl; 
     float k = 1024, m = 1048576; 
     file.close(); 
     if(i < 1024) 
     { 
      cout << "Total: " << dec << i << endl; 
     } 
     else if(i < m) 
     { 
      cout << "Total: " << dec << (i/k) << "K" << endl; 
     } 
     else 
     { 
      cout << "Total: " << dec << (i/m) << "M" << endl; 
     } 
     return 0 ; 
} 
+0

你打開在文本模式下的文件......別人可以闡述。 :) –

回答

2

您需要在binary模式下打開文件。

ifstream file(stringinput.c_str()) ; 

應該是:

ifstream file(stringinput.c_str(), ios_base::in | ios_base::binary) ; 

閱讀的文本模式的文件,將意味着某些字符(如CTRL-Z)作爲「文件結束」處理,因此你的閱讀會如果這恰好是您的輸入的一部分,則過早結束。由於mp4文件是具有相當「隨機」內容的二進制文件,因此無法保證這些字符不會出現在文件中。

2

.mp4文件需要在二進制模式被打開:

std::ifstream file(stringinput.c_str(), std::ios_base::in | std::ios::binary) ; 

如果不指定std::ios::binary標誌,該文件是默認的文本模式打開。有這樣做的問題是,該文件的內容被解釋爲,如果它是文本(即運行時假定所有字節落在有效範圍內,並有由系統語言環境的角色定義的特定含義設置,如ASCII或UTF-8)。因此,它將執行諸如將新行字符從DOS轉換爲UNIX格式(反之亦然)或以特殊方式處理某些控制字符等。

有關更多信息,請參閱Difference between files writen in binary and text mode