文件I/O - 文件读写操作

embedded/2025/1/7 14:19:53/

引言

文件输入输出(I/O)是编程中非常常见的任务,尤其是在处理大量数据或需要持久化存储时。C++ 提供了多种方式来进行文件的读写操作,包括使用标准库中的 fstreamifstream 和 ofstream 类。本文将详细介绍如何在 C++ 中进行文件的读写操作,并通过实例帮助读者理解其使用方法。

1. 文件流类简介

C++ 标准库提供了三个主要的文件流类来处理文件 I/O 操作:

  • fstream:用于读写文件。
  • ifstream:专门用于读取文件。
  • ofstream:专门用于写入文件。

这些类都继承自 iostream 库中的基类 ios,因此可以使用类似的接口进行操作。

2. 文件打开与关闭

2.1 打开文件

要打开一个文件,可以使用文件流对象的构造函数或 open() 方法。以下是几种常见的打开模式:

  • ios::in:以只读方式打开文件。
  • ios::out:以只写方式打开文件。
  • ios::app:以追加方式打开文件,所有写入的数据都会添加到文件末尾。
  • ios::binary:以二进制模式打开文件。
  • ios::trunc:如果文件存在,则先删除文件内容再打开。
#include <fstream>
#include <iostream>int main() {// 使用构造函数打开文件std::ofstream outFile("example.txt", std::ios::out);if (!outFile) {std::cerr << "无法打开文件" << std::endl;return 1;}// 或者使用 open() 方法std::ifstream inFile;inFile.open("example.txt", std::ios::in);if (!inFile) {std::cerr << "无法打开文件" << std::endl;return 1;}// 关闭文件outFile.close();inFile.close();return 0;
}

2.2 关闭文件

使用完文件后,应该调用 close() 方法关闭文件,以确保所有缓冲区的数据都被正确写入文件,并释放相关资源。

fileStream.close();

3. 文件写入操作

3.1 写入文本文件

使用 ofstream 可以方便地向文本文件中写入数据。可以直接使用插入运算符 << 来写入字符串、数字等数据类型。

#include <fstream>
#include <iostream>int main() {std::ofstream outFile("example.txt", std::ios::out);if (!outFile) {std::cerr << "无法打开文件" << std::endl;return 1;}outFile << "Hello, World!" << std::endl;outFile << "这是第二行文本" << std::endl;outFile.close();return 0;
}

3.2 写入二进制文件

对于二进制文件,可以使用 write() 方法来写入原始字节数据。需要注意的是,二进制文件的内容不能直接用文本编辑器查看。

#include <fstream>
#include <iostream>int main() {int data = 42;std::ofstream binFile("data.bin", std::ios::out | std::ios::binary);if (!binFile) {std::cerr << "无法打开文件" << std::endl;return 1;}binFile.write(reinterpret_cast<char*>(&data), sizeof(data));binFile.close();return 0;
}

4. 文件读取操作

4.1 读取文本文件

使用 ifstream 可以从文本文件中读取数据。可以直接使用提取运算符 >> 来读取基本数据类型,或者使用 getline() 方法来读取整行文本。

#include <fstream>
#include <iostream>
#include <string>int main() {std::ifstream inFile("example.txt", std::ios::in);if (!inFile) {std::cerr << "无法打开文件" << std::endl;return 1;}std::string line;while (std::getline(inFile, line)) {std::cout << line << std::endl;}inFile.close();return 0;
}

4.2 读取二进制文件

对于二进制文件,可以使用 read() 方法来读取原始字节数据。同样需要注意,读取的数据需要根据实际类型进行解释。

#include <fstream>
#include <iostream>int main() {int data;std::ifstream binFile("data.bin", std::ios::in | std::ios::binary);if (!binFile) {std::cerr << "无法打开文件" << std::endl;return 1;}binFile.read(reinterpret_cast<char*>(&data), sizeof(data));std::cout << "读取的数据: " << data << std::endl;binFile.close();return 0;
}

5. 文件位置控制

有时我们需要在文件中移动读写指针的位置。可以使用以下方法来控制文件指针:

  • seekg():设置输入文件指针的位置。
  • seekp():设置输出文件指针的位置。
  • tellg():获取当前输入文件指针的位置。
  • tellp():获取当前输出文件指针的位置。
#include <fstream>
#include <iostream>int main() {std::fstream file("example.txt", std::ios::in | std::ios::out);if (!file) {std::cerr << "无法打开文件" << std::endl;return 1;}// 移动到文件开头file.seekg(0, std::ios::beg);// 获取当前位置std::streampos pos = file.tellg();std::cout << "当前位置: " << pos << std::endl;// 移动到文件末尾file.seekg(0, std::ios::end);file.close();return 0;
}

6. 总结

文件 I/O 是 C++ 编程中不可或缺的一部分,掌握文件的读写操作可以帮助我们更好地处理和管理数据。通过本文的介绍,相信读者已经对 C++ 中的文件 I/O 操作有了较为全面的了解。如果你有任何问题或需要进一步的帮助,请随时留言讨论!


http://www.ppmy.cn/embedded/151652.html

相关文章

Docker 容器技术与 K8s

Docker 是一种开源平台&#xff0c;使开发者可以轻松构建、管理并运行容器化应用&#xff0c;而 Kubernetes 则是一个强大的容器编排工具&#xff0c;可以高效地管理和扩展这些容器化应用。这技术组合&#xff0c;简直就像一对婚配的技术伴侣&#xff0c;为我们自动化测试、持续…

机器学习中的欠拟合

当模型不能够准确地表达输入与输出的关系时&#xff0c;就是欠拟合。它在训练集和未见过的数据都会产生高误差率。过度拟合则在训练集表现出低误差率&#xff0c;只有对未见过的数据表现出高误差率。 当模型太过于简单时&#xff0c;它需要更多的训练时间、更多的输入特征、更…

.NET Core + Kafka 开发指南

什么是Kafka Apache Kafka是一个分布式流处理平台,由LinkedIn开发并开源,后来成为Apache软件基金会的顶级项目。Kafka主要用于构建实时数据管道和流式应用程序。 Kafka 架构 从下面3张架构图中可以看出Kafka Server 实际扮演的是Broker的角色, 一个Kafka Cluster由多个Bro…

五类推理(逻辑推理、概率推理、图推理、基于深度学习的推理)的开源库 (一)

在开发中&#xff0c;有一些开源库可以实现不同类型的推理&#xff0c;包括逻辑推理、概率推理、图推理、基于深度学习的推理等。以下是五类推理&#xff08;逻辑推理、概率推理、图推理、基于深度学习的推理&#xff09;的现成开源库&#xff0c;它们各自的功能、特点和适用场…

AcWing练习题:最大值

给定三个整数&#xff0c;请你找出它们中的最大值。 下列公式可能对你有所帮助&#xff1a; max(a,b)(ababs(a−b))2 输入格式 输入占一行&#xff0c;包含三个整数。 输出格式 输出格式为 X eh o maior&#xff0c;其中 X 为三个数中的最大值。 数据范围 1≤给定整数≤…

企业内训|阅读行业产品运营实战训练营-某运营商数字娱乐公司

近日&#xff0c;TsingtaoAI公司为某运营商旗下数字娱乐公司组织的“阅读行业产品运营实战训练营”在杭州落下帷幕。此次训练营由TsingtaoAI资深互联网产品专家程靖主持。该公司的业务骨干——来自内容、市场、业务、产品与技术等跨部门核心岗位、拥有8-10年实战经验的中坚力量…

C++软件设计模式之中介者模式

中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为设计模式&#xff0c;它的主要目的是通过引入一个中介者对象来简化多个对象之间的交互&#xff0c;降低它们之间的耦合度。中介者模式使得这些对象可以通过中介者进行通信&#xff0c;而不需要直接相互引用&#…

Nginx整理

1.1Nginx 概述和安装 1.1.1Nginx 介绍 Nginx&#xff1a;engine X &#xff0c;2002年开发&#xff0c;分为社区版和商业版(nginx plus ) 2019年3月11日 F5 Networks 6.7亿美元的价格收购 Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP…