`
qimo601
  • 浏览: 3418006 次
  • 性别: 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

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

    利用ifstream和ofstream写的文件分割和合并 用c++中的纯fstream写的文件分割和合并程序, 大家可以看看,加强一下c++中的文件操作

    c++ 文件操作(fstream)

    c++ 文件操作 fstream ifstream ofstream

    详解C++文件读写操作

    在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结: 这里主要是讨论fstream的内容: #include &lt;fstream&gt; ofstream //文件...

    C++ ofstream与ifstream详细用法

    在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符: 1、插入器(&lt;&lt;) 向流输出数据。比如说系统有一个默认的标准输出流(cout),一般...

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

    主要介绍了C++中fstream,ifstream及ofstream用法,适合C++初学者学习文件流的操作,需要的朋友可以参考下

    Log_Encapsulation_demo.rar

    使用C++ fstream,ofstream,ifstream封装日志操作类,可设置日志文件存储大小,超出限制新建日志;日志事件毫秒级打印。

    在C++语言中,数据的输入和输出

    C++语言系统为实现数据的输入和输出定义了一个庞大的类库,它包括的类主要有ios,istream,ostream,iostream,ifstream,ofstream,fstream,istrstream,ostrstream,strstream等,其中ios为根基类,其余都是它的直接或间接...

    C++文件的使用

    由 于对类ofstream, ifstream 和 fstream 的对象所进行的第一个操作通常都是打开文件,这些类都有一个构造函数可以直接调用open 函数,并拥有同样的参数。这样,我们就可以通过以下方式进行与上面同样的定义对象和...

    C++文件读写操作

    本文介绍了对文本文件、二进制文件的读写打开关闭等操作,以及fstream、 ifstream、ofstream的使用及方法。

    C++流操作之fstream用法介绍

    在Windows平台对文件进行存取操作可选的方案有很多,... fstream有两个派生类,即ifstream和ofstream,分别对应输入文件流、输出文件流。在使用它们之前,必须将它们的头文件包含到你的cpp文件中。创建一个文件流的方

    利用C++如何覆盖或删除指定位置的文件内容

    我们经常使用ofstream或者fstream可写文件,使用ifstream可以写文件,但需要设置文件的打开状态为iOS::out。C++中IO流打开模式使用位掩码来表示。 IO流打开模式有: 成员常量 app append,追加模式,设置流...

    C++文件操作详解(详细讲述fstream类的使用)

    讲解文件操作的类fstream 并对ifstream和ofstream一并做讲解

    C++读写文本文件和二进制文件(源代码)

    对于文本文件,我们使用std::ofstream和std::ifstream类,并通过流操作符和&gt;&gt;或std::istreambuf_iterator来写入和读取文本数据。对于二进制文件,我们同样使用std::ofstream和std::ifstream类,但设置了std::ios::...

    使用文件流操作文本文件(文件实训)

    头文件中定义了三个类:类 fstream、类 ifstream 和类 ofstream。 类 ifstream 实现文件的输入 类 ofstream 实现文件的输出 类 fstream 实现文件的输入输出 使用文件流操作文件依然可以分为三个步骤:打开文件、读写...

    C++文件读写总结 !!!

    但这篇文章介绍的方法,我们分别使用"ifstream"?和 "ofstream" 来作输入输出。 如果你用过标准控制台流"cin"?和 "cout," 那现在的事情对你来说很简单。 我们现在开始讲输出部分,首先声明一个类对象。 ofstream fout...

    吕鑫:【C++语法与数据结构第31天】【第2堂课】stringstream类与fstream类的功能

    1、讲解stringstream的功能和调用方法,演示通过该类对象进行格式化多类型数据的过程; 2、讲解fstream的功能和调用方法,演示通过ifstream和ofstream来对数据进行保存与加载的过程;

    C++——文件和流

    该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。 要在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件 iostream 和 ...

    C++格式化读写文件操作

    可以指定打开方式为读取模式(ifstream)或写入模式(ofstream)。 格式化读取:使用输入流对象(例如cin或ifstream对象)和格式控制符,按照特定的格式从文件中读取数据。可以使用&gt;&gt;运算符将数据读取到变量中。 ...

Global site tag (gtag.js) - Google Analytics