.eof() 以及std::getline(ifstream &, string &)

#include <fstream>

#include <string>

#include <iostream>

using namespace std;

 

int main()

{

    ifstream infile("abc.txt");

    if(!infile) {}

 

    ofstream outfile("out.txt");

    string str;

    for(int i=0; i< 1000; i++)

   {

        getline(infile,str);                  //这里的问题是如果infile到头了,依旧对str赋值吗?

        cout<<str<<endl;

        outfile<<str<<endl;              //那么这里呢?仍然输出到outfile?是什么形式呢?

   }

 

    return 0;

}

 

答:如果infile到头了,那么getline(infile,str)将会把str赋值为最后一行,在这个例子里将不断重复。比如说文件abc.txt内容为:a /n b/n c/n the end of the file EOF那么str将一直被赋值为the end of the file。但是如果最后the end of the file /n EOF,str将被赋值为空字符,记住getline是省略掉最后的/n的

    std::getline(ifstream& , string &)的返回类型是ifstream&,如果infile碰到EOF之后,couture<<getline(infile, str);结果将是00000000.可以在if语句while语句中利用这点做判断。

    另一个判断方式就是infile.eof()。在C++primer 4thed里头说“流的状态由bad,fail,eof和good操作揭示。如果bad,fail或者eof中的任意一个为true,则检查流本身将显示该流处于错误状态。……clear操作将条件重新设为有效状态”,这里看来,VS2008编译器已经做了优化,对于eof状态为true的流也可以重复读取最后一行(就是EOF所在的行)。当然这件事情是好是坏也不好说。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值