C++:文件的输入和输出
1、共同的打开文件方式:
 fin.open("test.txt",ios::binary)
           fout.open("test.txt",ios::binary)
           fboth.open("test.txt",ios::in|ios::out|ios::binary) 
       或者
	       fistream fin("test.txt",ios::binary)
		   fostream fout("test.txt",ios::binary)
		   fstream fboth("test.txt",ios::in|ios::out|ios::binary)    
二进制文件的读写
  第一种方式:使用函数get和put 
1.例如     fout.put(ch)
           fin.get(ch) 
//练习1 将a到z的26个字符写到E:\\C++\\file2.txt中,并读取出来
#include<iostream> #include<fstream> using namespace std; //往文件写入数据 void filefout() { //ofstream fout("E:\\C++\\file2.txt",ios::binary); ofstream fout; fout.open("E:\\C++\\file2.txt",ios::binary); if(!fout) { cout<<"the write file can not open"; exit(1); } char ch='a'; for(int i=0;i<26;i++) { fout.put(ch); ch++; } fout.close(); } //从文件读取数据 void filefin() { ifstream fin; fin.open("E:\\C++\\file2.txt",ios::binary); if(!fin) { cout<<"the read file can not open"; exit(1); } char ch; while(fin.get(ch)) cout<<ch; /* while(!fin.eof()) { fin.get(ch); cout<<ch; } */ fin.close(); cout<<endl; } int main() { filefout(); filefin(); return 0; } /* abcdefghijklmnopqrstuvwxyz */
第二种方式:使用read函数和write函数 
2.例如 fin.read(char*buf,int len)
fout.write(char*buf,int len)
练习2:将两门课程名和成绩以二进制的形式存储在E:\\C++\\file3.txt中,并读取出来
#include<iostream> #include<fstream> using namespace std; struct list { char course[15]; int score; }; //往文件中写入数据 void filewrite() { list list[2]={"Computer",90,"Math",78}; ofstream fout("E:\\C++\\file3.txt",ios::binary); if(!fout) { cout<<"The write file can not open!\n"; abort();//exit(1) } for(int i=0;i<2;i++) { fout.write((char*)&list[i],sizeof(list[i])); } fout.close(); } //从文件读取数据 void fileread() { list list[2]; ifstream fin("E:\\C++\\file3.txt",ios::binary); if(!fin) { cout<<"The read file can not open!\n"; exit(1); } for(int i=0;i<2;i++) { fin.read((char*)&list,sizeof(list[i])); cout<<list[i].course<<" "<<list[i].score<<endl;; } fin.close(); } int main() { filewrite(); fileread(); return 0; } /* Computer 90 Math 78 请按任意键继续. . . */
2、在头文件fstream.h中: 
 类名                  说明                 功能
 ifstream           输入文件流类            用于文件的输入
 ofstream           输出文件流类            用于文件的输出
 fstream            输入输出流类            用于文件的输入/输出 
建立流对象,例如 
ifstream fin
ofstream fout
fstream  fboth  
打开文件方式有两种: 
(1)使用成员函数open打开文件
     文件流对象.open(文件名,打开模式) 
     例如:fin.open("test.txt",ios::in)===fin.open("test.txt") 
           fboth.open("test.txt",ios::in|ios::out|ios::binary)
	 打开模式例如:ios::in输入操作、ios::out输出操作、ios::binary二进制模式  输入输出模式一般会按流对象进行默认 
(2)定义文件流对象时指定参数,通过调用文件流类的构造函数打开文件
     例如:ofstream fout("test.txt")..... 
 
判断读写文件是否成功?
判断条件:文件打开失败,与文件相关联的流对象的值是0;否则是1.
 例如:if(!fout)
       {
      cout<<"Cannot open file!\n ";
      //return 1;
	   } 
  
关闭文件:fout.close();
练习1:先建立一个输出文件,向它写入数据,然后关闭文件,在按输入模式打开它,并读取信息。
#include<iostream> #include<fstream> using namespace std; int main() { //往文件写入数据 ofstream fout("E:\\C++\\file1.txt");//ofstream fout("E:\\C++\\file1.txt","ios:out"); if(!fout) //如果文件打开失败,fout返回0 { cout<<"Cannot open file!\n "; return 1; } fout<<"Hello world!\n"; //将一个字符串写到文件中 fout<<100<<' '<<hex<<100<<endl; //将一个十进制的100,分别以十进制格式和二进制格式写到文件中 fout.close(); //关闭写入流 //从文件读取数据 ifstream fin("E:\\C++\\file1.txt"); //ifstream fin("E:\\C++\\file1.txt","ios::in") if(!fin) //如果文件打开失败,fin返回0 { cout<<"Cannot open file!\n "; return 1; } char buffer[15]; //定义一个存储数据的字符数粗缓冲区 while(!fin.eof()) { fin.getline(buffer,15); //一行一行读取数据 cout<<buffer<<endl; } /* while(!fin.eof()) { cout<<ch; fin.get(ch); } */ fin.close(); //关闭读取流 return 0; }
3、
(1). 检测文件结束EOF(end of file) 采用文件流方式读取方式时,使用成员函数eof(),可以检测这个结束符。
   如果该函数的返回值非0,表示到达文件尾;返回值为0,表示未到达文件末尾。
例如: ifstream fin;
       ....
	   if(!fin.eof())  //尚未到达文件末尾 
	   {
       ...
	   } 
或者  
       ifstream fin;
	   ....
	   if(!fin)       //尚未到达文件末尾
	   {
       ...
	   } 
	   
或者
      这种方式最常用:while(fin.get(ch))
                      cout.put(ch);//cout<<ch<<endl;
					  
					  
(2).二进制文件的随机读取
   类istream提供了3个成员函数来对读指针进行操作: 
   tellg()                                       //返回输入文件读指针的当前位置
   seekg(文件中位置)                             //将输入文件中读指针移动指定的位置
   seekg(位移量,参照位置)                        //以参照位置为基准,移动若干字节
   
   文件中位置和位移量都是long型整数,以字节为单位,
   参照位置  ios::beg                            //从文件开头计算要移动的字节数
             ios::cur                            //从文件指针的当前位置计算要移动的字节数
			 ios::end                            //从文件末尾指针要移动的字节数
   
   例如	 fin.seekg(-/+50,ios::cur)               //从文件指针当前位置向前/向后移动50个字节	
   类ostream提供了3个成员函数来对写指针进行操作:
   tellp()                                       //返回输出文件写指针的当前位置
   seekp(文件的位置)                             //将输出文件中写指针移动到指定的位置
   seekp(位移量,参照位置)                        //以参照位置为基准移动的若干字节
练习:随机访问二进制数据文件
有3门课程的数据,要求:
(1)以读写方式打开一个磁盘文件,并把这些数据存储到磁盘文件E:\\C++\\file4.txt; 
(2)将文件指针定位到第3门课程,读取第3门课程的数据并显示出来;
(3)将文件指针定位到第1门课程,读取第1门课程的数据并显示出来;
#include<iostream> #include<fstream> using namespace std; struct List { char course[15]; int score; }; int main() { List list[3]={{"Computer",98},{"Math",78},{"Chinese",100}}; List st; fstream fboth; fboth.open("E:\\C++\\file4.txt",ios::out|ios::in|ios::binary); if(!fboth) { cout<<"The read-write file can not open!\n"; abort(); } for(int i=0;i<3;i++) { fboth.write((char*)&list[i],sizeof(List)); } //定位指针到第3门课程 fboth.seekg(sizeof(List)*2); fboth.read((char*)&st,sizeof(List)); cout<<st.course<<"\t"<<st.score<<endl; //定位指针到第1门课程 fboth.seekg(sizeof(List)*0); fboth.read((char*)&st,sizeof(List)); cout<<st.course<<"\t"<<st.score<<endl; //定位指针到下一门课程 fboth.seekg(sizeof(List)*1,ios::cur); fboth.read((char*)&st,sizeof(List)); cout<<st.course<<"\t"<<st.score<<endl; fboth.close(); return 0; }
(4)将文件指针定位从当前位置定位到下一门课程,读取该门课程的数据并显示出来;
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号