2011-04-05 59 views
1

我有一個文本文件,每行有一個十六進制值。類似於從fstream讀取十六進制值到int

80000000 
08000000 
0a000000 

現在我正在寫一個C++代碼來直接讀取它。有點像

fstream f(filename, ios::in); 

while(!f.eof) 
{ 
    int x; 
    char ch; 
    f>>std::hex>>x>>ch; // The intention of having ch is to read the '\n' 
} 

現在這不按預期方式工作。雖然有些數字正確填充,但邏輯錯誤。任何人都可以告訴我正確的做法。 我basicaly需要填充與int等價的數組。

+1

運算符>>忽略空白(包括'\ n'),所以ch正在讀取下一個字('0')和'('0')的第一個字符 – 2011-04-05 17:25:06

+1

btw,eof不是字段,但是一個方法,所以表達式應該是!f.eof() – 2011-04-05 17:56:30

回答

1

fstream :: operator >>會忽略空格,所以你不必擔心自己吃了換行符。

5

這工作:

#include <iostream> 
#include <fstream> 

int main() 
{ 
    std::ifstream f("AAPlop"); 

    unsigned int a; 
    while(f >> std::hex >> a) /// Notice how the loop is done. 
    { 
     std::cout << "I("<<a<<")\n"; 
    } 
} 

注:我不得不的a的類型更改爲unsigned int,因爲它是溢出的int,從而導致循環失敗。

80000000: 

作爲十六進制值,它設置32位值的最高位。我的系統上有一個int(sizeof(int)== 4)在我的系統上溢出。這會將流設置爲不良狀態,並且不會進一步閱讀。在OP循環中,這將導致無限循環,因爲EOF從不設置;在上面的循環中,它永遠不會進入主體並且代碼將退出。

0

...和改變它的方法是使用noskipwsf >> std::noskipws;將設置不跳過空白,直到您使用std::skipws操縱器。

但是,您爲什麼要閱讀'\n'?確保每行有一個數字?有必要嗎?

0

如前所述,在您顯示的代碼中手動提取空格是不必要的。但是,如果您將來遇到此需求,則可以使用std::ws操縱器進行此操作。