标题:[求助]求助关于文件流的一道题
只看楼主
hzdz
Rank: 2
等 级:论坛游民
帖 子:46
专家分:10
注 册:2007-2-3
 问题点数:0 回复次数:24 
[求助]求助关于文件流的一道题
编写一个函数,其唯一的形参和返回值都是istream&类型。该函数应一直读取流到达文件结束符为止,还应将读到内容输出到标准输出中。最后,重设流使其有效,并返回该流。

这是c++ primer上的一道题,我以前对文件操作都是用C语言的方法进行,对这个流基本上没个概念,甚至都读不懂题

请各路高手帮我写个程序框架,或者分析也行,叫我干什么,函数是写成下面这样吗?
istream& process_input(istream& is);

我就有点奇怪既然形参是引用了,还返回它干什么,似乎没有必要

请大家不吝赐教,谢谢
搜索更多相关主题的帖子: 文件 函数 primer 应将 
2007-09-16 23:04
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 

[QUOTE]istream& process_input(istream& is);
我就有点奇怪既然形参是引用了,还返回它干什么,似乎没有必要[/QUOTE]

cin >> a >> b

可以连用不是吗?



Fight  to win  or  die...
2007-09-16 23:43
HJin
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:401
专家分:0
注 册:2007-6-9
得分:0 
回复:(hzdz)[求助]求助关于文件流的一道题

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;
}


I am working on a system which has no Chinese input. Please don\'t blame me for typing English.
2007-09-17 00:45
hzdz
Rank: 2
等 级:论坛游民
帖 子:46
专家分:10
注 册:2007-2-3
得分: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文件,打不出来。。

2007-09-17 11:32
hzdz
Rank: 2
等 级:论坛游民
帖 子:46
专家分:10
注 册:2007-2-3
得分:0 
再回复三楼版主:

C++正处于学习当中,好些东西以前没接触过,像cout<<xx<<yy<<..这种只是机械地会使,而不知其所以然。所以问的问题有旱可能会比较菜,还望不要见怪哈。
2007-09-17 11:34
HJin
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:401
专家分:0
注 册:2007-6-9
得分:0 

live to learn, brother.


I am working on a system which has no Chinese input. Please don\'t blame me for typing English.
2007-09-17 13:10
hzdz
Rank: 2
等 级:论坛游民
帖 子:46
专家分:10
注 册:2007-2-3
得分:0 
6楼版主,看看我4楼贴出来的,我认为和你的一样,但用一个fstream测试时,一个都打不出来
2007-09-17 14:47
HJin
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:401
专家分:0
注 册:2007-6-9
得分:0 
回复:(hzdz)6楼版主,看看我4楼贴出来的,我认为和...

#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;
}


I am working on a system which has no Chinese input. Please don\'t blame me for typing English.
2007-09-17 15:35
hzdz
Rank: 2
等 级:论坛游民
帖 子:46
专家分:10
注 册:2007-2-3
得分:0 

首先谢谢你

这里关于逗号表达式的应用有一点疑问:
我原来先判断是不是有输入,再判断输入是不是结尾。这样的话不管读入过程中发生什么问题,都可以继续读入,直到遇到文件结束符。而你改进以后的函数只管读入,万一有错(无论出现bad还是fail),流都处于错误状态,文件读入就不会完全

不知道我的理解对不对?请指教

2007-09-17 16:19
hzdz
Rank: 2
等 级:论坛游民
帖 子:46
专家分:10
注 册:2007-2-3
得分:0 
版主,刚才把你的东西复制进去。。调试不对啊,我的环境是vc6
2007-09-17 16:37



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-170450-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.837992 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved