如何在getline()中的每一行移动

时间:2014-01-26 23:08:23

标签: c++ c++11

每当我运行我的代码时,我会从文件中取出第一行,但只有第一行。有什么我想念的吗?当我实现stringstream尝试更容易读取文件中的十六进制行并更快地将字符串转换为十六进制值时,我遇到了这个问题。它之前相应地读取每一行,但现在不是。我是否在理解getline()的工作方式时遗漏了什么?

ss是stringstream,fileIn是文件,hexInput是字符串,memory []是short int数组,指令是short int,opCounter是int ...

string hexInput;
stringstream ss;
short int instruction;
ifstream fileIn ("proj1.txt");

if (fileIn.is_open())
{
    while ( getline(fileIn, hexInput) ) 
    {
        ss << hex << hexInput;
        ss >> instruction;

        memory[opCounter] = instruction;

        cout << hex << memory[opCounter] << '\t';
        cout << opCounter << '\n';

        ss.str("");
        opCounter++;
    }
    fileIn.close();
}
else cout << "Unable to open file";

上面是整个函数(在使用stringstream之前工作),下面是文件的内容。

4000
0033
0132
2033
4321
2137
D036
A00F
B003
C00C
3217
6217
E044
FFFF
6016
1013
FFFF
0
0
0
0
1
2
3
4
5

有26行,最后一个opCounter输出以十六进制表示“19”,这使我假设文件是​​逐行读取的,但是字符串流从未更新过。这是我的第一个C ++程序,并且是我尝试实现的一些这些功能的新手。 谢谢你的帮助...

1 个答案:

答案 0 :(得分:2)

您的字符串流是从第一行正确创建的。将数字输出到instruction之后,它将为eof(您可以使用ss.eof()进行检查),因为在字符串流中的第一个数字之后没有数据。

ss.str("");替换ss.clear();(您不需要),这将重置eof标志。输入新行并从流中读取将按预期工作。

当然,首先绝对不需要字符串流。

while ( fileIn.good() ) {
    fileIn >> hex >> instruction;
    [...]
}

工作正常。它将以十六进制表示读取短整数,直到一行不能被解释为这样。 (顺便说一下,第7行是因为D036太大而无法容纳在一个短的int中 - 不可否认,这与你当前的行为有所不同,但是你真的想要一个无声的失败吗?此时非常有用的是fileIn.eof()来检查由于流位于文件末尾而导致读取失败,fileIn.clear()是否重置其他失败位

根据要求: 循环通常缩写为

while ( fileIn >> hex >> instruction ) {
    [...]
}

但请注意,如果您想检查读取失败的原因,并且如果它不是eof则继续,则上述循环更适合该任务。