2013-03-20 113 views
0

我在Visual Studio C++中編寫了一個簡單的控制檯應用程序。我想讀012kb擴展到一個字節數組的二進制文件。嘗試讀取二進制文件時出現問題C++

ifstream inFile; 
size_t size = 0; 
char* oData = 0; 
inFile.open(path, ios::in|ios::binary); 

if (inFile.is_open()) 
{ 
    size = inFile.tellg();  // get the length of the file 
    oData = new char[size+1]; // for the '\0' 
    inFile.read(oData, size); 
    oData[size] = '\0' ;  // set '\0' 

    inFile.close(); 
    buff.CryptoContext = (byte*)oData; 
    delete[] oData; 
} 

但是,當我啓動它,我在所有的oData字符接收到相同的字符,每次一個又一個,例如:

oData = "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...". 

然後我嘗試另一種方式:

std::ifstream in(path, std::ios::in | std::ios::binary); 

if (in) 
{ 
    std::string contents; 

    in.seekg(0, std::ios::end); 
    contents.resize(in.tellg()); 

    in.seekg(0, std::ios::beg); 
    in.read(&contents[0], contents.size()); 

    in.close(); 
} 

現在內容有非常奇怪的值:一部分值是正確的,一部分是負值和奇怪值(可能與signed char和有關?)。

有沒有人有任何想法?

謝謝!

+0

行'in.read(&contents [0],contents.size())'*可能*未定義的行爲,*絕對*一個非常壞的主意。 – DevSolar 2013-03-20 12:04:39

回答

1

您正在將CryptoContext設置爲指向byte指針的數據,然後刪除該數據!

buff.CryptoContext = (byte*)oData; 
delete[] oData; 

此行後面CryptoContext指向已發佈和無效的數據。只要將oData數組在存儲器中保留更長時間,並在完成解碼或您正在處理的任何內容後將其刪除。

1

看一下第一個版本:

是什麼讓你認爲tellg獲取流的大小?它不,它returns the current read position。然後,您繼續將指向您的數據的指針指向buff.CryptoContents,並及時刪除指向的數據!這是非常危險的做法;您需要複製數據,使用智能指針或以其他方式確保數據具有正確的使用壽命。如果您在調試模式下運行,那麼刪除操作很可能會使用標記來標記您的數據以顯示它已被刪除,這就是爲什麼您要獲取相同字符的流。

我懷疑你對第二個簽名和未簽名的建議可能是正確的,但我不能說沒有看到你的文件和數據。