概述

大多数 C++ 程序员都熟悉不止一个文件 I/O 库。首先是传统的 Unix 风格的库,它由一些低级函数如 read() 和 open()组成。其次是 ANSI C 的 <stdio.h> 库,它包含 fopen() 和 fread()等函数。其它的还有一些具备所有权的库或框架,比如 MFC,它有很多自己的文件处理类。

这些库一般都很难跨平台使用。更糟的是,上述提到的 C 库由于其程序接口的原因,在很大程度上强制程序员进行某些处理,而且缺乏类型安全支持。

标准 C++ 提供提供了一个增强的、面向对象的、具有国际化意识的  <fstream> 库。这个库包含一系列派生于标准 ios_base 和 ios 类的类模板。因此, <fstream> 提供了高级的自动控制机制和健壮性。本文下面将示范如何使用  <fstream> 类实现文件的输入/输出处理

创建文件流

输入文件流(ifstream)支持重载的 >> 操作符,同样,输出文件流(ofstream)支持重载的 << 操作符。结合了输入和输出的文件流被称为 fstream。下面的程序创建了一个 ifstream 对象:dict,并将该对象中的每一个单字显示到屏幕上:

#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
using namespace std;
int main()
{string s;cout<<"enter dictionary file: ";cin>>s;ifstream dict (s.c_str()); if (!dictionary) // were there any errors on opening? exit(-1);while (dictionary >> s) cout << s <<''\n'';
}      

我们必须调用 string::c_str() 成员函数,因为 fstream 对象只接受常量字符串作为文件名。当你将文件名作为参数传递时,构造函数试图打开指定的文件。接着,我们用重载的 !操作符来检查文件的状态。如果出错,该操作符估值为 true。最后一行是个循环,每次反复都从文件读取一个单字,将它拷贝到 s,然后显示出来。注意我们不必显式地检查 EOF,因为重载操作符 >> 会自动处理。此外,我们不用显式地关闭此文件,因为析构函数会为我们做这件事情。

过时和荒废的 <fstream.h> 库支持 ios::nocreate 和 ios::noreplace 标志。但新的 <fstream> 库已经取代了 <fstream.h> 并不再支持这两个标志。

文件的打开模式

如果你不显式指定打开模式,fstream 类将使用默认值。例如,ifstream 默认以读方式打开某个文件并将文件指针置为文件的开始处。为了向某个文件写入数据,你需要创建一个 ofstream 对象。<fstream> 定义了下列打开模式和文件属性:

ios::app // 从后面添加
ios::ate // 打开并找到文件尾
ios::binary // 二进制模式 I/O (与文本模式相对)
ios::in // 只读打开
ios::out // 写打开
ios::trunc // 将文件截为 0 长度

你可以用位域操作符 OR 组合这些标志:

ofstream logfile("login.dat", ios::binary | ios::app);

fstream 类型对象同时支持读和写操作:

fstream logfile("database.dat", ios::in | ios::out);

设置文件的位置

文件具备一个逻辑指针,它指向该文件中的某个偏移位置。你可以通过调用seekp()成员函数,以字节为单位将这个指针定位到文件的任意位置。为了获 取从文件开始处到当前偏移的字节数,调用seekp()即可。在下面的例子中,程序将文件位置前移10个字节,然后调用 tellp()报告新位置:

ofstream fout("parts.txt");
fout.seekp(10); // 从0偏移开始前进 10 个字节
cout<<"new position: "<<fout.tellp(); // 显示 10

你可以用下面的常量重新定位文ian指针:

ios::beg // 文件开始位置
ios::cur // 当前位置,例如: ios::cur+5
ios::end // 文件尾

读写数据

fstream 类为所有内建数据类型以及 std::string 和 std::complex 类型重载 << 和 >> 操作符。下面的例子示范了这些操作符的使用方法:

fstream logfile("log.dat");
logfile<<time(0)<<"danny"<<''\n''; // 写一条新记录
logfile.seekp(ios::beg); // 位置重置
logfile>>login>>user; // 读取以前写入的值

转载于:https://www.cnblogs.com/rogee/archive/2011/03/31/2000474.html

如何使用 fstream 类进行文件的 I/O 处理相关推荐

  1. c++语言文件流,C++ IO类、文件输入输出、string流详细讲解

    新的C++标准中有三分之二的内容都是描述标准库.接下来重点学习其中几种核心库设施,这些是应该熟练掌握的. 标准库的核心是很多容器类(顺序容器和关联容器等)和一簇泛型算法(该类算法通常在顺序容器一定范围 ...

  2. C++文件类(文件流类)及用法详解

    <C++输入输出流>一章中讲过,重定向后的 cin 和 cout 可分别用于读取文件中的数据和向文件中写入数据.除此之外,C++ 标准库中还专门提供了 3 个类用于实现文件操作,它们统称为 ...

  3. C++ 流的操作 | 初识IO类、文件流、string流的使用

    文章目录 前言 IO头文件 iostream fstream sstream 流的使用 不能拷贝或对 IO对象 赋值 条件状态与 iostate 类型 输出缓冲区 文件流 fstream类型 文件模式 ...

  4. 一个有关fstream类的bug

    一个有关fstream类的bug 近日写程序需要读出文件,对读出的内容作些修改,再写回到文件中. 突然发现一个莫名其妙的问题,写回去的时候居然在文件末尾增加了几个字 符.感到很不可思议.具体代码如下: ...

  5. c++ fstream类详解

    在C++中,有一个stream这个类,所有的I/O都以这个"流"类为基础的, 一,c++ 文件流的结构 : ‍1,几个文件流类名称:fstream,ifstream,ofstrea ...

  6. 【C++】IO库 : IO类,文件输入输出,string流

    前面已经在用的IO库设施 istream:输入流类型,提供输入操作. ostream:输出流类型,提供输出操作 cin:一个istream对象,从标准输入读取数据. cout:一个ostream对象, ...

  7. C++ fstream类移动读写指针和字节数形式获取该指针位置(seekp、seekg、tellg、tellp)

    参考链接 C++移动和获取文件读写指针(seekp.seekg.tellg.tellp) 1.利用seekp.seekg成员函数控制读写指针位置 在读写文件时,有时希望直接跳到文件中的某处开始读写,这 ...

  8. C++中#include<fstream>头文件

    fstream是C++ STL中对文件操作的合集,包含了常用的所有文件操作.在C++中,所有的文件操作,都是以流(stream)的方式进行的,fstream也就是文件流file stream. 最常用 ...

  9. CFile类打开文件的有趣现象

    CFile类打开文件的有趣现象 作者:lypindream 下载源代码 在编制对话框应用程序的过程中,我发现一个很有趣的现象,就是当使用CFile类的Open成员函数打开一个文件时,如果不指定文件的路 ...

最新文章

  1. 清华大学梁宸计算机系,应用数学专业论文
  2. iPhone地图 实战iPhone GPS定位系统
  3. Spring Cloud之Hystrix
  4. android synchronized的使用
  5. [Leedcode][JAVA]第[945]题
  6. 计算机维修与护理论文,计算机维修与维护方面论文选题 计算机维修与维护论文题目怎样定...
  7. HTML5 响应式网页设计之页面美化(一.响应式布局)
  8. SQL注入攻击和防御
  9. vue 插槽的版本变化1.x-2.6.0-3.x(详细)
  10. 各种未授权访问漏洞的复现与利用
  11. 魔兽怀旧服服务器位置,魔兽世界怀旧服PDD在哪个服务器 魔兽世界怀旧服pdd去哪个区...
  12. 新版淘客订单API【需token】
  13. (已解决)ubuntu16.04蓝牙耳机与电脑配对成功,但不出现在声音输出设备里
  14. JPA-Hibernate快速入门图文教程
  15. springboot是如何实现配置文件自动加载的呢
  16. 一缕黑暗中的火光-----------部署图--------------优雅的建模语言
  17. Bps,bps,pps 等的计算
  18. New运算符干了什么?手写一个new
  19. Docker镜像阿里云的上传拉取-私服的搭建-容器
  20. oracle客户端没有tnsnames,安装好Oracle Client以后没有tnsnames.ora文件

热门文章

  1. ES6新语法--对象成员简写、对象展开、数组展开
  2. [jQuery基础] jQuery对象 -- CSS相关
  3. 基于JavaScript实现放大镜效果
  4. js实现的tooltip简单小组件
  5. IE6不支持min-heigt的bug解决的办法
  6. LeetCode--96. 不同的二叉搜索树(动态规划)
  7. 机器学习算法中文视频教程
  8. linux生成不能访问的文件夹,Linux ln创建软连接之后无法使用,无法whereis
  9. html语言怎样设置密码类型,html – 在使用contenteditable div时模仿密码类型输入
  10. 良好的编码风格 java_关于java:编码风格是否遵循良好做法