簡體   English   中英

C ++ ifstream將讀取一些值然后停止

[英]C++ ifstream will read some values then stop

我正在嘗試編寫一個程序,該程序從bin文件中讀取940個4字節長的二進制數據[hex]值,並將這些值輸出到控制台。 我在循環中有ifstream :: read,cout和seekg操作。

它會在前10個左右的迭代中工作,然后在一個迭代中跳過讀取和寫入操作,執行搜索操作,然后繼續進行讀取和寫入。 另外,最后200行左右的值相同。

它將正常工作12次迭代,然后將開始輸出錯誤的數字。 此時,它應從地址0x230變為0x28B,而應為0x260。 看起來在此特定迭代中未調用read和cout。

最后一個正確的值是3f4fc938。 下一個值應為3ef646c1。

有誰知道為什么這會失敗? 任何幫助表示贊賞。

這是程序:

int main(int argc, char* argv[]) {
    fstream in;
    uint32_t buffer;
    in.open(argv[1]);
    in.seekg(0x6500,in.beg);
    for(int i = 0; i < 940; i++) {
        in.read(reinterpret_cast<char*> (&buffer),4);
        cout << hex << buffer << endl;
        in.seekg(0x2c,in.cur);
    }
}

您已以文本模式打開文件。 文本模式意味着對文件的操作將把與平台特定的換行符匹配的字節序列解釋為單個'\\n'字符。 例如,如果您使用的是Windows,則換行符表示為字節序列0D 0A 因此,在Windows上,您對文件所做的任何操作都可以正常工作,直到文件碰巧有一個值為13的字節,然后為值為10的字節。作為單個字符。 本質上,如果文本模式恰好出現在值10的字節之前,則文本模式只會吞下任何值13的字節。您的應用程序將永遠看不到13,並且超出出現13的點的任何內容最終都會“移位”一個字節。 。 在其他平台上,其他換行符也很常見。 如果要使用二進制數據,通常會希望以二進制模式打開文件,例如

fstream in(argv[1], std::ios::binary);

要么

in.open(argv[1], std::ios::binary);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM