2015-12-23 41 views
0

我想我的二進制文件自己閱讀,但我有一些麻煩。現在這是我的了:閱讀本身的C++文件(exe)

#include <iostream> 
#include <fstream> 

int main(int argc, char * argv[]) 
{ 
    char data[1000]; 
    std::fstream file(argv[0], std::ios::in | std::ios::binary); 
    file >> data; 

    std::cout << data; 

    system("PAUSE"); 
    return 0; 
} 

僅打印前3個字符,出於某種原因...就是這樣。我不知道爲什麼它沒有讀取整個文件。任何幫助?

+0

除了其他人指出的,請注意,當使用帶'char'數組的格式化輸入時_shall_設置底層數組的大小!當你做'file >>數據;'沒有設置'file.width()'時,如果在數組的大小用盡之前讀取沒有停止,那麼就有可能發生緩衝區溢出!理想情況下,您應避免直接使用格式化輸入到'char'數組,而是使用'std :: string'。當然,你真正的問題的答案是第三個字節被解釋爲一個空間,你會使用無格式輸入。 –

回答

2

文件中的某些值導致流輸入過早結束,例如,一\ n

試着這麼做

int main(int argc, char * argv[]) 
{ 
    char data[1000]; 
    std::ifstream file(argv[0], std::ios::in | std::ios::binary); 
    int i = 0; 
    while (file.get(data[i]) 
    { 
     i++; 
     if (i == 1000) break; 
    } 

    for (int j = 0; j < i; j++) 
     std::cout << std::hex << data[j]; 

    system("PAUSE"); 
    return 0; 
} 

編輯:評論更新後從OP

在C++中,你應該避免C風格的數組。改用矢量。矢量具有動態大小,並且可以在需要時增長。

int main(int argc, char * argv[]) 
{ 
    char c; 
    vector<char> data; 
    std::ifstream file(argv[0], std::ios::in | std::ios::binary); 
    while (file.get(c) 
    { 
     data.push_back(c); 
    } 

    for (auto t : data) // for each ... 
    { 
     std::cout << std::hex << t; 
    } 

    system("PAUSE"); 
    return 0; 
} 
+0

謝謝,真的有幫助。還有一件事,現在代碼只讀取前1000個字節,我怎麼讀整個文件?我試過一些東西,但由於char數組需要一個常量(硬編碼)的值,我真的不知道該怎麼做。 – user5062925

3

您需要閱讀一個未格式化的可執行文件,並將其打開爲二進制文件。使用好舊的fread;一個filebuf在表面上很吸引人,但它仍然會調用你不想要的區域轉換。

+0

'fstream.read()'不像'filebuf'那樣格式化,但是它們仍然有locale和facet字符轉換。確實最好堅持使用'fopen'和'fread'。 –

+0

@benvoight aah!很高興知道。我只用它來處理未格式化的文本。 –

2

的C++ operator >> (const char *)流功能僅適用於C風格串。它不適合任意的二進制數據。您需要決定您希望輸出的外觀如何,並編寫代碼以您想要的格式輸出原始的任意二進制數據。

你還需要繼續閱讀。而且您需要使用不會超出緩衝區的讀取功能。