2013-12-11 98 views
1

我想打開一個文件並將其放入一個字符串中。我的代碼是:使用ifstream加載文件時出錯

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

int main() { 
    streampos size; 
    char * memblock; 

    ifstream file ("C:\\a\\test.snt", ios::in | ios::binary | ios::ate); 
    if (file.is_open()){ 

    size = file.tellg(); 
    memblock = new char [size]; 
    file.seekg (0, ios::beg); 
    file.read (memblock, size); 
    file.close(); 

    std::string someString(memblock); 

    if(file.bad()){cout << "Bad\n";} 
    if(file.fail()){cout << "Fail\n";} 

    delete[] memblock; 
    }else{ cout << "Unable to open file";} 

    return 0; 
} 

問題是,它不會加載大部分只有一小部分作爲這樣的「YYYY««««««««îþîþ」。 我想,當用記事本打開++文件看起來像這樣Notepad++ http://gyazo.com/9d8dc182d5dfa06610372462831cca0e.png

回答

1
std::string someString(memblock); 

應該

std::string someString(memblock, size); 

構造的前一版本創建someString治療memblock作爲C風格的字符串,終止於第一個字節的值爲0。這可能會導致創建太短的字符串;對於其他文件內容,您最終可能會超出您分配的內存。

後一版本使用memblock的全部內容創建someString,包括任何0字節。

1
std::string someString(memblock); 

這裏,我們使用的字符串構造函數,一個const char*和讀取,直到第一個空字節,因爲它沒有其他辦法知道如何讀取的字節數。

  • 在您的二進制文件中,其中一個空字節出現得相當早。
  • 如果你的文件沒有空字節,字符串構造函數會繼續讀取甚至超出你分配的內存,造成危險和災難。

相反,使用字符串構造能精確讀取的字節數,你告訴它,無論什麼樣的字節值是:

std::string someString(memblock, size);