【C++】⽂件的读取与写⼊
C++的⽂件读取与写⼊感觉⽐起其它语⾔特别地难,对⽐起《【】⽂件读写操作》()、《【】让记事本成为你调控变量的控制台》()与《【】输⼊与输出与JDK1.5之后的新型字符串StringBuilder》(),C++最⼤的特点就是⽂件的输⼊流与输出流分开,同时最关键的是⾃⾝并没有字符串变量,在其⽂件的读取⽅法变量限制于字符数组char[],需要利⽤到⼀个⼆维的字符数组char[][]才能完事。
同时由于各⼤的编译器不同,C++在你不对变量初始化也不会出现警告的情况下,你还必须⽤memset⽅法,⾃⼰对⼆维字符数组初始化,使得判断为空的条件⼀致。
下⾯,⽤以下的⼀个程序说明问题:
如果f:\1.txt不存在,则先⾃⼰创建这个⽂件,之后,⽤户不停地输⼊数据,直到输⼊exit;结束。
程序的难度主要是在⽂件的内容读⼊到C++的⼆维数组上,其基本思想如下图所⽰:
代码如下:
[cpp]
01. #include<iostream>
02. #include<fstream>
03. using namespace std;
04. int main(){
05.
06. char input[255];//⽤来接受⽤户输⼊的内容
07. char fileContent[100][255];//⽤来接⽂件内容的数组,相等于⼀个⼀维的字符串数组。
08. memset(fileContent,'\0',sizeof(fileContent));//这⾥必须对整个数组进⾏初始化,不然的话,不同的编译器对数组初始化的
值不同,导致下⾯的输出⽆法判断
09. char* filePath="F:\\1.txt";//这样可以避免引⼊string头⽂件,使⽤string类型了
10.
11. while(1){
12. //读取⽂件到C++
13. ifstream infile(filePath,ios::in|ios::_Nocreate);//vs写成ios::_Nocreate,vc6是ios::nocreate
14. if(!infile){//如果输⼊流初始化失败就是⽂件不存在
15. cout<<filePath<<"不存在,已为你创建!"<<endl;
16. ofstream fileCreate(filePath,ios::_Noreplace);//⽤来创建⽂件专⽤的输出流,vs写成ios::_Noreplace,vc6是
ios::noreplace
17. if(fileCreate){
18. fileCreate.close();//⼈⾛带门
19. }
20. else{
21. cerr<<"出错了!"<<endl;
22. exit(1);
23. }
24. }
注释已经说得⽐较清楚了。这⾥不再赘述。
唯⼀想说⼀下,
涉及⽂件操作,开头必须引⼊<fstream>
利⽤getline ⽅法,C++能把⼀⾏内指定长度的内容,这⾥是255,读取到你指定的⼀维数组中,遇到Enter 等换⾏符则⾃动终⽌,⽆论此时所读的⼀⾏长度是否累积到255,同时⾃⼰把光标移到下⼀⾏。25. else { 26. for (int i=0;!f();i++){//这个循环的结束条件是输⼊流遇到⽂件的结尾,也就是读完F:\1.txt 中的数据 27.
if (!strcmp(input,"exit;")){//如果⽤户输⼊的字符串与exit;相等,strcmp(input,"exit;")则返回0,进⼊这个条件结构,终⽌这个程序 41.python怎么读的
return 0;//这就是主函数以int 类型作为返回值,return 0的好处,⽤来设定程序终点,当然如果⽤void 作为主函数的返回值exit(0);也可以做到这⼀点 42. } 43. 44. //C++输出内容到⽂件 45.
ofstream outfile(filePath,ios::ate|ios::_Nocreate);//ios::ate 可以直接把指针放到⽂件末尾。ios::app 不好⽤,要配合outfile.seekp(0,ios::end)才能把⽂件弄到⽂件末尾,默认是在⽂件头 46. if (!outfile){ 47. cerr<<"出错了!"<<endl; 48. exit(1); 49. } 50. else { 51. outfile<<input<<'\n';//将⽤户输⼊的内容对⽂件输出流进⾏输出 52. } 53. outfile.close();//⼈⾛带门 54. } 55. }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论