| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2061 人关注过本帖
标题:[求助]求助关于文件流的一道题
取消只看楼主 加入收藏
hzdz
Rank: 2
等 级:论坛游民
帖 子:46
专家分:10
注 册:2007-2-3
收藏
得分:0 

谢谢HJIN版,我现在基本明白eof()判断什么了

还有一个问题,我在开贴的时候提出的:这种函数为什么要写成stream& func(stream$)的形式,二楼aipb2007版给我解释的是因为便于连用我有些不太理解。。

按我们一般理解函数的方式,引用形参传递是非复制传递,我们可以在函数中直接处理传递进来的流,而不是复制这个流(流本身的特性也决定它不能复制,这点恰好成立)。只是这里:函数得到实参的引用然后又返回实参的引用的意义怎么来体现呢?是为了出现可能的比如stream& sample=func(stream&)的用法吗?

还是像aipb2007版所说的那种cin>>a>>b式的连用?

如果是后者,那么前面那个process_input函数,您可以举个例子给我看一下这种用法吗?

2007-09-19 11:43
hzdz
Rank: 2
等 级:论坛游民
帖 子:46
专家分:10
注 册:2007-2-3
收藏
得分:0 
回复:(HJin)回复:(hzdz)谢谢HJIN版,我现在基本...

嗯,这个现在也基本明白,谢谢HJin版,不过又有新问题
关于ofstream::app,请看我下面的代码
我就是实现了一个简单的txt文件copy,通过main形参指定读和写的文件名(无须扩展名)
打开文件的模式在我用红色标明那行里指定,按理说如果我多次对同一文件做写入操作,那个文件里应该有多个读入文件的副本,可事实是:显式指定app和未指定是一样的,就好像显式地指定了out
我的环境是vc60,请你在vc80下试试

还有一个问题:我在这个程序里使用vector保存,方法是申请了全局的vector,如果我想在main里申请这个vector,怎么把它传到process_input里让它能动态增长为好?用svec_it& svec?这种引用方式?或者如果是你,你会怎么处理,请传授点经验~谢谢!
#include <iostream>
#include <vector>
#include <string>
#include <fstream>

using namespace std;

typedef std::vector<string>::const_iterator svec_it;
vector<string> svec;

ofstream& output_file(ofstream& stm,string& filename,svec_it beg,svec_it end)
{
stm.close();//奇怪,第一次一定得先关掉清理一次流,再重新打开才行。
stm.clear();

stm.open(filename.c_str(),ofstream::app);//这里奇怪
if (!stm)
{

cout<<"文件打开失败"<<endl;
stm.setstate(ofstream::badbit);
return stm;
}

for (svec_it iter=beg;iter!=end;++iter)
{
stm<<*iter<<endl;
}
stm<<flush;

cout<<"文件存储完成"<<endl;

stm.close();
stm.clear();
return stm;

}
istream &process_input(istream& is)//本函数作用:读入流,打印出来
{
if (!is)
{
cout<<"打开指定文件失败"<<endl;
is.setstate(istream::badbit);

// is.clear();
// is.ignore();
return is;
}
string str;

int flag=1;

cout<<"正在进行读入操作,请稍候..."<<endl;
while (getline(is,str),!is.eof())
{

if (is.bad())
{
throw runtime_error("该文件已经损坏,不可读取!");

cout<<"系统IO错误,无法读取"<<endl;
}
if (is.fail())
{
cerr<<"第"<<flag<<"处读取错误,跳过"<<endl;
is.clear();
is.ignore();
++flag;
continue;
}

svec.push_back(str);
++flag;

}

/* cout<<"已经读入文件,现在打出来"<<endl;
for (svec_it it=svec.begin();it!=svec.end();++it)
{
cout<<*it<<endl;
}
cout<<endl;
*/
return is;
}


int main(int argc,char** argv)
{
while (argc!=3)
{
cout<<"参数数目不符"<<endl;
cout<<"按q退出"<<endl;

char a;
cin>>a;
if ('q'==a)
{
return EXIT_FAILURE;
}
else
{
continue;
}
}
//前面写完了参数错误时候的情况,下面写正确处理
string str_input(".txt");
str_input=argv[1]+str_input;
ifstream input(str_input.c_str());
process_input(input);
if (input.bad())
{
cout<<"调用文件处理函数读入操作失败,请检查输入文件名"<<endl;
input.clear();
input.ignore();
return EXIT_FAILURE;
}
else
{
cout<<"已经处理完读入文件,现在将文件写入预定的文件中...;"<<endl;
}

string out_file(".txt");
out_file=argv[2]+out_file;

ofstream output(out_file.c_str());
//output.close();这个文件输出流有点怪,如果这里使用时候不进行关掉清理流的操作,在调用函数里就得补上这一步
//output.clear();

output_file(output,out_file,svec.begin(),svec.end());
if (output.bad())
{

cout<<"调用文件处理函数写入操作失败,请检查该文件是否设置了只读或其它设备原因"<<endl;
output.close();
output.clear();
return EXIT_FAILURE;
}
else
{
return EXIT_SUCCESS;

}



}

2007-09-19 15:52
hzdz
Rank: 2
等 级:论坛游民
帖 子:46
专家分:10
注 册:2007-2-3
收藏
得分:0 
无人过问,自顶一贴
2007-09-20 17:32
hzdz
Rank: 2
等 级:论坛游民
帖 子:46
专家分:10
注 册:2007-2-3
收藏
得分:0 

嗯,这两点明白了,现在就剩最后一个问题: ofstream::app的作用在我的程序里似乎没体现出来,每次打开文件都是以out模式打开的,这是为什么?

2007-09-20 22:16
hzdz
Rank: 2
等 级:论坛游民
帖 子:46
专家分:10
注 册:2007-2-3
收藏
得分:0 
看起来是没问题。。可是程序运行就不对,第二次打开同一文件的时候,不是在文件尾部插入内容,而是直接覆盖原来的东西
2007-09-21 15:55
快速回复:[求助]求助关于文件流的一道题
数据加载中...
 
   



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

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