2012-02-18 88 views
0

我正在寫一個C++程序來讀取exe文件。我寫它,我測試它在文本文件而不是exe文件。這是真的。以C++結尾的Exe文件

當我用exe文件測試它我知道我的exe文件有0x00值(不是在它的末尾)。所以我的while循環在文件結束之前停止,因爲我使用了:

class A{ 
private: 
ifstream myFile; 
void Read(char *filename) 
}; 

void A::Read(char *str) 
{ 
myFile.open(str,ios::binary); 

    while (!myFile.eof()) 
    { 
     InputFile.get(ch); 
     myString.push_back(ch); 
    } 
} 

我該怎麼辦?如果我應該使用該文件的大小,我該如何得到它?

+0

您可以添加顯示您如何閱讀文件的代碼嗎? – 2012-02-18 08:44:53

+0

我的代碼很大,所以我寫了摘要! – 2012-02-18 09:30:03

+0

你如何存儲你閱讀的結果? – 2012-02-18 09:57:26

回答

1

只有一種預感在這裏,但我懷疑的是,你實際上是在閱讀整個文件正確,但測量是錯誤的。

文件讀取(二進制模式)不會停止在0字節,但有幾個字符串相關的方法,將。

例如,你無法衡量二進制的「斑點」的大小,使用的strlen(),你可以不使用的strcpy複製()。

沒有看到你存儲的實際途徑和測量數據,這是很難看到的東西出問題,但我強烈懷疑,你實際上是正確讀取整個文件,如果你使用二進制模式。

+0

是的,我是cout的向量,0x00是字符串的結尾,謝謝ALL&SORRY ALL爲了我的低智商。 – 2012-02-18 10:14:34

2

您必須打開與std::ios::binary模式標誌文件流。

+0

我該怎麼做? std :: ios :: binary :: ifstream Myfile? – 2012-02-18 09:00:04

+0

我試過InputFile。打開(_fileName,ios :: in | ios :: binary);但仍然在0x00 – 2012-02-18 09:09:17

2

由於James McNellis指出,需要以二進制方式打開文件:嘗試類似如下:

#include <iostream> 
#include <fstream> 

int main() 
{ 
    std::ifstream in("main.obj", std::ios_base::binary); 

    std::streamsize bytes_read = 0; 
    if (in.is_open()) 
    { 
     while (!in.eof()) 
     { 
      char buf[1024]; 

      // Use unformatted read. 
      in.read(buf, 1024); 

      if (in.gcount() > 0) 
      { 
       // The first 'in.gcount()' chars in 
       // 'buf' were read. 
       bytes_read += in.gcount(); 
      } 
     } 
    } 
    in.close(); 

    std::cout << "bytes read=" << bytes_read << "\n"; 

    return 0; 
} 

編輯:

示例修改爲使用get()

#include <iostream> 
#include <fstream> 

int main() 
{ 
    std::ifstream in("main.obj", std::ios_base::binary); 
    std::streamsize bytes_read = 0; 
    if (in.is_open()) 
    { 
     while (!in.eof()) 
     { 
      in.get(); 
      if (1 == in.gcount()) 
      { 
       bytes_read++; 
      } 
     } 
    } 
    in.close(); 
    std::cout << "bytes read=" << bytes_read << "\n"; 
    return 0; 
} 

測試並正常工作。

+0

tnx停止回答,我嘗試了一個像我的問題,它仍然有這樣的麻煩! :( – 2012-02-18 09:28:37

+0

你需要顯示你如何閱讀文件:你**必須**使用未格式化的讀取 – hmjd 2012-02-18 09:33:34

+0

我使用InputFile.get() – 2012-02-18 09:34:27

0

我發現我的錯誤,程序讀取所有字節,但我cout的字節在vector<char>,所以我看到之前爲0x00字節很明顯。

2

除了以二進制方式打開文件,當前的代碼有個微妙的問題,這將導致該文件中的最後一個字符被讀取兩次。問題是myFile.eof()調用不會執行您認爲的操作。它沒有告訴你什麼時候你在文件的末尾。它告訴你,你已經試圖讀取超出文件的末尾。寫讀直到-EOF環在C++中慣用的方法是:

while (myFile.get(ch)) 
    myString.push_back(ch); 

get返回istream參考,其在這種情況下,隱式轉換爲bool和用於指示沒有更多的數據讀書。