2012-10-19 111 views
0

我正在使用fstream讀取二進制文件,但奇怪的是,每次執行代碼時,我都會得到相同輸入文件的不同值。你可以看到,我打印出的數據應該每次都是一樣的,但是會產生一個不同的值。 mdfHeader.length是一個數據塊的長度。使用fstream讀取

+1

您需要打印出更多的診斷數據。 'pos'的價值是什麼;你在mdfHeader中獲得了什麼;什麼在mdfHeader.length;和其他每個變量讀取?你在操作過程中檢查I/O狀態嗎?如何創建和分配所有變量? –

+0

Seconding @JonathanLeffler。什麼是pos初始化? – chrisaycock

+0

您打印的數據與實際在文件中的數據相對應的是什麼?你能認出什麼嗎?如果是這樣,實際結果與預期結果相比有多遠?如果你知道你有多少字節,那麼你可能會在調試器中看到這個數字,並指出你的錯誤來源。 –

回答

2

改變的第一件事是:

  1. 條件eof()是唯一真正有用的,以確定爲什麼讀取數據失敗,但它不是一個循環的有用條件。
  2. 你需要閱讀,你成功地讀取你感興趣的數據後檢查

的是,循環會是這個樣子:

while (*fs) { 
    // read data from fs 
    if (*fs) { 
     // do something with the data 
    } 
    else if (!fs->eof()) { 
     std::cout << "ERROR: failed to read record\n"; 
    } 
} 

我也猜你不需要尋求,這是一個好主意,擺脫它們:尋找是相對昂貴的,因爲它失去了任何緩衝區。你沒有顯示完整的代碼,但初始值爲pos有一個公平的機會提供某種程度的隨機性。此外,您還假設您正在閱讀的字節序列與數據在計算機中的佈局方式相匹配。通常,情況並非如此,您通常需要調整二進制格式,例如以適應不同大小的字,不同的字尾,填充等。

1

計算機就像數學,每一件事都是確定的(即使是功能如rand如果輸入相同,輸出也與以前相同)因此,如果您使用相同的輸入和狀態運行一百次代碼,您肯定會得到相同的輸出,除非輸入或運行狀態改變。

你說的輸入是一樣的,每次執行一個改變運行狀態的代碼,所以唯一的時間(例如malloc可能會返回每次運行程序時2個不同的值,因爲它可以在不同的工作狀態,因爲其狀態將由OS指示)。

在你的代碼使用printf("Data=%#x\n",data);輸出數據,但它實際上只是打印數據爲十六進制值的地址,是因爲OS的執行映射到不同的這是很自然的,在程序的多個運行這個地址可能改變職位或其他任何東西。您應該輸出data的內容,您將看到它將與之前的運行相同

+0

這當然是一種可能性---可能是一種可能性; 4malloc在它返回的地址中引入一些隨機性(可能使用'/ dev/random',這是真正的隨機)是相當常見的做法。但是他沒有給我們足夠的信息來確定,而且他的代碼中存在很多可能的未定義行爲,所以很難確定。 (見Dietmar對許多其他問題的回答。) –

+0

@JamesKanze有很多問題,但是像EOF這樣的問題在程序的所有執行過程中都應該是相同的,所以在多次執行程序時會改變的其他東西都是未正確初始化的變量,在我們的例子中是最多的可能的解決方案是@mareks關於'printf'的錯誤期望。指定'printf'產生不同的結果是正常的!所以在解決這個問題之後,可能會出現其他錯誤,它可以完全解決他/她的問題!這取決於代碼的其他問題 – BigBoss