c++ 标准IO库问题

lgyu9303 2017-07-18 10:51:06
在学习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++;
}


...全文
212 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻夢之葉 2017-07-19
  • 打赏
  • 举报
回复
引用 6 楼 lgyu9303 的回复:
如果这个假设成立的话,那就是说,流的eofbit 值的设置,是在读入最后一串字符的时候,同时发生的是么? 原谅我对c++学习情况很表面啊
对的,是随后置位的。
幻夢之葉 2017-07-18
  • 打赏
  • 举报
回复
引用 3 楼 jianwen0529 的回复:
while (!in.eof(), in >> arr) //调换一下顺序,否则最后一次读取之后eof标志会被置位,那么将不会进入循环体
搞错,应该如下

while (!in.eof())
{
    in >> arr;
    //your code
}
幻夢之葉 2017-07-18
  • 打赏
  • 举报
回复
while (!in.eof(), in >> arr) //调换一下顺序,否则最后一次读取之后eof标志会被置位,那么将不会进入循环体
珞屿 2017-07-18
  • 打赏
  • 举报
回复
而且 还发现 第一个文件的 text.txt 文件内容也没有完全读全。

而且每个文件里面末尾 都有点 也都没有读出来。
珞屿 2017-07-18
  • 打赏
  • 举报
回复

#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 的 内容没有完全输出呢?
珞屿 2017-07-18
  • 打赏
  • 举报
回复
引用 5 楼 shunweilan 的回复:
楼上正解。。。
好的
珞屿 2017-07-18
  • 打赏
  • 举报
回复
你好,感谢谢解答哈
我按照你的提示,将代码改动了,按照你最初的提示 程序试运行成功的,而且也得到了期望的结果(嘿嘿,撒花~)。

#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++学习情况很表面啊
理想三旬 2017-07-18
  • 打赏
  • 举报
回复
楼上正解。。。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧