从fstream读取十六进制值到int

时间:2011-04-05 17:21:32

标签: c++ fstream

我有一个文本文件,每行有一个十六进制值。像

这样的东西
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'
}

现在这没有按预期工作。虽然有些数字正在填充,但ch逻辑存在缺陷。任何人都可以告诉我正确的方法。 我基本上需要使用int等效函数填充数组。

4 个答案:

答案 0 :(得分: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;在上面的循环中,它永远不会进入主体,代码将退出。

答案 1 :(得分:1)

fstream的::运营商GT;&GT;会忽略空白,所以你不必担心吃新线。

答案 2 :(得分:0)

...以及更改方式的方法是使用noskipwsf >> std::noskipws;在您使用std::skipws操纵符之前不会设置空格。

但为什么要阅读'\n'?要确保每行有一个号码?有必要吗?

答案 3 :(得分:0)

如上所述,在您显示的代码中手动提取空白是不必要的。但是,如果您将来遇到此需求,可以使用std::ws操纵器执行此操作。