我有一个文本文件,每行有一个十六进制值。像
这样的东西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等效函数填充数组。
答案 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)
...以及更改方式的方法是使用noskipws
:f >> std::noskipws;
在您使用std::skipws
操纵符之前不会设置空格。
但为什么要阅读'\n'
?要确保每行有一个号码?有必要吗?
答案 3 :(得分:0)
如上所述,在您显示的代码中手动提取空白是不必要的。但是,如果您将来遇到此需求,可以使用std::ws
操纵器执行此操作。