1. 文件的概念

对于用户来说,常用到的文件有两大类:程序文件和数据文件。而根据文件中数据的组织方式,则可以将文件分为 ASCII 文件二进制文件

  • ASCII 文件,又称字符文件或者文本文件,它的每一个字节放一个 ASCII 代码,代表一个字符。
  • 二进制文件,又称内部格式文件或字节文件,是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。

数字 64 在内存中表示为 0100 0000,若将其保存为 ASCII 文件,则要分别存放十位 6 和个位 4 的 ASCII 码,为 0011 0110 0011 0100,占用两个字节;若将其保存为二进制文件,则按内存中形式直接输出,为 0100 0000,占用一个字节。

ASCII 文件中数据与字符一一对应,一个字节代表一个字符,可以直接在屏幕上显示或打印出来,这种方式使用方便,比较直观,便于阅读,但一般占用存储空间较大,而且输出时要将二进制转化为 ASCII 码比较花费时间。

二进制文件,输出时不需要进行转化,直接将内存中的形式输出到文件中,占用存储空间较小,但一个字节并不对应一个文件,不能直观显示文件中的内容。

2. 文件流和文件流对象

文件流是以外存文件未输入输出对象的数据流。输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据。每一个文件流都有一个内存缓冲区与之对应。

C++ 中有三个用于文件操作的文件类:

  • ifstream 类,它是从 istream 类派生来的,用于支持从磁盘文件的输入。
  • ofstream 类,它是从 ostream 类派生来的,用于支持向磁盘文件的输出。
  • fstream 类,它是从 iostream 类派生来的,用于支持对磁盘文件的输入输出。

要以磁盘文件为对象进行输入输出,必须定义一个文件流类的对象,通过文件流对象将数据从内存输出到磁盘文件,或者将磁盘文件输入到内存。

定义文件流对象后,我们还需要将文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件,并确定文件的工作方式(输入还是输出,二进制还是 ASCII)。我们可以在定义流对象的时候指定参数来调用构造函数,或者通过成员函数 open 来进行文件流对象和指定文件的关联。

3. 对 ASCII 文件的操作

然后,我们就可以用类似 cin 或者 cout 的方式将数据读出或写入文件,只不过是输入输出的对象变成了文件而已。当然,在对磁盘文件完成读写操作后,我们可以通过 close 方法来解除磁盘文件和文件流对象的关联。

#include <iostream>
#include <fstream>using namespace std;int main()
{ofstream outfile("a.txt", ios::out);if (!outfile){cerr << "Failed to open the file!";return 1;}// 写入数字 1-5 到文件中for (int i = 1; i < 6; i++){outfile << i << '\n';}outfile.close();ifstream infile("a.txt", ios::in);if (!infile){cerr << "Failed to open the file!";return 1;}char data;  // 从文件中读出数字 1-5 for (int i = 1; i < 6; i++){infile >> data;cout << data << '\n';}infile.close();return 0;
}

也可以利用文件流对象的成员函数 get, put 等,其用法就和 标准输入输出 介绍的一样。

int main()
{ofstream outfile("a.txt", ios::out);if (!outfile){cerr << "Failed to open the file!";return 1;}for (char i = '1'; i < '6'; i++){outfile.put(i); // 输出一个字符到文件中去}outfile.close();ifstream infile("a.txt", ios::in);if (!infile){cerr << "Failed to open the file!";return 1;}/*char a;for (int i = 0; i < 5; i++){infile.get(a); // 从文件中读出 1 个字符cout << a << '\n';}*/char data[5];infile.get(data, 6); // 从文件中读出 5 个字符for (int i = 0; i < 5; i++){cout << data[i] << '\n';}infile.close();return 0;
}

4. 对二进制文件的操作

二进制文件的操作需要在打开文件的时候指定打开方式为 ios::binary,并且还可以指定为既能输入又能输出的文件,我们通过成员函数 read 和 write 来读写二进制文件。

  • istream& read (char* s, streamsize n);
  • ostream& write (const char* s, streamsize n);
#include <iostream>
#include <fstream>using namespace std;int main()
{ofstream outfile("a.txt", ios::binary);if (!outfile){cerr << "Failed to open the file!";return 1;}char a[] = {'h', 'e', 'l', 'l', 'o', ','};char b[] = {'s', 'e', 'n', 'i', 'u', 's', 'e', 'n', '!'};outfile.write(a, 6); // 将以 a 为首地址的 6 个字符写入文件outfile.write(b, 9);outfile.close();ifstream infile("a.txt", ios::binary);if (!infile){cerr << "Failed to open the file!";return 1;}char data[6];infile.read(data, 6);  // 从文件中读出 6 个字符到以 data 为首地址的字符数组中for (int i = 0; i < 6; i++){cout << data[i];}char datb[6];infile.read(datb, 9);for (int i = 0; i < 9; i++){cout << datb[i];}infile.close();return 0;
}

在磁盘文件中有一个文件指针,用来指明当前读写的位置。每次写入或者读出一个字节,指针就向后移动一个字节。对于二进制文件,允许对指针进行控制,使它移动到所需的位置,以便在该位置上进行读写。

  • ostream& seekp (streampos pos); 将输出文件中指针移动到指定的位置
  • ostream& seekp (streamoff off, ios_base::seekdir way); 以参照位置为基准对输出文件中的指针移动若干字节
  • streampos tellp(); 返回输出文件指针当前的位置

  • istream& seekg (streampos pos); 将输入文件中指针移动到指定的位置
  • istream& seekg (streamoff off, ios_base::seekdir way); 以参照位置为基准对输入文件中的指针移动若干字节
  • streampos tellg(); 返回输入文件指针当前的位置

其中,参照位置有以下几个选择:

  • ios_base::beg 文件开始位置
  • ios_base::cur 文件当前位置
  • ios_base::end 文件末尾位置

获取更多精彩,请关注「seniusen」!

转载于:https://www.cnblogs.com/seniusen/p/9957467.html

C++ 学习笔记之——文件操作和文件流相关推荐

  1. Python学习笔记--day09 函数 模块 (文件、路径操作)

    第二模块 函数&模块 第一模块主要是学习python基础知识,从第二模块开始就可以通过程序去解决工作中实际的问题. 函数,一个用于专门实现某个功能的代码块(可重用). 内置函数 len.bin ...

  2. Liunx学习笔记 - 07 - 02 正则表达式与文件格式化处理

    Liunx学习笔记 - 07 - 02 正则表达式与文件格式化处理 1 前言:啥是正则表达式 简单来讲,正则表达式是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的 ...

  3. oracle rac 环境配置文件,学习笔记:Oracle RAC spfile参数文件配置案例详解

    天萃荷净 rac中的spfile探讨,记录一下Oracle RAC搭建完成后关于spfile参数文件的配置案例,与更改RAC环境中参数文件的方法 今天朋友的的rac,因为被同事做数据库升级,分别在两个 ...

  4. C# 学习笔记(12)hex文件转bin文件小工具

    C# 学习笔记(12)hex文件转bin文件小工具 hex文件格式 hex文件格式网上有很多 我这里参考HEX文件格式详解https://blog.csdn.net/weixin_39752827/a ...

  5. Linux学习笔记(七):文件压缩、打包与备份

    Linux学习笔记(七):文件压缩.打包与备份 常见的压缩指令 gzip, zcat/zmore/zless/zgrep bzip2, bzcat/bzmore/bzless/bzgrep xz, x ...

  6. 20190328学习笔记 - JSP 中的 tag 文件

    20190328学习笔记 - JSP 中的 tag 文件 对于tag 文件 1. 引入 tag 文件 2. 在/WEB-INF/tags/sys 下,新增一个gridselect.tag文件 3. 在 ...

  7. 今天的码农女孩做了关于文件操作和文件拖拽的笔记 2022/1/21

    文件操作和文件拖拽 文件操作: js有两种机制:一个是事件机制,一个是io机制 文件操作对象: Blob通过二进制数据读取 file读取单个文件对象 fileList读取多个文件对象 fileRead ...

  8. tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)

    续集请点击我:tensorflow学习笔记--使用TensorFlow操作MNIST数据(2) 本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有He ...

  9. python关闭读写的所有的文件-Python文件操作:文件的打开关闭读取写入

    Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文 ...

最新文章

  1. Smali语法简单介绍
  2. webapi支持session
  3. mysql中RAND()随便查询记录效率问题和解决的方法分享
  4. linux jsp mysql数据库,Linux JSP连接MySQL数据库.pdf
  5. Python业务分析实战|共享单车数据挖掘
  6. 嗅探(被动嗅探)与ARP欺骗(主动嗅探)详解
  7. python中函数和类的区别_Python中函数和方法的区别
  8. uni-app 更新包提示HTML5+Runtime缺少升级包manifest.json中配置的模块:payment
  9. 简述计算机通信网络的技术指标,计算机网络基础知识之数据通信中的主要技术指标...
  10. iOS内存管理机制解析
  11. swift扩展_Swift扩展
  12. CKEditor 实例
  13. mtk java_MTK,mrp,JAVA你了解多少?
  14. 对数(log)的换算公式
  15. 三十、动名词短语 2
  16. poi批量导入html,读取excel(POI)【转换为html】 - bcoffee的专栏 - 博客频道 - CSDN.NET...
  17. 微型计算机2018年12月,2018年度金奖TOP 10:出类拔萃的产品都在这!
  18. 导航路径规划之四 路径规划概述
  19. 优惠劵秒杀优化-分布式锁
  20. JSON.stringify 函数 (JavaScript)

热门文章

  1. 解决文字无法缩小的问题
  2. SQL Server 2008中的Pivot和UnPivot
  3. 组策略分发软件全攻略
  4. 网络管理员比赛回顾02-网关、静态路由、动态路由
  5. docker 安装 oracle12,使用Docker安装Oracle 12c
  6. node.js的开发流程_Node.js子流程:您需要了解的一切
  7. 登高自卑 | 我的NumPy笔记
  8. JDBC连接mysql数据的7个步骤(讲解+源码)
  9. python的turtle绘图体系入门必看(二)
  10. JVM——Java虚拟机架构