C++:将 ifstream 与 getline() 一起使用;
Posted
技术标签:
【中文标题】C++:将 ifstream 与 getline() 一起使用;【英文标题】:C++: Using ifstream with getline(); 【发布时间】:2012-08-21 10:24:01 【问题描述】:检查这个程序
ifstream filein("Hey.txt");
filein.getline(line,99);
cout<<line<<endl;
filein.getline(line,99);
cout<<line<<endl;
filein.close();
文件 Hey.txt 中有很多字符。超过1000
但我的问题是 为什么在第二次我尝试打印行。打印不出来?
【问题讨论】:
【参考方案1】:从流中读取行的惯用方式是这样的:
std::ifstream filein("Hey.txt");
for (std::string line; std::getline(filein, line); )
std::cout << line << std::endl;
注意事项:
没有close()
。 C++ 在习惯使用时会为您处理资源管理。
使用免费的std::getline
,而不是流成员函数。
【讨论】:
这实际上对我的问题没有任何帮助 @MohamedAhmedNabil:您从不检查输入操作的返回值,因此完全不可能知道您的程序在做什么。 我第一次打印行时,它会打印出前 99 个字符,但下次我这样做时它什么也没打印出来 问题在于,如果 98 个字符内没有换行符,则将其视为失败,因此将流置于失败模式,即设置了std::ios_base::failbit
。设置此位后,流将不会提取任何字符。但奇怪的是,它修改了字符数组以将空字符存储到下一个位置,即第一个位置。
因此这是处理流的最惯用的方式。【参考方案2】:
根据 C++ 参考 (here),getline 会在提取 count-1 个字符时设置ios::fail
。您必须在getline()
调用之间调用filein.clear();
。
【讨论】:
对您的答案进行一些解释会很棒。什么是 ios::fail 以及发生了什么:D 我喜欢像你这样的人,这样推动我前进。再次感谢 在 std::ios_base 中定义了几个位来跟踪流的内部状态:goodbit、badbit、failbit、eofbit。当设置任何“坏”位时,流停止读取并评估为假(例如,用作while
条件)。这就是为什么 Kerrek SB 建议使用 while 循环。
位只影响流。文件没有真正发生任何事情。【参考方案3】:
#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;
【讨论】:
虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。【参考方案4】:正如 Kerrek SB 所说,有两种可能性:
1)第二行是空行
2)没有第二行,超过1000个字符都在一行,所以第二个getline
没什么可取的。
【讨论】:
实际上即使是一行,getline 也应该从中断处继续以上是关于C++:将 ifstream 与 getline() 一起使用;的主要内容,如果未能解决你的问题,请参考以下文章