从行读取时 Ifstream 文件被清除
Ifstream file getting cleared when reading from line
我正在尝试从 C++ 中的输入纺织品中读取由白色 space 分隔的字符。我已经成功打开文件并能够遍历它。但是,每当我尝试从文件中的字符分配变量时,这些行似乎都被清除了。第一行的变量设置正确,但不在第一行之后。我不确定我是否错误地访问了 infile,是否缺少一个标志,或者是否有更好的方法来访问字符。
代码:
int lineNumber = 0,*linesMaxVal = new int[lineCount];
string line;
while (getline(infile, line)) {
cout << "line # is " << lineNumber << " line val is: " << "'" << line << "'" << endl;
int x1,x2,x3,x4,x5,max;
infile >> x1 >> x2 >> x3 >> x4 >> x5;
}
如果去掉"infile >> x1 >> x2 >> x3 ... etc"行,输出结果如下(正确)
line # is 0 line val is: '0 0 0 0 0'
line # is 0 line val is: '1 2 3 4 5'
line # is 0 line val is: '5 4 3 2 1'
line # is 0 line val is: '5 100 1000 10000 10500'
line # is 0 line val is: '99999 99999 99998 99999 99999'
line # is 0 line val is: '-1 0 0 0 -1'
line # is 0 line val is: '-9999 -9999 -9998 -9999 -9999'
line # is 0 line val is: '50 1234 457 789 7'
line # is 0 line val is: '123240 -124 -453 234 -99999'
line # is 0 line val is: '234 235 -109 0 12'
line # is 0 line val is: '777 987 234 345 111'
line # is 0 line val is: '12 0 -19 27 19'
line # is 0 line val is: '0 0 0 0 0'
line # is 0 line val is: '-99 -900 45 20 10'
line # is 0 line val is: '13 -56 99 123 90'
line # is 0 line val is: '0 0 1 -11 -1'
line # is 0 line val is: ''
否则,如果保留infile行并定义变量,则输出如下。
line # is 0 line val is: '0 0 0 0 0'
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
感谢任何帮助!
infile >> x1 >> x2 >> x3 >> x4 >> x5;
读取行中的所有数字,但将换行符留在流中。
然后你回到循环的开头 运行:
getline(infile, line)
它立即看到一个换行符,所以它给你一个空字符串,吃掉换行符并继续。
这里的大问题是提取运算符 (>>
) 在流中留下它停止的空白(在本例中是换行符),而 getline
吃掉它停止的任何定界符.将两者混合会导致像这样的小问题。
一种可能的修复方法是在提取运算符之后添加一个 ignore
以从流中获取换行符。
经过一番讨论 in chat,您似乎想要遍历文件并在每一行中找到最大值。我建议使用向量来存储每一行的值并使用算法库来查找最大值:
//Our temp vector. It'll hold a line worth of ints
vector<int> line(5);
while(true) { //one loop = one line
//Loop and read 5 ints (one line's worth) into the vector
for(int x = 0; x < 5 && infile >> line.at(x); x++) { }
if(!infile) { break; } //if we read through everything, we're done!
//find the biggest value in the vector
int biggest = *max_element(line.begin(), line.end());
//Do some things with it...
cout << "Biggest is: " << biggest << endl;
}
有关工作演示,请参见此处:ideone
我正在尝试从 C++ 中的输入纺织品中读取由白色 space 分隔的字符。我已经成功打开文件并能够遍历它。但是,每当我尝试从文件中的字符分配变量时,这些行似乎都被清除了。第一行的变量设置正确,但不在第一行之后。我不确定我是否错误地访问了 infile,是否缺少一个标志,或者是否有更好的方法来访问字符。
代码:
int lineNumber = 0,*linesMaxVal = new int[lineCount];
string line;
while (getline(infile, line)) {
cout << "line # is " << lineNumber << " line val is: " << "'" << line << "'" << endl;
int x1,x2,x3,x4,x5,max;
infile >> x1 >> x2 >> x3 >> x4 >> x5;
}
如果去掉"infile >> x1 >> x2 >> x3 ... etc"行,输出结果如下(正确)
line # is 0 line val is: '0 0 0 0 0'
line # is 0 line val is: '1 2 3 4 5'
line # is 0 line val is: '5 4 3 2 1'
line # is 0 line val is: '5 100 1000 10000 10500'
line # is 0 line val is: '99999 99999 99998 99999 99999'
line # is 0 line val is: '-1 0 0 0 -1'
line # is 0 line val is: '-9999 -9999 -9998 -9999 -9999'
line # is 0 line val is: '50 1234 457 789 7'
line # is 0 line val is: '123240 -124 -453 234 -99999'
line # is 0 line val is: '234 235 -109 0 12'
line # is 0 line val is: '777 987 234 345 111'
line # is 0 line val is: '12 0 -19 27 19'
line # is 0 line val is: '0 0 0 0 0'
line # is 0 line val is: '-99 -900 45 20 10'
line # is 0 line val is: '13 -56 99 123 90'
line # is 0 line val is: '0 0 1 -11 -1'
line # is 0 line val is: ''
否则,如果保留infile行并定义变量,则输出如下。
line # is 0 line val is: '0 0 0 0 0'
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
line # is 0 line val is: ''
感谢任何帮助!
infile >> x1 >> x2 >> x3 >> x4 >> x5;
读取行中的所有数字,但将换行符留在流中。
然后你回到循环的开头 运行:
getline(infile, line)
它立即看到一个换行符,所以它给你一个空字符串,吃掉换行符并继续。
这里的大问题是提取运算符 (>>
) 在流中留下它停止的空白(在本例中是换行符),而 getline
吃掉它停止的任何定界符.将两者混合会导致像这样的小问题。
一种可能的修复方法是在提取运算符之后添加一个 ignore
以从流中获取换行符。
经过一番讨论 in chat,您似乎想要遍历文件并在每一行中找到最大值。我建议使用向量来存储每一行的值并使用算法库来查找最大值:
//Our temp vector. It'll hold a line worth of ints
vector<int> line(5);
while(true) { //one loop = one line
//Loop and read 5 ints (one line's worth) into the vector
for(int x = 0; x < 5 && infile >> line.at(x); x++) { }
if(!infile) { break; } //if we read through everything, we're done!
//find the biggest value in the vector
int biggest = *max_element(line.begin(), line.end());
//Do some things with it...
cout << "Biggest is: " << biggest << endl;
}
有关工作演示,请参见此处:ideone