消息关闭
    暂无新消息!

c++ 标准IO库问题

问题作者 : 王秀美2017-07-18发布
在学习c++  primer   书中 第八章 IO标准库  8.3节 习题 8.7中  按照要求写代码,
要求:使用vector容器存放三个文件的路径。不过 运行现实的结果   是最后一个文件的内容没有完全显示出来,是因为什么呢?
本人c++学的很浅,刚刚开始学习,还请各位前辈多多指教,十分感谢!

#include<fstream>
#include<iostream>
#include<string>
#include<vector>
using namespace std;


istream& input(istream& in) {
string arr;
while (in >> arr, !in.eof()) {
if (in.fail()) {
cerr << "error:input error,please try again." << endl;
in.clear(istream::failbit);
continue;
}
if (in.bad()) {
throw runtime_error("IO  stream corrupted");
}
cout << arr << endl;
}
in.clear();
return in;
}

//istream& input(istream& in) {
// string str;
// while (in>>str,!in.eof())
// {
// if (in.fail())
// {
// cerr << "error:input error,please try again." << endl;
// in.clear(istream::failbit);
// continue;
// }
// if (in.bad())
// {
// throw runtime_error("IO stream corrupted");
// }
//
//
// }
//}

int main(int argc,char** argv) 
{
/*
习题8.7
*/
vector<string> file(3);
file[0] = "D:\\text.txt";
file[1] = "D:\\text1.txt";
file[2] = "D:\\text3.txt";
ifstream infile;
string s;
vector<string>::const_iterator iter = file.begin();
while (iter != file.end())
{
infile.open((*iter).c_str());
if (!infile) {
break;
}
input(infile);
infile.close();
infile.clear();
iter++;
}



5个回答

︿ 1
while (!in.eof(), in >> arr) //调换一下顺序,否则最后一次读取之后eof标志会被置位,那么将不会进入循环体
︿ 1

#include<fstream>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
 
 
istream& input(istream& in) {
    string arr;
    while (in >> arr, !in.eof()) {
        if (in.fail()) {
            cerr << "error:input error,please try again." << endl;
            in.clear(istream::failbit);
            continue;
        }
        if (in.bad()) {
            throw runtime_error("IO  stream corrupted");
        }
        cout << arr << endl;
    }
    in.clear();
    return in;
}
 
//istream& input(istream& in) {
//    string str;
//    while (in>>str,!in.eof())
//    {
//        if (in.fail())
//        {
//            cerr << "error:input error,please try again." << endl;
//            in.clear(istream::failbit);
//            continue;
//        }
//        if (in.bad())
//        {
//            throw runtime_error("IO stream corrupted");
//        }
//       
//
//    }
//}
 
int main(int argc,char** argv) 
{
    /*
    习题8.7
    */
    vector<string> file(3);
    file[0] = "D:\\text.txt";
    file[1] = "D:\\text1.txt";
    file[2] = "D:\\text3.txt";
    ifstream infile;
    string s;
    vector<string>::const_iterator iter = file.begin();
    while (iter != file.end())
    {   
        infile.open((*iter).c_str());
        if (!infile) {
            break;
        }
        input(infile);
        infile.close();
        infile.clear();
        iter++;
    }
system("pause");
return 0;






上面 是补上的   text3.txt  的文件内容  和   运行结果图片,怎么会  text.txt 的 内容没有完全输出呢?
︿ 0
你好,感谢谢解答哈
  我按照你的提示,将代码改动了,按照你最初的提示  程序试运行成功的,而且也得到了期望的结果(嘿嘿,撒花~)。

#include<string>
#include<vector>
#include<fstream>
#include<iostream>

using namespace std;

istream& input(istream& in) {
string arr;
while (!in.eof(), in >> arr) {

if (in.fail()) {
cerr << "error:input error,please try again." << endl;
in.clear(istream::failbit);
continue;
}
if (in.bad()) {
throw runtime_error("IO  stream corrupted");
}
cout << arr << endl;
}
in.clear();
return in;
}


int main(int argc, char** argv)
{
/*
习题8.7
*/
vector<string> file(3);
file[0] = "D:\\text.txt";
file[1] = "D:\\text1.txt";
file[2] = "D:\\text3.txt";
ifstream infile;
string s;
vector<string>::const_iterator iter = file.begin();
while (iter != file.end())
{
infile.open((*iter).c_str());
if (!infile) {
break;
}
input(infile);
infile.close();
infile.clear();
iter++;
}
system("pause");
return 0;
}



但是为什么会这样呢?我知道逗号表达式是从左往右运算,而且整体的值是最右边表达式的值。那也就是说 按照我之前的代码,是依照in.eof(),的值只作为 循环判断条件。当failbit的值被设置的时候 整体条件值为false,所以无法进入。但设置发生的时候输入流成功读入最后一串字符,因而读入成功却因没有进入循环而没有输出。是这个意思么? 如果这个假设成立的话,那就是说,流的eofbit 值的设置,是在读入最后一串字符的时候,同时发生的是么?
原谅我对c++学习情况很表面啊
︿ 0
而且 还发现  第一个文件的  text.txt    文件内容也没有完全读全。

而且每个文件里面末尾  都有点   也都没有读出来。