ifstream文件尾最后一行读两次

来源:互联网 发布:linux中man的用法 编辑:程序博客网 时间:2024/05/20 22:30


        只是想简单地从文件中读入字符串,却发觉最后一个字符串读了两次。

        代码如下:

        ifstream input_positive("train-pos.lst");

        string input_str;

        vector<string> positive_img_name;

        while(input_positive)

        {

                getline(input_positive,input_str);

                positive_img_name.push_back(input_str);

        }

        在网上查看了别人出现的相关错误,有的人说应该读取之后判断eof。

        修改代码为:

         ifstream input_positive("train-pos.lst");

         string input_str;

         vector<string> positive_img_name;

         while(input_positive)

         {

                getline(input_positive,input_str);

                if(input_positive.eof()) 

                               break;

                positive_img_name.push_back(input_str);

         }        

        这下最后一行确实只读了一次了,不过我发觉第一行却没有读进去。不知道怎么回事。

        再次修改代码为:

         ifstream input_positive("train-pos.lst");

         string input_str;

         vector<string> positive_img_name;

         while(input_positive)

         {

                getline(input_positive,input_str);

                if(input_positive.fail()) 

                           break;

                positive_img_name.push_back(input_str);

         }        

        这下子终于没有问题了。

        fail() 判断最后的一次读写操作是否成功; 

        eof() 判断是否读到了流末尾; 
        bad() 是否遇到了致命错误(如文件打不开); 

        good() 这三个错误都没遇到; 

        所以eof()不能够用来在循环中判断文件是否读到最末尾,容易出现问题。

    

        eof()只有在你尝试读取文件结尾之后才会返回true,也就是说它的判断是滞后的。

最后一次读到文件末尾时,eofbit标志是false,所以再次读入,此时读取失败,eofbit

标志置为true,此时再次调用eof()才返回true,但是这里却把最后一行数据再次压入vector中。    


         标准流类中,有四个比较重要的bit,分别是goodbiteofbit。

         badbit表示在输入序列中遇到完整性缺失(比如在读取文件时遇到一个不可恢复的读故障)。

         eofbit表示读取到输入序列的末尾。

         failbit表示输入操作未读取到期望的符号,或输出操作未产生需要的符号。

         goodbit为0。

        所以,goodbit可以使用good()成员函数查询,查询流是否没有错误;eofbit可以用eof()成员函数查询,查询输入流是否读到输入序列结尾;failbit可以用fail()成员函数来查询,查询上一次流输入或输出操作是否成功(还可以用operator void*()bool operator ! ()成员函数查询);badbit可以使用bad()成员函数查询,查询流是否遇到致命错误。

原创粉丝点击