inti; 

  file1>>i;//从文件输入一个整数值。 


  这种方式还有一种简单的格式化能力,比如可以指定输出为16进制等等,具体的格式有以下一些 


操纵符功能输入/输出 

dec格式化为十进制数值数据输入和输出 

endl输出一个换行符并刷新此流输出 

ends输出一个空字符输出 

hex格式化为十六进制数值数据输入和输出 

oct格式化为八进制数值数据输入和输出 

setpxecision(intp)设置浮点数的精度位数输出 


  比如要把123当作十六进制输出:file1<<hex<<123;要把3.1415926以5位精度输出:file1<<setpxecision(5)<<3.1415926。 


  2、二进制文件的读写 

①put() 

  put()函数向流写入一个字符,其原型是ofstream&put(charch),使用也比较简单,如file1.put('c');就是向流写一个字符'c'。 


②get() 

  get()函数比较灵活,有3种常用的重载形式: 


  一种就是和put()对应的形式:ifstream&get(char&ch);功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。如file2.get(x);表示从文件中读取一个字符,并把读取的字符保存在x中。 


  另一种重载形式的原型是:intget();这种形式是从流中返回一个字符,如果到达文件尾,返回EOF,如x=file2.get();和上例功能是一样的。 


   还有一种形式的原型是:ifstream&get(char*buf,intnum,chardelim='\n');这种形式把字符 读入由buf指向的数组,直到读入了num个字符或遇到了由delim指定的字符,如果没使用delim这个参数,将使用缺省值换行符' \n'。例如: 


  file2.get(str1,127,'A');//从文件中读取字符到字符串str1,当遇到字符'A'或读取了127个字符时终止。 


③读写数据块 

  要读写二进制数据块,使用成员函数read()和write()成员函数,它们原型如下: 


    read(unsignedchar*buf,intnum); 

    write(constunsignedchar*buf,intnum); 


   read()从文件中读取num个字符到buf指向的缓存中,如果在还未读入num个字符时就到了文件尾,可以用成员函数 intgcount();来取得实际读取的字符数;而write()从buf指向的缓存写num个字符到文件中,值得注意的是缓存的类型是 unsignedchar*,有时可能需要类型转换。 


例: 


    unsignedcharstr1[]="ILoveYou"; 

    intn[5]; 

    ifstreamin("xxx.xxx"); 

    ofstreamout("yyy.yyy"); 

    out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中 

    in.read((unsignedchar*)n,sizeof(n));//从xxx.xxx中读取指定个整数,注意类型转换 

    in.close();out.close();

四、检测EOF


  成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是inteof();



例:  if(in.eof())ShowMessage("已经到达文件尾!");



五、文件定位


   和C的文件操作方式不同的是,C++I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下 次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是seekg()和 seekp(),seekg()是设置读位置,seekp是设置写位置。它们最通用的形式如下:


istream&seekg(streamoffoffset,seek_dirorigin); 

    ostream&seekp(streamoffoffset,seek_dirorigin); 


  streamoff定义于iostream.h中,定义有偏移量offset所能取得的最大值,seek_dir表示移动的基准位置,是一个有以下值的枚举: 


ios::beg:  文件开头 

ios::cur:  文件当前位置 

ios::end:  文件结尾 

  这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。 


例: 


    file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节 

    file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节