二进制文本和文本文件

    一些操作系统如DOS区分二进制文件和文本文件。文本文件将一切内容都保存为文本,因此像54,325这样很大的数字就保存为一串数字('5','4',',','3','2','5').这样效率很低,但是优点是可以像DOS命令type这样简单的程序来阅读文本。

    为了帮助文件系统区分二进制文件和文本文件,C++提供了ios::binary标志。在许多系统上这个标志都被忽略了,因为所有数据都以二进制数据存储。在一些稍微严谨的系统上,ios::binary标志是非法的,不能通过编译。

    二进制文件不仅能存储整数和字符串,而且还能存储整个数据结构。可以使用fstream的write()方法一次写入所有数据。

    如果你使用write,你可以使用read来恢复数据。然而这些参数都需要字符指针做参数,所以必须把类的地址强制转化成字符指针。这些函数的第二个参数是要写入的字符个数,这个个数可以由sizeof来确定。

把一个类写入一个文件的实例:

#include<fstream>
#include<iostream>
using namespace std;
class Animal
{
public:
 Animal(int weight,long days):itsWeight(weight),itsNumberDaysAlive(days){};
 ~Animal(){}
 int GetWeight() const{return itsWeight;}
 void SetWeight(int weight){itsWeight=weight;}
 long GetDaysAlive()const{return itsNumberDaysAlive;}
 void SetDaysAlive(long days){itsNumberDaysAlive=days;}
private:
 int itsWeight;
    long itsNumberDaysAlive;
};
int main()
{
 char fileName[80];
 cout<<"please enter the file name:";
 cin>>fileName;
 ofstream fout(fileName,ios::binary );
 if(!fout)
 {
  cout<<"Unable to open"<<fileName<<"for writing\n";
  return (-1);
 }
 Animal Bear(50,100);
 fout.write ((char*)&Bear,sizeof Bear);
 fout.close();
 ifstream fin(fileName,ios::binary );
 if(!fin)
 {
  cout<<"Unable to open"<<fileName<<"\n";
  return -1;
 }
 Animal BearTwo(1,1);
 cout<<"bearTwo weight"<<BearTwo.GetWeight()<<endl;
 cout<<"BearTwo days:"<<BearTwo.GetDaysAlive ()<<endl;
 fin.read ((char*)&BearTwo,sizeof BearTwo);
 cout<<"BearTwo weight:"<<BearTwo.GetWeight() <<endl;
 cout<<"BearTwo days:"<<BearTwo.GetDaysAlive ()<<endl;
 fin.close ();
 return 0;
}

 

posted @ 2012-10-29 13:46  东卓  阅读(220)  评论(0编辑  收藏  举报