### C++ 文件操作详解 #### 一、C++ 文件操作基础 在进行C++文件操作时,我们需要了解一些基本的概念和方法。文件操作是程序设计中的一个重要组成部分,它涉及到文件的打开、读取、写入以及关闭等操作。C++提供了多种方式来处理文件,这些方法通常基于`<fstream>`头文件。 #### 二、ASCII 文件操作 **1. 文件的打开与关闭** 在C++中,我们使用`ifstream`和`ofstream`来分别打开用于读取和写入的文件。例如: ```cpp #include <fstream> #include <iostream> using namespace std; int main() { ofstream fout; fout.open("output.txt"); // 打开一个文件用于写入 fout << "Here is a number: 150\n"; fout << "Now here is a string: John Doe\n"; fout.close(); // 关闭文件 } ``` 或者直接在构造函数中指定文件名: ```cpp ofstream fout("output.txt"); fout << "Here is a number: 150\n"; fout << "Now here is a string: John Doe\n"; fout.close(); ``` **2. 数据的写入** 当我们向文件写入数据时,可以使用`<<`运算符将各种类型的数据写入文件中。例如上面的例子展示了如何写入整数和字符串到文件中。 **3. 数据的读取** 对于ASCII文件,我们可以使用`ifstream`类来进行数据的读取。例如: ```cpp #include <fstream> #include <iostream> using namespace std; int main() { ifstream fin; fin.open("input.txt"); // 打开一个文件用于读取 int number; float real; char letter, word[8]; fin >> number >> word >> real >> letter; // 依次读取数据 fin.close(); } ``` #### 三、二进制文件操作 **1. 文件的打开** 对于二进制文件,我们需要在打开文件时指定文件模式为二进制模式。例如: ```cpp ofstream fout("file.dat", ios::binary); ``` **2. 数据的写入** 二进制文件支持直接写入结构体或类的对象。例如: ```cpp struct OBJECT { int number; char letter; } obj; obj.number = 15; obj.letter = 'M'; fout.write((char*)(&obj), sizeof(obj)); ``` 这里使用了`write()`函数,并且指定了对象的地址和大小。 **3. 数据的读取** 读取二进制文件时,我们同样使用`ifstream`类,并指定文件模式为二进制。例如: ```cpp ifstream fin("file.dat", ios::binary); fin.read((char*)(&obj), sizeof(obj)); ``` #### 四、文件流状态检查 除了基本的文件读写操作之外,我们还需要能够检查文件流的状态,确保文件操作正确无误。 **1. `good()`函数** 该函数返回`true`表示文件流处于正常状态。 **2. `bad()`函数** 如果文件流发生了错误,比如磁盘满、文件损坏等情况,则`bad()`返回`true`。 **3. `fail()`函数** 如果文件流遇到了问题但不严重到触发`bad()`,则`fail()`返回`true`。 #### 五、文件流的其他操作 **1. `get()`函数** 该函数可以用来逐个字符地从文件中读取数据。 **2. `ignore()`函数** 该函数可以忽略指定数量的字符,或者直到遇到特定字符为止。例如: ```cpp fin.ignore(100, '\n'); // 忽略100个字符或直到遇到换行符 ``` **3. `peek()`函数** 该函数可以预览下一个字符而不实际读取它。 **4. `putback()`函数** 该函数可以把一个字符放回文件流的前面。 **5. `put()`函数** 该函数允许逐个字符地写入数据到文件。 通过上述介绍,我们可以了解到C++中文件操作的各个方面,包括ASCII文件和二进制文件的操作,以及如何检查文件流的状态等。这些知识对于进行文件处理的应用程序开发非常重要。
为了使用下面的方法, 你必须包含头文件<fstream.h>(译者注:在标准C++中,已经使用<fstream>取代<fstream.h>,所有的C++标准头文件都是无后缀的。)。这是 <iostream.h>的一个扩展集, 提供有缓冲的文件输入输出操作. 事实上, <iostream.h> 已经被<fstream.h>包含了, 所以你不必包含所有这两个文件, 如果你想显式包含他们,那随便你。我们从文件操作类的设计开始, 我会讲解如何进行ASCII I/O操作。 如果你猜是"fstream," 恭喜你答对了! 但这篇文章介绍的方法,我们分别使用"ifstream"?和 "ofstream" 来作输入输出。
如果你用过标准控制台流"cin"?和 "cout," 那现在的事情对你来说很简单。 我们现在开始讲输出部分,首先声明一个类对象。
ofstream fout; 这就可以了,不过你要打开一个文件的话, 必须像这样调用ofstream::open()。
fout.open("output.txt"); 你也可以把文件名作为构造参数来打开一个文件.
ofstream fout("output.txt"); 这是我们使用的方法, 因为这样创建和打开一个文件看起来更简单. 顺便说一句, 如果你要打开的文件不存在,它会为你创建一个, 所以不用担心文件创建的问题. 现在就输出到文件,看起来和"cout"的操作很像。 对不了解控制台输出"cout"的人, 这里有个例子。
int num = 150;
char name[] = "John Doe";
fout << "Here is a number: " << num << "\n";
fout << "Now here is a string: " << name << "\n"; 现在保存文件,你必须关闭文件,或者回写文件缓冲. 文件关闭之后就不能再操作了, 所以只有在你不再操作这个文件的时候才调用它,它会自动保存文件。 回写缓冲区会在保持文件打开的情况下保存文件, 所以只要有必要就使用它。 回写看起来像另一次输出, 然后调用方法关闭。像这样:
fout << flush; fout.close(); 现在你用文本编辑器打开文件,内容看起来是这样:
Here is a number: 150 Now here is a string: John Doe 很简单吧! 现在继续文件输入, 需要一点技巧, 所以先确认你已经明白了流操作,对 "<<" 和">>" 比较熟悉了, 因为你接下来还要用到他们。继续…
二、ASCII 输入
输入和"cin" 流很像. 和刚刚讨论的输出流很像, 但你要考虑几件事情。在我们开始复杂的内容之前, 先看一个文本:
12 GameDev 15.45 L This is really awesome! 为了打开这个文件,你必须创建一个in-stream对象,?像这样。
ifstream fin("input.txt"); 现在读入前四行. 你还记得怎么用"<<" 操作符往流里插入变量和符号吧?好,?在 "<<" (插入)?操作符之后,是">>" (提取) 操作符. 使用方法是一样的. 看这个代码片段.
int number;
float real;
char letter, word[8];
fin >> number; fin >> word; fin >> real; fin >> letter; 也可以把这四行读取文件的代码写为更简单的一行。
- xixi4154152014-02-27还不错,例子有点少
- anliupeng2013-11-24新手学习···多给点例子就好了!
- 粉丝: 1
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- dbeaver-ce-24.3.1-x86-64-setup.exe
- 国际象棋桌子检测6-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord数据集合集.rar
- 某平台广告投入分析与销售预测
- 连接ESP32手表来做验证20241223-140953.pcapng
- 小偏差线性化模型,航空发动机线性化,非线性系统线性化,求解线性系统具体参数,最小二乘拟合 MATLAB Simulink 航空发动机,非线性,线性,非线性系统,线性系统,最小二乘,拟合,小偏差,系统辨
- 好用的Linux终端管理工具,支持自定义多行脚本命令,密码保存、断链续接,SFTP等功能
- Qt源码ModbusTCP 主机客户端通信程序 基于QT5 QWidget, 实现ModbusTCP 主机客户端通信,支持以下功能: 1、支持断线重连 2、通过INI文件配置自定义服务器I
- QGroundControl-installer.exe
- 台球检测40-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 颜色拾取器 for Windows