gpt4 book ai didi

c++ - 如何遍历 getline() 中的每一行

转载 作者:行者123 更新时间:2023-11-30 04:09:15 25 4
gpt4 key购买 nike

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

ss是字符串流,fileIn是文件,hexInput是字符串,memory[]是short int数组,instruction是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++ 程序,对我尝试实现的其中一些功能还很陌生。感谢您的帮助...

最佳答案

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

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

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

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

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

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

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

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

关于c++ - 如何遍历 getline() 中的每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21370491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com