这是c++ primer上的一道题,我以前对文件操作都是用C语言的方法进行,对这个流基本上没个概念,甚至都读不懂题
请各路高手帮我写个程序框架,或者分析也行,叫我干什么,函数是写成下面这样吗?
istream& process_input(istream& is);
我就有点奇怪既然形参是引用了,还返回它干什么,似乎没有必要
请大家不吝赐教,谢谢
this is an easy task. I choose to give an answer instead of explain the "why"s --- since there is no why can be asked here.
=================================================== ===============================
#include <iostream>
#include <fstream>
using namespace std;
/**
编写一个函数,其唯一的形参和返回值都是istream&类型。该函数应一直读取流到达文件结束符为止,还应将读到内容输出到标准输出中。最后,重设流使其有效,并返回该流。
这是c++ primer上的一道题,我以前对文件操作都是用C语言的方法进行,对这个流基本上没个概念,甚至都读不懂题
请各路高手帮我写个程序框架,或者分析也行,叫我干什么,函数是写成下面这样吗?
istream& process_input(istream& is);
我就有点奇怪既然形参是引用了,还返回它干什么,似乎没有必要
*/
istream& process_input(istream& is)
{
char ch;
while(!is.eof())
{
is>>noskipws>>ch;
cout<<ch;
}
is.clear();
return is;
}
int main()
{
ifstream ifs("a.txt");
process_input(ifs);
ifs.close();
return 0;
}
感谢二楼三楼的回复,我也是像三楼这么写的。。用vector<string>保存,不过打不出来。。,
看来我的理解还是有点靠谱的,谢谢你们
下面是我自己的函数,大家帮我看看哪出错了,打不出来
istream &process_input(istream& is)
{
string str;
vector<string> svec;
while (is>>str,!is.eof())
{
cout<<"正在进行读入操作,请稍候..."<<endl;
if (is.bad())
{
throw runtime_error("该文件已经损坏,不可读取!");
}
if (is.fail())
{
cerr<<"有一个错,重试"<<ends;
is.clear();
continue;
}
svec.push_back(str);
}
cout<<"已经读入文件,现在将其打印出来"<<endl;
for (std::vector<string>::const_iterator it=svec.begin();it!=svec.end();++it)
{
cout<<*it<<" ";
}
cout<<endl;
return is;
}
我自己测试的时候使用ifstream绑定一个txt文件,打不出来。。
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
/** output (first three lines are the contents of a.txt)
/O1 minimize space /Op[-] improve floating-pt consistency
/O2 maximize speed /Os favor code space
2nd version
14
已经读入文件,现在将其打印出来
/O1 minimize space /Op[-] improve floating-pt consistency /O2 maximize speed /Os
favor code space
Press any key to continue . . .
*/
istream& process_input(istream& is)
{
char ch;
while(!is.eof())
{
is>>noskipws>>ch;
cout<<ch;
}
is.clear();
return is;
}
istream &process_input2(istream& is)
{
string str;
vector<string> svec;
// 1. you will have trouble for the '\n' character.
// 2. you may use getline to read a line insteand of a string each time
while (!is.eof(), is>>str)
{
//cout<<"正在进行读入操作,请稍候..."<<endl;
//if (is.bad())
//{
// throw runtime_error("该文件已经损坏,不可读取!");
//}
//if (is.fail())
//{
// cerr<<"有一个错,重试"<<ends;
// is.clear();
// continue;
//}
//is>>str;
svec.push_back(str);
}
cout<<svec.size()<<endl;
cout<<"已经读入文件,现在将其打印出来"<<endl;
for (std::vector<string>::const_iterator it=svec.begin();it!=svec.end();++it)
{
cout<<*it<<" ";
}
cout<<endl;
return is;
}
int main()
{
ifstream ifs("a.txt");
process_input(ifs);
ifs.close();
std::skipws(ifs);
cout<<"2nd version "<<endl;
ifs.open("a.txt");
process_input2(ifs);
ifs.close();
return 0;
}