2014-04-22 26 views
0

這可能不是一個編程問題,但我需要一些幫助。我正在學習如何使用文件流,我正在從文件讀取二進制數據。我正在將數據保存到char數組中,以逐字節訪問文件的數據。在文件中的某一點,我存儲了一個unsigned int,爲了得到它,我使用reinterpret強制轉換將數據保存到一個變量中。但是,我一直收到隨機數據,沒有做任何修復。我什至做了一些指針算術來到我的unsigned int在文件中的確切位置。在搞亂之後,我累了,把我的代碼恢復到原來的狀態。我再次運行它,出於某種原因,我正在正確地閱讀我的數據。基本上,我知道的代碼在再次開始工作之前沒有工作。什麼會導致這種事情發生?我知道這是一個長時間的解釋,但我以前曾經發生過這種情況,我想知道是什麼原因造成的。隨時問我任何澄清問題,如果有的話。使用C++在Visual Studio中讀取二進制文件時出錯

下面是我在做什麼,以獲得更好的想法非常簡單的例子:

string binaryFile = "pathToBinaryFile.bin"; 
ifstream in(binaryFile, ios::binary | ios::in); 

in.seekg(0, ios::end); 
size_t totalNumOfBytes = inFile.tellg(); 
in.seekg(0, ios::beg); 

char* savedData = new char[totalNumOfBytes]; 
in.read(savedData, totalNumOfBytes); 

Node* node = reinterpret_cast<Node*>(savedData); 

//Below is the line of code that kept breaking 
unsigned int byteOffsetToNodeLocation = reinterpret_cast<unsigned int>(node.position); 

node.position = reinterpret_cast<float*>(savedData + byteOffsetToNodeLocation); 

假設我有一個存儲一個指向浮動(node.position)節點類,我第一次讀節點對象I的數據存儲在文件中。在那些數據中,我存儲了一個unsigned int,它告訴我爲了找到Node的浮點指針應該指向的浮點數,我需要查看多遠。這個問題與「byteOffsetToNodeLocation」一致,我不斷獲得隨機值,但當我恢復了修復它所做的所有更改時,突然再次運行。我有其他人幫助我看到這種情況發生的第一手資料。如果你自己沒有看到或者沒有經歷過這樣的事情,這是一個很難解釋的問題,所以如果你需要更多的解釋,請告訴我。

+1

如果沒有看到相關代碼,很難說。它可能是一些非常簡單的事情,因爲您意外地運行了一個版本,而這個版本並未使用最新的代碼更改進行編譯 – jeremy

+0

爲什麼不分享你爲此編寫的僞/部分C++代碼? –

+1

@ LMAR1093這個解釋怎麼樣 - 「你的程序有bug」。鑑於你已經表明你的使用指針,鑄造等等你的程序可能會觀察到未定義的行爲。當你犯了一個錯誤,例如內存損壞,緩衝區溢出等,那麼該C++程序的運行不是確定性的,即它可能會崩潰。哎呀,它可能運行好幾年直到那個決定性的一天。向我們展示代碼,然後我們可以看到您的描述是否與您所寫的內容完全匹配。 – PaulMcKenzie

回答

0

我知道的代碼在再次開始工作之前不工作。 沒有什麼可以解釋的,通常是因爲您運行代碼而不重新編譯,或者更改了文件或其他簡單的解釋。這是令人沮喪,但給出相同的輸入時,編譯器總是產生相同的結果;)

的代碼看起來不錯(存儲在浮動*一個int有點不尋常,但應該工作)。你有沒有碰過Node類?編譯器有時會添加填充以對齊32位邊界上的數據,這可能是一個問題。節點是類還是結構?我的意思是,如果它有任何虛擬方法會在你打電話時炸燬,儘管看起來你沒有任何虛擬方法。

其他認爲你可以檢查是否byteOffsetToNodeLocation小於totalNumOfBytes。如果不是,則指向savedData緩衝區之外,然後從* node.position讀取的行爲可能會隨機崩潰。

另一個可能的問題可能是之前的實例鎖定了文件,從而阻止您的代碼讀取它。 (我不知道ifstream的共享政策是什麼)。您應該檢查totalNumOfBytes至少與sizeof(Node)一樣大。

+0

我確保在我甚至運行之前進行更改時重新編譯我的代碼,所以這不是問題。我也只有一個文件可以讀取,並且我仔細檢查了我的路徑是否屬於該文件。這可能是一個簡單的問題,但我可能會想出所有這些來解決這個問題。最好不要問,而要對發生的事情感到困惑。 – LMAR1093

+0

我剛剛更新了我的答案和回覆,它很大以適合作爲評論:( –