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() 一起使用;的主要内容,如果未能解决你的问题,请参考以下文章

使用 ofstream 将数据写入其文件后更新 ifstream 对象

std::getline 在遇到 eof 时抛出

C++的ofstream与ifstream使用

C++(八):fstream读写操作

C++的面向行的输入:getline()与get()

C++的面向行的输入:getline()与get()