【问题标题】:C++: Using ifstream with getline();C++:将 ifstream 与 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

但我的问题是 为什么在第二次我尝试打印行。打印不出来?

【问题讨论】:

    标签: c++ file-io fstream getline


    【解决方案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 也应该从中断处继续
    猜你喜欢
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    相关资源
    最近更新 更多