[C++]输入/输出流类库

来源:互联网 发布:极点输入法linux版 编辑:程序博客网 时间:2024/05/04 06:16

输入/输出流类库

 

编译系统已经以运算符或函数的形式做好了对标准外设(键盘、屏幕、打印机、文件)的接口,使用时只需按照要求的格式调用即可。

cin>>x;   cout<<x;

cin.get(ch);

 

输入输出流(I/O Stream)

C++语言的I/O系统向用户提供一个统一的接口,使得程序的设计尽量与所访问的具体设备无关,在用户与设备之间提供了一个抽象的界面:输入输出流。

 

用标准流进行输入/输出时,系统自动地完成数据类型的转换。对于输入流,要将输入的字符序列形式的数据变换成计算机内部形式的数据(二进制或ASCII)后,再赋给变量,变换后的格式由变量的类型确定。对于输出流,将要输出的数据变换成字符串形式后,送到输出流(文件)中。 

重载输入(提取)和输出(插入)运算符

class A

{ float x, y;

public:

   A(float a=0, float b=0){  x=a;  y=b;  }

   void Set(float a, float b){ x=a; y=b; }

   void  Show(void){  cout<<x<<‘\t’<<y<<endl;   }

};

void main(void)

{  A   a(2,3);

    a.Set(20 , 30);   输入对象数据

    a.Show( );     输出对象数据

}

对象不能直接输入输出

在C++中允许用户重载运算符“<<”和“>>”,实现对象的输入和输出。重载这二个运算符时,在对象所在的类中,将重载这二个运算符的函数说明该类的友元函数。

重载提取运算符的一般格式为:

 

istream &  operater >>(istream &is, ClassName &f);

返回值类型:类istream的引用,cin中可以连续使用运算符“>>”。

cin>>a>>b;

第一个参数:是“>>”的左操作数cin类型,类istream的引用

第二个参数:是“>>”的右操作数,即欲输入的对象的引用.

 

重载输出(插入)运算符的一般格式为:

 

与输入(提取)运算符比较:

friend  istream &  operater >>(istream &, ClassName &);

将输入流改为输出流。

 

编译系统已经以运算符或函数的形式做好了对标准外设(键盘、屏幕、打印机、文件)的接口,使用时只需按照要求的格式调用即可。

 

文件流

C++在头文件fstream.h中定义了C++的文件流类体系 ,当程序中使用文件时,要包含头文件fstream.h 。

 

当使用文件时,在程序头有:#include<fstream.h>

其中定义了各种文件操作运算符及函数。

程序对文本文件的操作与对键盘、显示器的操作比较:

 

在涉及文本文件的操作时,将输入文件看成键盘,将输出文件看成显示器,格式不变。只需在程序中增加打开与关闭文件的语句。

 

文件的操作

 

56:ASCII表示为 00110101 00110110,占两字节

56:二进制表示为 111000,占六个二进制位

不同的文件操作的函数、格式不同

 

文本文件的打开与关闭

在文件操作前,需要将程序与被操作的文件联系起来,使程序可以“引用”文件。

在程序内定义一个文件类的对象,由该对象与文件发生联系,程序内所有的与文件的操作都是对该对象的操作。

fstream   infile ,  outfile;    两个对象,可以联系两个输入输出文件

ifstream    infile;           对象只能联系输入文件

ofstream   outfile;          对象只能联系输出文件

 

如何使文件类的对象与欲操作的文件发生联系?

用对象打开文件:

ifstream  infile;  //定义输入文件类对象

infile.open(“myfile1.txt”);//利用函数打开某一文件

打开文件的作用是,使文件流对象与要使用的文件名之间建立联系。

ofstream  outfile;  //定义输出文件类对象

outfile.open(“myfile1.txt”);//打开某一文件供输出

infile.open(“myfile1.txt”);

打开文件“myfile1.txt”用于输入,并将这个文件与输入文件类对象infile建立联系,今后,在程序中,用到这个文件“myfile1.txt”的地方就用infile来代替。

outfile.open(“myfile2.txt”);

打开文件“myfile2.txt”用于输出,并将这个文件与输出文件类对象outfile建立联系,今后,在程序中,用到这个文件“myfile2.txt”的地方就用outfile来代替。

如何从文件中输入输出数据?

将文件类对象看成键盘和显示器即可。

ifstream  infile;  //定义输入文件类对象

infile.open(“myfile1.txt”);//利用函数打开某一文件

float  x , y;

infile>>x>>y;

 

ifstream  outfile;  //定义输出文件类对象

infile.open(“myfile2.txt”);//利用函数打开某一文件

  float x=3 , y=4;

outfile<<x<<‘\t’<<y<<endl;

 

4)用完文件后,使用成员函数关闭文件.如:

ifstream  infile;

ofstream outfile

infile.open(“myfile1.txt”);

outfile.open(“myfile2.txt”);

float x,y;

infile>>x>>y;

outfile<<x<<‘\t’<<y<<endl;

infile.close();

outfile.close();

void main(void)

{  int a[10];

   ifstream   infile;//定义输入文件类

   ofstream outfile;//定义输出文件类

   infile.open(“file1.txt”);//打开一个输入文件“file1.txt”

   outfile.open(“file2.txt”);//打开一个输出文件“file2.out”

   for(int i=0;i<10;i++)

         infile>>a[i];//将“file1.txt”中的十个整型数输入到a[i]中

    for(i=0;i<10;i++)

          outfile<<a[i]<<‘\t’;//将a[i]中的十个数输出到文件“file2.txt”中

    outfile<<endl;

   infile.close();//关闭输入文件

   outfile.close();//关闭输出文件

}

 

当用类fstream定义文件对象时,该对象即能定义输入文件对象,又能定义输出文件对象,所以打开文件时,必须在成员函数open()中的参数中给出打开方式(读或写)。

 

在打开文件后,都要判断打开是否成功。若打开成功,则文件流对象值为非零值;若打开不成功,则其值为0。

ifstream    pfile1,pfile2;//定义了两个文件类的对象

pfile1.open(“file1.txt”,  ios::in);

pfile2.open(“file2.txt”, ios::out);

if (!pfile1)  //若为0,打开文件操作失败

 {cout <<”不能打开输入文件:file1.txt”<<’\n’;  exit(1);}

if (!pfile2)

 {cout <<”不能打开输出文件:file2.txt”<<’\n’;  exit(1);}

打开输入文件时,文件必须存在。

打开输出文件时,若文件不存在,则建立文件;若文件存在,则删除原文件的内容,使其成为一个空文件。

 

涉及到字符串的文件读写

char  ch,  str[300];

ifstream   infile(“myfile1.txt”);

ofstream  outfile(“myfiel2.txt”);

从文件输入一字符或一行字符,当输入至文件尾时,函数返回值为0,可以据此来判断循环结束。

从键盘输入一个字符:cin.get(ch);

从文件输入一个字符:infile.get(ch);

向显示器输出一个字符:cout.put(ch);

向文件输出一个字符:outfile.put(ch);

从键盘输入一行字符:cin.getline(str,300);

从文件输入一行字符:infile.getline(ch,300);

 

二进制文件的读写操作

若在文件的打开方式中没有特别说明,打开的文件均为ASCII码文件,若要打开二进制文件,则要特别说明并用特定的读写函数。

 

由于二进制文件中的数据不是ASCII码,故不能直接对其读写,必须要通过特定的函数予以转换。

 

判断二进制文件是否读到文件尾?

infile.eof( )    

当到达文件结束位置时,该函数返回一个非零值;否则返回零。

fstream   infile;

infile.open(“data1.dat”,ios::in|ios::binary);

if(!infile)   //判断打开是否出错

{   cout<<“Open Error!\n”;  exit(1);  }

char  str[300];

while(!infile.eof())   //判断是否读到文件尾

     infile.read(str, 300);

 

文件指针

当一打开文件,文件指针位于文件头,并随着读写字节数的多少顺序移动。

可以利用成员函数随机移动文件指针。

 

随机读取二进制文件

infile.seekg(int);//将文件指针移动到由参数指定的字节处

infile.seekg(100);//将文件指针移动到距离文件头100个字节处

 

infile.seekg(100, ios::beg);//移动到距文件头100个字节

infile.seekg(-100, ios::cur);//移动到距当前位置前100个字节

infile.seekg(-500, ios::end);//移动到距文件尾前500个字节

 

0 0
原创粉丝点击