首页    新闻    下载    文档    论坛     最新漏洞    黑客教程    数据库    搜索    小榕软件实验室怀旧版    星际争霸WEB版    最新IP准确查询   
名称: 密码:      忘记密码  马上注册
安全知识 :: 黑客教程

c 读取文件


http://www.gipsky.com/
很早之前就想写点什么东西,可是一直都没有这个心静下来,最近终于有时间了,想想自己的水平也不算什么,还敢在网上发表谬论,深感惶恐,希望高手们不要扔我砖头,也希望这点东西对新手有些许帮助。大家共同学习共同进步吧。



我想c 的文件操作也不是很难,想必大家都会,所以今天就说说我以前碰到过的一些问题,希望对大家有用。



设定:我打算要将一篇英文文章读取到内存中,顺便可能对文件做一些操作。



我挺喜欢《海上钢琴师》这部电影的,就以这部电影的一个英语影评(部分)来做测试文档吧:



He's a man so brave, that he can play the imaginary piano when exploded with the ship he was born, lived and died in. Yet he's a man so scared, that he cannot face the infinite city life we are living everyday. He's a man so intelligent, that he can play the piano as if he has four arms (or I'd rather say, he has God's arms).



Yet he's a man so stupid, that he chose to gone with the wind while he's other choice could be marrying a beautiful woman and having a child. He's a man so perceptive, that he could use his music language to describe exactly others' feelings. Yet he's a man so insensitive that he'd rather disappear after a gentle kiss on his beloved while she's asleep than unburden himself and tell her "ILU".



就习惯性的命名为input.txt吧.



根据我们的目标,两年多以前我会这么写:



#include <iostream>



#include <fstream>



using namespace std;





int main()



{



char ch[1000];



ifstream ifs("input.txt");



if( ifs.fail() )



return -1;



int i=0;



char c;



for(;!ifs.eof();i )



{



ifs>>c;



ch<i> = c;



}



ch<i> = '\0';



ifs.close();



i=0;



while( ch<i> != '\0' )



{



cout<<ch[i ];



}



return 0;



}



程序没有错误,运行也可以,不会崩溃,而且也能读取出字符来,可惜读取出来是这样的效果:



He'samansobrave,thathecanplaytheimaginarypianowhenexplodedwiththeshiphewasborn,l



ivedanddiedin.Yethe'samansoscared,thathecannotfacetheinfinitecitylifeweareliving



everyday.He'samansointelligent,thathecanplaythepianoasifhehasfourarms(orI'drathe



rsay,hehasGod'sarms).Yethe'samansostupid,thathechosetogonewiththewindwhilehe'sot



herchoicecouldbemarryingabeautifulwomanandhavingachild.He'samansoperceptive,that



hecouldusehismusiclanguagetodescribeexactlyothers'feelings.Yethe'samansoinsensit



ivethathe'dratherdisappearafteragentlekissonhisbelovedwhileshe'sasleepthanunburd



enhimselfandtellher"ILU"..请按任意键继续. . .



这可不是我要的效果,空格呢?换行呢?谁吃去了?



其实呢,是被>>给吃了,它把空格和换行符都吃掉了。还有一个不妥在于数组的分配,假如字符数大于了1000,怕是要出问题哦!



当然,我们可以用这样的方法来解决:



ifs.seekg(0,ios::end);



int size = ifs.tellg();



哈哈,动态分配,你可真聪明。可是动态分配有能怎样呢?我们还是不能读取到空格和换行啊。



别着急,一句话就搞定了,我们把下面这句话添加到刚才的代码中去:



ifs>>noskipws; //放在读取的前面



哈哈,貌似成功啦!呵呵。。



这样,我们的目标就差不多达到了,不过我们今天可不能就这点吧?是的,你猜对了,我们再继续探寻别的方法,大家都知道string吧?好,有了它,我们就N好办事了哦。看招:



#include <iostream>



#include <fstream>



#include <string>



#include <iterator>





using namespace std;





int main()



{



ifstream ifs("input.txt");



if( ifs.fail() )



return -1;



string ss;



char ch;



while( !ifs.eof() )



{



ifs.get(ch);



ss.push_back(ch); //自己用VC7.0以上的版本哦,否则用vector<char>代替string



}



ifs.close();







copy( ss.begin(),ss.end(),ostream_iterator<char>(cout,""));



//for( string::iterator it=ss.begin();it!=ss.end();it )



// cout<<*it; //一个作用用for_each也是可以的





return 0;



}



运行下丫,行了吧?呵呵。



我看着while循环很不顺眼,你呢?好讨厌哦,呵呵,去掉它,真烦人:



#include <iostream>



#include <fstream>



#include <string>



#include <iterator>





using namespace std;





int main()



{



ifstream ifs("input.txt");



if( ifs.fail() )



return -1;



string ss;



ifs.unsetf( ios::skipws );



copy( istream_iterator<char>(ifs),istream_iterator<char>(),back_insert_iterator<string>(ss) );



ifs.close();







copy( ss.begin(),ss.end(),ostream_iterator<char>(cout,""));





return 0;



}



怎么样?还正常吧?





呵呵,什么?你还嫌代码多?好,看来不出绝招是不行的啦。



#include <iostream>



#include <fstream>



#include <string>



#include <iterator>





using namespace std;





int main()



{



ifstream ifs("input.txt");



if( ifs.fail() )



return -1;



string ss( ( istreambuf_iterator<char>(ifs)),istreambuf_iterator<char>());



ifs.close();







copy( ss.begin(),ss.end(),ostream_iterator<char>(cout,""));





return 0;



}



这下你总满足了吧?还不满足我也没办法啦。。。今天到此结束,欢迎各位光临!



希望各位高手还有什么其它的好方法不要吝啬,拿出来分享吧。
<< post是什么意思 ACE与ASIO之间关于Socket编程的比较 >>
评分
10987654321
API:
gipsky.com& 安信网络
网友个人意见,不代表本站立场。对于发言内容,由发表者自负责任。

系统导航

 

Copyright © 2001-2010 安信网络. All Rights Reserved
京ICP备05056747号