C++文本文件读写操作详解

前面章节中,已经给大家介绍了文件流对象如何调用 open() 方法打开文件,并且在读写(又称 I/O )文件操作结束后,应调用 close() 方法关闭先前打开的文件。那么,如何实现对文件内容的读写呢?接下来就对此问题做详细的讲解。

在讲解具体读写文件的方法之前,读者首先要搞清楚的是,对文件的读/写操作又可以细分为 2 类,分别是以文本形式读写文件和以二进制形式读写文件。

  1. 我们知道,文件中存储的数据并没有类型上的分别,统统都是字符。所谓以文本形式读/写文件,就是直白地将文件中存储的字符(或字符串)读取出来,以及将目标字符(或字符串)存储在文件中。

  2. 而以二进制形式读/写文件,操作的对象不再是打开文件就能看到的字符,而是文件底层存储的二进制数据。更详细地讲,当以该形式读取文件时,读取的是该文件底层存储的二进制数据;同样,当将某数据以二进制形式写入到文件中时,写入的也是其对应的二进制数据。

举个例子,假设我们以文本形式将浮点数 19.625 写入文件,则该文件会直接将 “19.625” 这个字符串存储起来。当我们双击打开此文件,也可以看到 19.625。值得一提的是,由非字符串数据(比如这里的浮点数 19.625)转换为对应字符串(转化为 “19.625”)的过程,C++ 标准库已经实现好了,不需要我们操心。

但如果以二进制形式将浮点数 19.625 写入文件,则该文件存储的不再是 “19.625” 这个字符串,而是 19.625 浮点数对应的二进制数据。以 float 类型的 19.625 来说,文件最终存储的数据如下所示:
0100 0001 1001 1101 0000 0000 0000 0000

显然,如果直接将以上二进制数据转换为 float 类型,仍可以得到浮点数 19.625。但对于文件来说,它只会将存储的二进制数据根据既定的编码格式(如 utf-8、gbk 等)转换为一个个字符。这也就意味着,如果我们直接打开此文件,看到的并不会是 19.625,往往是一堆乱码。

C++ 标准库中,提供了 2 套读写文件的方法组合,分别是:
使用 >> 和 << 读写文件:适用于以文本形式读写文件;
使用 read() 和 write() 成员方法读写文件:适用于以二进制形式读写文件。

本节先讲解如何用 >> 和 << 实现以文本形式读写文件,至于如何实现以二进制形式读写文件,下一节会做详细介绍。

C++ >>和<<读写文本文件

通过前一节的学习我们知道,fstream 或者 ifstream 类负责实现对文件的读取,它们内部都对 >> 输出流运算符做了重载;同样,fstream 和 ofstream 类负责实现对文件的写入,它们的内部也都对 << 输出流运算符做了重载。

所以,当 fstream 或者 ifstream 类对象打开文件(通常以 ios::in 作为打开模式)之后,就可以直接借助 >> 输入流运算符,读取文件中存储的字符(或字符串);当 fstream 或者 ofstream 类对象打开文件(通常以 ios::out 作为打开模式)后,可以直接借助 << 输出流运算符向文件中写入字符(或字符串)。

举个例子:

#include <iostream>
#include <fstream>
using namespace std;
int main()
{int x,sum=0;ifstream srcFile("in.txt", ios::in); //以文本模式打开in.txt备读if (!srcFile) { //打开失败cout << "error opening source file." << endl;return 0;}ofstream destFile("out.txt", ios::out); //以文本模式打开out.txt备写if (!destFile) {srcFile.close(); //程序结束前不能忘记关闭以前打开过的文件cout << "error opening destination file." << endl;return 0;}//可以像用cin那样用ifstream对象while (srcFile >> x) {sum += x;//可以像 cout 那样使用 ofstream 对象destFile << x << " ";}cout << "sum:" << sum << endl;destFile.close();srcFile.close();return 0;
}

注意,此程序中分别采用 ios::in 和 ios::out 打开文件,即以文本模式而非二进制模式打开文件。感兴趣的读者可在其基础上添加 ios::binary,即以二进制模式打开文件,程序依旧会正常执行。这是因为,以文本模式打开文件和以二进制模式打开文件,并没有很大的区别。

执行此程序之前,必须在和该程序源文件同目录中手动创建一个 in.txt 文件,假设其内部存储的字符串为:

10 20 30 40 50

建立之后,执行程序,其执行结果为:

sum:150

同时在 in.txt 文件同目录下,会生成一个 out.txt 文件,其内部存储的字符和 in.txt 文件完全一样,读者可自行打开文件查看。

通过分析程序的执行结果不难理解,对于 in.txt 文件中的 “10 20 30 40 50” 字符串,srcFile 对象会依次将 “10”、“20”、“30”、“40”、“50” 读取出来,将它们解析成 int 类型的整数 10、20、30、40、50 并赋值给 x,同时完成和 sum 的加和操作。

同样,对于每次从 in.txt 文件读取并解析出的整形 x,destFile 对象都会原封不动地将其再解析成对应的字符串(如整数 10 解析成字符串 “10”),然后和 " " 空格符一起写入 out.txt 文件。

C++文本文件读写操作详解相关推荐

  1. c语言 如何创建txt文件,C++文本文件读写操作详解

    前面章节中,已经给大家介绍了文件流对象如何调用 open() 方法打开文件,并且在读写(又称 I/O )文件操作结束后,应调用 close() 方法关闭先前打开的文件.那么,如何实现对文件内容的读写呢 ...

  2. IOS 文件读写操作详解及简单实例

    iPhone 文件读写操作 1,写文件操作 - (IBAction)btnWrite:(id)sender {//创建文件管理器NSFileManager *fileManager = [NSFile ...

  3. Pandas-Excel读写操作详解

    Pandas 提供了操作 Excel 文件的函数,可以很方便地处理 Excel 表格,对表格数据进行读写操作. read_excel()介绍 读取Excel 表格中的数据,可以使用 read_exce ...

  4. Python基础必掌握的文件读写操作详解

    读取和写入文件等操作是 Python 可以完成的最常见任务之一.无论是写入简单的文本文件,读取复杂的服务器日志,甚至分析原始字节数据,进行相关的处理操作,最终所有这些情况都需要读取或写入文件. 整套学 ...

  5. C语言文件读写操作详解

    C语言/C++中文帮助文档免积分下载(点击跳转) 当文件按指定的工作方式打开以后,就可以执行对文件的读和写.下面按文件的性质分类进行操作.针对文本文件和二进制文件的不同性质,对文本文件来说,可按字符读 ...

  6. python怎么读write_Python如何读写文件?python写入文件读写操作详解

    Python文件的打开或创建可以使用函数open().该函数可以指定处理模式,设置打开的文件为只读.只写或可读写状态.open()的声明如下所示. open(file, mode='r', buffe ...

  7. python——xlsx文件的读写操作详解

    本文对xlsx文件的读写使用以下的库,已安装的可以忽略: """ 需安装的库文件: pip install xlrd==1.2.0 pip install pywin32 ...

  8. java 写文件 高效_java高效文件流读写操作详解|chu

    导语 防止自己以后忘记,记录一些文件流的性能对比. 平常经常会操作到文件读写,java当中提供了许多操作文件的类,一般来说,文件操作也叫流操作,可以按照以下方式分类:按照功能分类,字节流和字符流. 按 ...

  9. JSON文件读写操作详解

    目录 JSON介绍 JSON基本语法 数据 对象 数组 JSON文件写入 JSON文件读取 JSON介绍 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量 ...

最新文章

  1. Ubuntu中安装最新Docker社区版
  2. 菜鸟学习笔记3——jQuery 选择器
  3. php domain cookie cross-domian,跨域(cross-domain)访问 cookie (读取和设置)
  4. 2018-2019-2 20165114《网络对抗技术》Exp4 恶意代码分析
  5. xml 文件解析 pull
  6. python提高运行效率_提高 Python 运行效率的六个窍门
  7. [CQOI2017] 老C的键盘(树形dp + 组合数)
  8. VS Code 自动保存 码格式化
  9. 终结者2显示天网服务器,《终结者2:审判日》天网觉醒秘测开服公告
  10. 去掉txt文本某些字符
  11. java子窗口获取父窗口句柄_java获得窗口句柄
  12. 基于linux搭建zmodem服务
  13. 用c语言判断字符串为空,如何检查C字符串是否为空
  14. swift html5 跳转页面跳转,Swift - 纯代码实现页面segue跳转,以及参数传递
  15. 固态硬盘(SSD)——NAND闪存芯片(颗粒)QLC、SLC、MLC、TLC
  16. java 报‘java.net.UnknownHostException:错误
  17. 基于Java的中国象棋对弈系统
  18. 今日头条搜索有站长平台!
  19. 2013年第四届C/C++ A组蓝桥杯省赛真题
  20. 使用IDEA快速画类图

热门文章

  1. goodix gt911 在 Android 开发板上的适配流程
  2. java常用集合详解
  3. golang学习如小树苗需要耐心长大
  4. HTML颜色代码表(十六进制)
  5. 智慧交通,网约车终端解决方案基于arm平台的展现
  6. 【Java笔记】---Week06 常用类、正则表达式与集合
  7. windows Nginx WebSocket ws协议反向代理
  8. Linux下pip离线安装库及其依赖库
  9. Python GPU编程实例(最简单, 入门版)
  10. 普乐蛙VR太空宇宙vr星际飞船设备模拟太空飞船