请检查这个程序
ifstream filein("Hey.txt");
filein.getline(line,99);
cout<<line<<endl;
filein.getline(line,99);
cout<<line<<endl;
filein.close();
Hey.txt这个文件里有很多字符,远超过1000个。
但我的问题是:为什么第二次尝试打印这一行时,它没有被打印出来?
从流中读取行的惯用方法是:
std::ifstream filein("Hey.txt");
for (std::string line; std::getline(filein, line); )
{
std::cout << line << std::endl;
}
注意事项:
不需要使用close()
方法,当以惯用方式使用时,C++会为您处理资源管理。
请使用免费的std::getline
函数,而不是流成员函数。
#include<iostream>
using namespace std;
int main()
{
ifstream in;
string lastLine1;
string lastLine2;
in.open("input.txt");
while(in.good()){
getline(in,lastLine1);
getline(in,lastLine2);
}
in.close();
if(lastLine2=="")
cout<<lastLine1<<endl;
else
cout<<lastLine2<<endl;
return 0;
}
获取一行的更简单的方法是使用ifstream
的提取运算符。
string result;
//line counter
int line=1;
ifstream filein("Hey.txt");
while(filein >> result)
{
//display the line number and the result string of reading the line
cout << line << result << endl;
++line;
}
这里的一个问题是,当行中有空格' '
时,它将无法工作,因为在ifstream
中它被视为字段分隔符。如果您想要实现这种解决方案,请将字段分隔符更改为例如-
/
或任何其他您喜欢的字段分隔符。
如果您知道有多少个空格,则可以使用ifstream
的提取器运算符中的其他变量来吃掉所有空格。考虑文件包含名字和姓氏。
//file content is: FirstName LastName
int line=1;
ifstream filein("Hey.txt");
string firstName;
string lastName;
while(filein>>firstName>>lastName)
{
cout << line << firstName << lastName << endl;
}
getline
无法获取任何内容。
getline
之后不检查错误条件,就不能保证任何情况。 - Kerrek SBstd::ios_base::failbit
。当此位被设置后,该流将不会提取任何字符。奇怪的是,它会修改字符数组并存储一个空字符到下一个位置,也就是第一个位置。 - Dietmar Kühl