`
qimo601
  • 浏览: 3446325 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

ofstream、ifstream、fstream

阅读更多

学习一下C++的文件流:

 

 

ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;

在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:

1、插入器(< < )
  向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout< < " Write Stdout" < < '\n'; 就表示把字符串" Write Stdout" 和换行字符('\n')输出到标准输出流。

2、析取器(> > )
  从流中输入数据。比如说系统有一个默认的标准输入流(cin),一般情况下就是指的键盘,所以,cin> > x; 就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。

  在C++中,对文件的操作是通过stream的子类fstream(file stream)来实现的,所以,要用这种方式操作文件,就必须加入头文件fstream.h。下面就把此类的文件操作过程一一道来。

一、打开文件
  在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:

void open(const char* filename,int mode,int access);

参数:

filename:  要打开的文件名
mode:    要打开文件的方式
access:   打开文件的属性
打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:

ios::app:   以追加的方式打开文件
ios::ate:   文件打开后定位到文件尾,ios:app就包含有此属性
ios::binary:  以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
ios::in:    文件以输入方式打开(文件数据输入到内存)
ios::out:   文件以输出方式打开(内存数据输出到文件)
ios::nocreate: 不建立文件,所以文件不存在时打开失败
ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败
ios::trunc:  如果文件存在,把文件长度设为0
  可以用“或”把以上属性连接起来,如ios::out|ios::binary

  打开文件的属性取值是:

0:普通文件,打开访问
1:只读文件
2:隐含文件
4:系统文件
  可以用“或”或者“+”把以上属性连接起来 ,如3或1|2就是以只读和隐含属性打开文件。

  例如:以二进制输入方式打开文件c:\config.sys
fstream file1; 
file1.open(" c:\\config.sys" ,ios::binary|ios::in,0);

  如果open函数只有文件名一个参数,则是以读/写普通文件打开,即:
file1.open(" c:\\config.sys" ); < => file1.open(" c:\\config.sys" ,ios::in|ios::out,0);

  另外,fstream还有和open()一样的构造函数,对于上例,在定义的时侯就可以打开文件了:
fstream file1(" c:\\config.sys" );

  特别提出的是,fstream有两个子类:ifstream(input file stream)和ofstream(outpu file stream),ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件。
ifstream file2(" c:\\pdos.def" ); //以输入方式打开文件
ofstream file3(" c:\\x.123" ); //以输出方式打开文件

  所以,在实际应用中,根据需要的不同,选择不同的类来定义:如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义;如果想以输入/输出方式来打开,就用fstream来定义。

二、关闭文件
  打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作,如:file1.close(); 就把file1相连的文件关闭。

三、读写文件
  读写文件分为文本文件和二进制文件的读取,对于文本文件的读取比较简单,用插入器和析取器就可以了;而对于二进制的读取就要复杂些,下要就详细的介绍这两种方式

  1、文本文件的读写
  文本文件的读写很简单:用插入器(< < )向文件输出;用析取器(> > )从文件输入。假设file1是以输入方式打开,file2以输出打开。示例如下:

  file2< < " I Love You" ; //向文件写入字符串" I Love You" 
  int i; 
  file1> > i; //从文件输入一个整数值。

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

操纵符 功能 输入/输出
dec 格式化为十进制数值数据 输入和输出
endl 输出一个换行符并刷新此流 输出
ends 输出一个空字符 输出
hex 格式化为十六进制数值数据 输入和输出
oct 格式化为八进制数值数据 输入和输出
setpxecision(int p) 设置浮点数的精度位数 输出

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

  2、二进制文件的读写
①put()
  put()函数向流写入一个字符,其原型是ofstream &put(char ch),使用也比较简单,如file1.put('c'); 就是向流写一个字符'c'。

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

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

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

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

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

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

    read(unsigned char *buf,int num); 
    write(const unsigned char *buf,int num);

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

例:

    unsigned char str1[]=" I Love You" ; 
    int n[5]; 
    ifstream in(" xxx.xxx" ); 
    ofstream out(" yyy.yyy" ); 
    out.write(str1,strlen(str1)); //把字符串str1全部写到yyy.yyy中
    in.read((unsigned char*)n,sizeof(n)); //从xxx.xxx中读取指定个整数,注意类型转换
    in.close(); out.close();

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

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

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

    istream &seekg(streamoff offset,seek_dir origin); 
    ostream & seekp(streamoff offset,seek_dir origin);

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

ios::beg:  文件开头
ios::cur:  文件当前位置
ios::end:  文件结尾

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

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



iostream库不仅支持终端设备的输入输出,还支持文件的输入输出,和文件有关的输入输出类声明在fstream头文件中,有三个类负责文件的输入输出

1) ifstream类:从istream类派生。
2) ofstream类:从ostream类派生。
3) fstream类:从iostream类派生。

由于文件的输入输出和键盘鼠标的输入输出是不一样的,一般pc机只有一个键盘设备,所以iostream库内部声明了一个istream类的对象cin,这个对象负责从键盘获取数据,而文件设备在系统中是由许多的,所以iostream库内部无法给你为机器的每个文件都创建一个负责获取数据的ifstream对象和负责写入数据的ofstream对象,所以我们要针对一个文件进行读取或写入数据的时候都要自己创建一个ifstream或ostream类的对象来用。

ofstream类的默认构造函数如下:

ofstream::ofstream(const char* filename, int mode = ios::outint openport = filebuf::openport);

filename是要打开的文件名,
mode是打开的方式,
openport是打开文件的属性。

mode可以设置的方式如下:
ios::app        以追加的方式打开
ios::ate        文件打开后定位到文件尾
ios::binary    以二进制方式打开文件,默认是以文本方式打开
ios::in          文件以读(输入)方式打开
ios::out        文件以写(输出)方式打开
ios::trunc     如果文件存在,则把文件清空。
以上属性用“|”(按位或)连接起来。

openprot属性如下:
0    普通文件
1    只读文件
2    隐含文件
4    系统文件
以上属性可以用加或者按位或方式组织起来,比如1|2和3都代表既是只读又是隐含文件。

在windows操作系统中可以不要第三个参数,如果加入第三个参数,那第三个参数是打开文件的共享方式,也就是打开这个文件时,其他进程是否可以读写该文件。
共享方式参数可以是下面的值:
0x10                   //_SH_DENYRW   Denies   read   and   write   access   to   the   file 
0x20                   //_SH_DENYWR   Denies   write   access   to   the   file 
0x30                   //_SH_DENYRD   Denies   read   access   to   the   file. 
0x40                   //_SH_DENYNO   Permits   read   and   write   access   
其他值都会报 "Invalid   sharing   flag "的错误。

    ofstream hFile("c:\\1.txt", ios::out, _SH_DENYRW); // _SH_DENYRW is deny read and write
    
    if (!hFile) // if the file could open, hFile is a handle, else is zero
    {
        cout << "write fail!" << endl;
        cout << "access is denies,maybe the file is readonlys,or use deny read opened of other process." << endl;
    }

    else
    {
        hFile << "by coderlee writes";
        cout << "write success!" << endl;
    }

    hFile.close(); // opened file need close.

上面是写文件的事例代码,先打开文件,然后判断是不是0,如果是0,则提示write fail否则写文件,提示write success.

 

 

参考文章:

ifstream 和 ofstream( 引用)
C++标准库 之 iostream库的学习笔记(二)fstream库以及ofstream类的使用 

分享到:
评论

相关推荐

    ofstream,ifstream,fstream读写文件

    ofstream, ifstream, 和 fstream 是C++标准库中的三个核心文件流类,它们属于 `&lt;fstream&gt;` 头文件,用于实现对磁盘文件的读写操作。这三个类是IO流库的一部分,它们提供了方便的接口来处理输入/输出操作。 ofstream...

    ofstream ifstream 文件操作

    在C++编程语言中,`ofstream` 和 `ifstream` 是进行文件输入输出操作的关键类。这些类定义在 `&lt;fstream&gt;` 头文件中,并提供了多种方法来读写文件。 ### 标题解释:`ofstream ifstream 文件操作` 标题提到了 `...

    ofstream和ifstream详细用法

    ifstream 和 ofstream 是 fstream 的两个子类,分别用于输入和输出文件。ifstream 默认以输入方式打开文件,而 ofstream 默认以输出方式打开文件。 * `ifstream file2("c:\\pdos.def");`:以输入方式打开文件 * `...

    ofstream和ifstream用法

    C++ ofstream 和 ifstream 详细用法 C++ 中的 ofstream 和 ifstream 是两种重要的文件流类,用于从内存到硬盘和从硬盘到内存的数据交换。它们是 C++ 中的流式 I/O 类的子类,具有灵活的操作文件的能力。 标题:...

    C++ ofstream和ifstream详细用法 - 蒲公英的花 - 博客园1

    【C++ ofstream和ifstream详解】 在C++编程中,ofstream和ifstream是标准库中的两个类,它们分别用于处理文件的写入(output)和读取(input)操作。这两个类都是iostream库的一部分,包含了流(stream)的概念,...

    C++文件操作.ppt

    在 C++ 中,文件操作是通过头文件 fstream.h 中定义的文件类(型)实现的,包括 ifstream、ofstream、fstream 等类。这些类提供了各种文件操作的支持,例如打开文件、读取文件、写入文件等。使用这些类需要包含...

    C++ ofstream与ifstream详细用法

    此外,ifstream类和ofstream类分别是fstream的子类,ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件。因此,如果要打开文件用于读取,应使用ifstream;如果要打开文件用于写入,应使用ofstream...

    C++文件读写操作

    在 C++ 中,使用 fstream、ifstream 和 ofstream 三种流来实现文件的读写操作。fstream 是一个基本流,提供了对文件的读写操作;ifstream 是一个输入流,专门用于从文件中读取数据;ofstream 是一个输出流,专门用于...

    利用ifstream和ofstream写的文件分割和合并

    在C++编程中,ifstream和ofstream是用于输入和输出文件的标准库流对象,它们属于iostream库。这个程序示例展示了如何使用这两个类来实现文件的分割和合并功能,这对于处理大文件或者需要分块处理数据的场景非常有用...

    c++ 文件操作(fstream)

    其中,fstream 是 C++ 中一个重要的文件操作类库,提供了三个类:ifstream、ofstream 和 fstream,分别用于从文件读取、向文件写入和打开文件供读写。 1. 文件打开模式 在 C++ 中,文件打开模式是通过 ios 库中的...

    C++文件操作详细解

    本篇将详细讲解C++如何使用ifstream、ofstream和fstream类进行文件的读写操作。 首先,C++通过ofstream、ifstream和fstream这三个类来支持文件的输入输出。ofstream主要用于文件的写操作,ifstream用于文件的读操作...

    C++中fstream,ifstream及ofstream用法浅析

    C++标准库中的`&lt;fstream&gt;`头文件提供了用于文件操作的类,包括`fstream`、`ifstream`和`ofstream`。 1. **fstream类**: `fstream`类是最基础的文件流类,它可以进行读写操作。创建一个`fstream`对象后,使用`open...

    c++ fstream类详解

    C++中的文件流主要由四个类组成:`ifstream`、`ofstream`、`fstream`和`iofstream`。其中,`fstream`和`iofstream`是多功能类,分别提供读写和同时读写的能力。`ifstream`默认以输入方式打开文件,而`ofstream`则...

    C++文件读写详解

    在这个主题中,我们将深入探讨C++中用于文件操作的三个主要类:ofstream、ifstream和fstream,以及它们的相关使用方法。 ofstream 类是专门用于文件写操作的,它是ostream类的派生类。当我们创建一个ofstream对象并...

    Log_Encapsulation_demo.rar

    在这个"Log_Encapsulation_demo"项目中,开发者采用C++编程语言,利用fstream、ofstream和ifstream库来实现了一个高效且灵活的日志操作类。这个类不仅能够提供毫秒级的打印速度,还能在日志文件达到预设大小时自动...

    fstream 用法-有注解

    它提供了类`ifstream`(输入文件流)、`ofstream`(输出文件流)和`fstream`(双向文件流),使得程序员可以方便地读写磁盘上的文件。在本教程中,我们将深入探讨`fstream`的用法,特别是如何在控制台环境中实现文件...

Global site tag (gtag.js) - Google Analytics