分享

C ++文件流操作

 WUCANADA 2013-06-16

C++文件流操作

分类: C++ 31人阅读 评论(0) 收藏 举报

文件流操作

所谓文件,一般指存在外部介质上的数据的集合。根据数据组织形式,C++将其分为

文本文件和二进制文件。

文本文件又称ASCII文件,它的每个字节存放一个ASCII码。

代表一个字符,在内存和外设上的文件流传输需要经过类型转换,将内存中的值转换为

对应的ASCII码,再存放到外设中。

二进制文件,则是把内存中的数据,按其在内存中的存储形式原样写到磁盘上存放,不

作任何转换。

ASCII编码格式的用:fstream ifstream ofstream 类处理

Unicode编码格式的用:wfstream wifstream wofstream类处理

文件流的基本操作:1、打开文件 2、读取数据 3、处理数据 4、数据写回 

5、关闭文件 

一、打开文件

实质:在内存中建立起一个数据结构,该结构与文件相对应,包括文件的名称

、起始位置、大小、当前读写位置等。

用文件流类打开文件有两种方式:1、调用类的构造函数 2、调用成员函数open

1、构造函数的种类

所有的文件流类都有两个版本的构造函数

fstream的构造函数

fstream();

explicit fstream(const char * filename,

ios_base::openmode  mode=ios_base::in|ios_base::out);

ifstream的构造函数

ifstream();

explicit ifstream(const char * filename,

ios_base::openmode  mode=ios_base::in);

ofstream的构造函数

ofstream();

explicit ofstream(const char * filename,

ios_base::openmode  mode=ios_base::out);

注:

带参数的是直接打开目标文件(只可处理该文件,不可替换打开其它文件)

不带参数的意味着目标文件还没有确定,可以使用open函数指定,open

参数表与上面的参数表相同,

打开新文件之前,需要执行close关闭原来的文件,否则open会调用返回失败。

文件流对象.fali( );测试是否打开成功。

2、打开方式

openmode

功能

ios::app

打开一个输出文件,用于将数据添加到文件尾部

ios::ate

打开一个现在文件,把文件指针移动文件末尾

ios::binary

以二进制方式打开一个文件,默认为文本文件

ios::in

打开一个文件,以便进行输入操作

ios::out 

打开一个文件,以便进行输出操作

ios::trunc

打开一个文件,如果文件已存在,删除其中全部数据,如果文件不存在,则建立新文件

ios::nocreate

打开一个文件,如果文件不存在,则打开失败

ios::noreplace

打开一个文件,如果文件存在,则打开失败

注:新的C++类库,不再提供 nocreate noreplace,可使用“ | ”,来组合打开方式

而且只有binary 才能指定是二进制文件。

二、数据操作(读取,处理,写回)

1、格式化读写(或者称直接文本读写,使用 << >> 直接读取和写入普通字符)

一般用于默认打式方式(文本文件打开方式)的处理,如:

输出文件流对象<<”Hello World!”;这面的终端是文件,而不是屏幕

输入文件流对象>>var; 将文件中的文本读取到变量var中。

这里是按文本格式输入输出,中间有格式的转换。

2、无格式读写

istream中定义的成员函数

int get(char c);每次读取一个字节(字符)

read(char * buff , int len);每次读取len个字节(字符)到buff中

ostream中定义的成员函数

int put(char c);每次向文件写入一个字节(字符)

wirte(const char * buff ,  int len );每次向文件写入buff中前len个字节(字符)

有多个重载版本。

三、文件流的状态判断

1、检测文件结束

函数原型:

int eof(); 如果返回0,则表示到了文件流尾。

2、文件是否成功打开

bool is_open();如果返回true,则表示成功打开

3、文件流的状态

有4种基本状态,四个静态数据成员

iostate值

含义

ios_base::eofbit

已经到达文件尾

ios_base::badbit

流的完整性被破坏

ios_base::failbit

不能读写期望的数据

ios_base::goodbit

流处理正常的状态

同一般数据流的操作一样,文件流也可以通过调用相应的函数来判断是否处于某种状态。

例如:

eof()——检测———>ios_base::badbit

fail()————检测————>ios_base::failbit或ios_base::badbit

good()————检测————>

ios_base::eofbit

ios_base::badbit

ios_base::failbit

注意:当用同一个文件流对象处理不同的文件时,需要清除前一个文件操作留下的状态值,使用clear();,否则在后面处理时进行状态判断会导致意外的结果。

四、重定位文件读写位置

类istream提供了3个成员函数来对读指针进行操作

tellg(); 返回输入文件读指针的当前位置

seekg(文件中的位置); 将输入文件中读指针移到指定的位置

seekg(位移量,参照位置); 以参照位置为基准移动若干字节

类ostream提供了3个成员函数来对写指针进行操作

tellp(); 返回输出文件写指针的当前位置

seekp(文件中的位置); 将输出文件中写指针移动指定的位置

seekp(位移量,参照位置); 以参照位置为基准移动若干字节

注:文件中的位置和位移量 都是long型整数,以字节为单位,

参照位置可以是下面三者之一:

ios::beg 文件开头

ios::cur 文件指针当前位置

ios::end 文件末尾

如果位移量为正,则向后,为负则向前。

如果是fstream对象,则可以任意使用这些函数。

五、关闭文件

成员函数:

close();

测试程序:

  1. #include <iostream>  
  2.   
  3. #include <fstream>  
  4.   
  5. #include <string>  
  6.   
  7. using namespace std;  
  8.   
  9. int main()  
  10.   
  11. {  
  12.   
  13.     char buff[4096];//设置缓冲区  
  14.   
  15.     //创建一个输入流对象  
  16.   
  17.     ifstream in_file("site.tar",ios::binary);//两个流对象同时采用二进制方式 //拷贝文件名可自行修改  
  18.   
  19.     if(!in_file)  
  20.   
  21.     {  
  22.   
  23.         cout<<"文件不存在!"<<endl;  
  24.   
  25.          exit(0);  
  26.   
  27.     }  
  28.   
  29.     //创建输出流对象  
  30.   
  31.     ofstream copy_file("site2.tar",ios::binary|ios::trunc|ios::out); // 若加ios::trunc//与文件创建链接,如果文件不存在,则创建文件,文件存在,先删除原文件再创建  
  32.   
  33.     if(!copy_file)  
  34.   
  35.     {  
  36.   
  37.         cout<<"数据复制失败"<<endl;  
  38.   
  39.      }  
  40.   
  41.     else  
  42.   
  43.     {  
  44.   
  45.         while(!in_file.eof())//没有到文件尾  
  46.   
  47.         {  
  48.   
  49.             in_file.read(buff,1024);  
  50.   
  51.             int n=in_file.gcount();//读取实际read的字符数  
  52.   
  53.             copy_file.write(buff,n);  
  54.   
  55.         }  
  56.   
  57.         cout<<"数据复制成功"<<endl;  
  58.   
  59.            
  60.   
  61.     }  
  62.   
  63.     in_file.close();  
  64.   
  65.     copy_file.close();  
  66.   
  67.     return 0;  
  68.   
  69. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多