這可能不是一個編程問題,但我需要一些幫助。我正在學習如何使用文件流,我正在從文件讀取二進制數據。我正在將數據保存到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」一致,我不斷獲得隨機值,但當我恢復了修復它所做的所有更改時,突然再次運行。我有其他人幫助我看到這種情況發生的第一手資料。如果你自己沒有看到或者沒有經歷過這樣的事情,這是一個很難解釋的問題,所以如果你需要更多的解釋,請告訴我。
如果沒有看到相關代碼,很難說。它可能是一些非常簡單的事情,因爲您意外地運行了一個版本,而這個版本並未使用最新的代碼更改進行編譯 – jeremy
爲什麼不分享你爲此編寫的僞/部分C++代碼? –
@ LMAR1093這個解釋怎麼樣 - 「你的程序有bug」。鑑於你已經表明你的使用指針,鑄造等等你的程序可能會觀察到未定義的行爲。當你犯了一個錯誤,例如內存損壞,緩衝區溢出等,那麼該C++程序的運行不是確定性的,即它可能會崩潰。哎呀,它可能運行好幾年直到那個決定性的一天。向我們展示代碼,然後我們可以看到您的描述是否與您所寫的內容完全匹配。 – PaulMcKenzie