c++文件流

来源:互联网 发布:复制淘宝首页海报 编辑:程序博客网 时间:2024/05/05 02:40

来源:http://topic.csdn.net/t/20061015/04/5082872.html

 

 文件的概念  
   
          在外存上保存的信息以文件形式存放,   每个文件有一个文件名,并存放在某盘的一个确定的目录下。  
   
  如:   D:/du/abc.dat   是一个文件名的全称。  
   
                  在C++中文件按存储格式分为两类:文本文件(ASCII文件)和二进制文件。对于字符的输入和输出,文本文件与二进制文件没有区别,但对于数值型的数据,在对文本文件进行I/O   时,要进行格式转换,而二进制文件不需要。如:向文本文件输出   12345   时,由于   12345   是一个整数,在内存中以4个字节的二进制补码格式存放,输出到文本文件时要将每一位数字转换成ASCII码,即   31   32   33   34   35。  
   
          在对文件进行I/O时,必须定义一个文件流类的对象,并用该对象打开文件。对于每一个对开的文件,都有一个指向文件中当前位置的指针,打开文件时该指针的开始位置由打开方式决定(默认为0,即起始字节)。在向文件读出或写入信息时,文件指针自动向后移动相应的字节(打于文本文件移动一个字节,对二进制文件由数据类型决定)。当文件指针移到最后,读出的是文件结束符时,文件流对象调用成员函数eof()返回true。  
                                                             
  ^                                                          
  |                                                          
  f   文件指针  
   
     
   
          在程序中使用文件,必须使用   #include   <fstream.h>   命令。  
   
  建立文件流对象和打开文件  
   
                  在打开文件前先建立文件流对象,可以建立ifstream,ofstream   和   fstream类的对象。如:  
   
  ifstream   fin;   //建立输入文件流对象  
   
  ofstream   fout;   //建立输出文件流对象  
   
  fstream   fio;   //建立输入输出文件流对象  
   
          打开文件可使用open成员函数,每一个文件件流类都有一个   open   成员函数,其原型为:  
   
  void   open(const   char   *   fname,int   mode);  
   
          其中第一个参数   fname   是代表文件件名的字符串,第二个参数   mode   是文件的打开方式,每一位代表一种打开方式   ,在ios基类中用枚举常量表示,如下表:  
  文件的打开方式  
  ios::in   文件打开用于数据输入,即从文件中读数据  
  ios::out   文件打开用于数据输出,即向文件中与数据  
  ios::ate   打开文件时文件指针指向文件结束位置  
  ios::app   文件打开用于追加数据,文件指针始终在文件尾  
  ios::trunc   若打开文件已存在,使之成为空文件  
  ios::nocreate   若打开文件不存在则不建立,返回打开失败信息  
  ios::noreplace   打开文件时不能覆盖,若文件存在则返回打开失败信息  
  ios::binary   打开文件为二进制文件,否则为文本文件  
   
          若规定文件的打开方式具有上述的多种拖拉机开方式   时,可用位运算来组合。如:  
   
  ios::in|ios::nocreate   //文件打开用于数据输入,若打开文件不存在则返回打开失败信息  
   
  ios::in|ios::out   //文件打开既用于数据输入,又用于输出  
   
  ios::app|ios::nocreate   //文件打开指针在文件尾,用于追加数据,  
   
                                          //若打开文件不存在则返回打开失败信息  
   
  ios::out|ios::noreplace   //文件打开用于数据输出,若文件存在则返回打开失败信息  
   
  ios::in|ios::out|ios::binary   //文件以二进制方式打开,既用于数据输入,又用于输出  
   
  如:  
   
  例1:  
   
  ofstream   fout;  
   
  fout.open("D://DU//ABC.DAT");  
   
  例2:  
   
  ifstream   fin;  
   
  fin.open("a://tz.txt",ios::in|ios::nocreate);  
   
  例3:  
   
  ofstream   fo("c://mxz.dat",ios::app);  
   
  if   (fo.fail())   {  
   
          cerr<<"打开文件失败!"<<endl;  
   
          exit(1);  
   
  }  
   
  例4:  
   
  fstream   fio("c://sin.dat",ios::in|ios::out|ios::binary);  
   
     
   
  文本文件的访问操作  
   
  1.向文本文件输出数据  
   
          向文本文件输出数据有两种方法:  
   
          (1)调用从   ostream   流类继承来的插入操作符重载函数,函数原型为:  
   
                          ostream   &   operator   <<   (简单类型   &);  
   
          (2)调用从   ostream   流类继承来的成员函数   put,函数原型为:  
   
                          ostream   &   put(char);    
   
  例1:向d:/abc.dat   文件输出   0   -   10   之间的整数:  
   
  #include   <stdlib.h>  
   
  #include   <fstream.h>  
   
  void   main()  
   
  {  
   
          ofstream   fout("d://abc.dat");  
   
          if   (fout.fail())   {   //若打开文件失败  
   
  cerr<<"d://abc.dat   file   not   opened   !"<<endl;  
   
                  exit(1)  
   
          }  
   
          for   (int   i=0;i<=10;i++)   fout   <<i<<"   ";  
   
          fout.close()   //关闭   fout   对应的文件  
   
  }  
   
  例2:把从键盘上输的若干行文字存入d:/tz.txt,键盘输入以   ctrl+Z   结束。  
   
  #include   <stdlib.h>  
   
  #include   <fstream.h>  
   
  void   main()  
   
  {  
   
          ofstream   fout("d://tz.txt");  
   
          if   (!fout)   {   //若打开文件失败  
   
                  cerr<<"File   d://tz.txt   not   open"<<endl;  
   
                  exit(1);  
   
          }  
   
          char   ch=cin.get();  
   
          while(ch!=EOF)   {  
   
                  fout.put(ch);  
   
                  ch=cin.get;  
   
          }  
   
          fout.close();  
   
  }  
   
  2.从文本文件输入数据  
   
          从文本文件输入数据到内存有三种方法:  
   
          (1)调用从   istream   流类继承来的提取操作符重载函数,函数原型为:  
   
                          istream   &   operator   >>(简单类型   &);  
   
          (2)调用从   istream   流类继承来的成员函数   get()   或   get(char   &),函数原型为:  
   
                          int   get();                            
   
                          istream   &   get(char   &);    
   
          (3)调用从   istream   流类继承来的成员函数   getline,函数原型为:                            
   
                          istream   &   getline(char   *   buffer,int   len,char="/n");    
   
  例3:   将例子1中建立的d:/abc.dat   中的内容显示出来。  
   
  #include   <stdlib.h>  
   
  #include   <fstream.h>  
   
  void   main()  
   
  {  
   
          ifstream   fin("d://abc.dat");  
   
          if   (fin.fail())   {   //若打开文件失败  
   
  cerr<<"d://abc.dat   file   not   opened   !"<<endl;  
   
                  exit(1)  
   
          }  
   
      int   x;  
   
                  while   (fin>>x)   cout   <<   x   <<   "   ";        
   
          fin.close()   //关闭   fout   对应的文件  
   
  }  
   
  程序的运行结果为:  
   
  0   1   2   3   4   5   6   7   8   9   10  
   
     
   
  二进制文件的访问操作  
   
  1.向二进制文件输出数据  
   
          向二进制文件输出数据有可调用从   ostream   流类提供的成员函数,函数原型为:  
   
                          ostream   &   write(const   char   *   buffer   ,int   len);  
   
          利用   ostream   流类提供的seekp成员函数能把输出文件中的文件指针移动到指定位置,函数原型为:  
   
                          ostream   &   seekp(long   dis,seek_dir   ref=ios::beg);  
   
          其中   seek_dir   是ios根基类中定义的枚举类型,它有三个常量:ios::beg,ios::cur   和   ios::end,分别代表文件的开始位置,当前位置和结束位置;  
   
          dis   是文件移动的字节数,为正表示后移(向结尾方向),为负表示向前移。  
   
  例子1:将整型数组   a   中的   45,56,23,87,54,67,78   这几个整数写入到文件d:/intdata.dat中。  
   
  #include   <stdlib.h>  
   
  #include   <fstream.h>  
   
  void   main()  
   
  {  
   
          ofstream   fout("d://intdata.dat",ios::out|ios::binary);  
   
          if   (!fout)   {  
   
                  cerr<<"File   d://intdata.dat   open   failed!<<endl;  
   
                  exit(1);  
   
          }  
   
  int   a[]={45,56,23,87,54,67,78};  
   
  for   (int   i=0;i<sizeof(a)/sizeof(a[0]);i++)  
   
                  fout.write((char   *)&a[i],sizeof(a[0]));  
   
          fout.close();  
   
  }  
   
  2.从二进制文件输入数据  
   
          从二进制文件输入数据有可调用从   istream   流类提供的成员函数,函数原型为:  
   
                          istream   &   read(char   *   buffer   ,int   len);  
   
          利用   istream   流类提供的seekg成员函数能把输入文件中的文件指针移动到指定位置,函数原型为:  
   
                          istream   &   seekg(long   dis,seek_dir   ref=ios::beg);  
   
          例子2:将上例中文件d:/intdata.dat的内容输出。  
   
  #include   <stdlib.h>  
   
  #include   <fstream.h>  
   
  void   main()  
   
  {  
   
          ifstream   fin("d://intdata.dat",ios::in|ios::binary);  
   
          if   (!fin)   {  
   
                  cerr<<"File   d://intdata.dat   open   failed!<<endl;  
   
                  exit(1);  
   
          }  
   
          int   x;  
   
          while   (!fin.eof())   {  
   
                  fin.read((char   *)&x,sizeof(x));  
   
                  cout   <<   x<<   "   ";  
   
          }  
   
          fin.close();  
   
  }  

原创粉丝点击