C++ 中打开文件的多种方式及相关流类

C++ 中打开文件的多种方式及相关流类

C++学习:

https://blog.ZEEKLOG.net/2301_80220607/category_12805124.html?spm=1001.2014.3001.5482

前言:

打开一个文件的方式都有哪些,都可以通过哪些流来获取它?



在 C++ 中,打开文件可以通过多种流类实现,每种方式都有其特定的用途和特点。以下是详细的分类和说明:

目录

1. 使用标准文件流类( )

1.1 ofstream - 输出文件流(写入)

1.2 ifstream - 输入文件流(读取)

1.3 fstream - 双向文件流(读写)

2. 使用 C 风格文件操作( )

3. 使用文件描述符(POSIX/unistd.h)

4. 使用内存映射文件(高级方式)

5. 文件打开模式详解

5.1 C++ 流打开模式(位掩码组合)

5.2 C 风格打开模式

6. 不同方式的比较

7. 最佳实践建议

8. 高级用法示例

8.1 同时读写文件

8.2 二进制文件操作


1. 使用标准文件流类(<fstream>)

1.1 ofstream - 输出文件流(写入)

#include <fstream> // 方式1:构造函数直接打开 std::ofstream outFile1("output.txt"); // 默认模式:ios::out | ios::trunc // 方式2:先创建后打开 std::ofstream outFile2; outFile2.open("output.txt", std::ios::app); // 追加模式 // 写入数据 outFile1 << "Hello World" << std::endl;

1.2 ifstream - 输入文件流(读取)

#include <fstream> // 方式1:构造函数直接打开 std::ifstream inFile1("input.txt"); // 默认模式:ios::in // 方式2:先创建后打开 std::ifstream inFile2; inFile2.open("input.txt"); // 读取数据 std::string line; while (std::getline(inFile2, line)) { std::cout << line << std::endl; }

1.3 fstream - 双向文件流(读写)

#include <fstream> // 读写模式 std::fstream ioFile("data.txt", std::ios::in | std::ios::out); // 读写二进制文件 std::fstream binFile("data.bin", std::ios::binary | std::ios::in | std::ios::out);

2. 使用 C 风格文件操作(<cstdio>)

#include <cstdio> // 打开方式 FILE* file = fopen("file.txt", "r"); // 读取 FILE* file = fopen("file.txt", "w"); // 写入(清空) FILE* file = fopen("file.txt", "a"); // 追加 FILE* file = fopen("file.bin", "rb"); // 二进制读取 if (file != nullptr) { // 使用文件... fclose(file); // 必须手动关闭 }

3. 使用文件描述符(POSIX/unistd.h)

#include <unistd.h> #include <fcntl.h> int fd = open("file.txt", O_RDONLY); // 只读 int fd = open("file.txt", O_WRONLY | O_CREAT, 0644); // 写入+创建 if (fd != -1) { char buffer[1024]; read(fd, buffer, sizeof(buffer)); close(fd); // 必须手动关闭 }

4. 使用内存映射文件(高级方式)

#include <sys/mman.h> #include <fcntl.h> #include <unistd.h> int fd = open("largefile.bin", O_RDONLY); void* mapped = mmap(nullptr, file_size, PROT_READ, MAP_PRIVATE, fd, 0); // 使用映射的内存区域... munmap(mapped, file_size); close(fd);

5. 文件打开模式详解

5.1 C++ 流打开模式(位掩码组合)

模式标志描述
std::ios::in读取模式
std::ios::out写入模式
std::ios::app追加写入
std::ios::ate打开后定位到文件末尾
std::ios::trunc如果文件存在则清空
std::ios::binary二进制模式

5.2 C 风格打开模式

模式描述
"r"只读
"w"只写(创建/清空)
"a"追加写入
"r+"读写
"w+"读写(创建/清空)
"a+"读和追加

6. 不同方式的比较

特性C++ 流C 文件操作文件描述符
面向对象
类型安全
自动资源管理
格式化I/O
二进制I/O
低级控制部分
跨平台基本✓
性能中等较高最高

7. 最佳实践建议

  1. 常规文本文件操作:优先使用 C++ 文件流(fstream/ofstream/ifstream
  2. 高性能需求:考虑使用 C 风格文件操作或文件描述符
  3. 二进制文件:总是使用 std::ios::binary 标志
  4. 资源管理:使用 RAII 原则,推荐 C++ 流自动管理资源

错误检查:始终检查文件是否成功打开

std::ofstream file("data.txt"); if (!file.is_open()) { // 错误处理 }

8. 高级用法示例

8.1 同时读写文件

std::fstream file("data.txt", std::ios::in | std::ios::out | std::ios::ate); // 打开并定位到末尾 if (file) { // 读取当前位置 std::streampos endPos = file.tellg(); // 回到开头读取 file.seekg(0); std::string content; std::getline(file, content); // 写入新数据 file << "\nNew data appended"; }

8.2 二进制文件操作

struct Record { int id; char name[50]; double value; }; // 写入二进制 std::ofstream binOut("data.bin", std::ios::binary); Record rec{1, "Test", 3.14}; binOut.write(reinterpret_cast<char*>(&rec), sizeof(Record)); // 读取二进制 std::ifstream binIn("data.bin", std::ios::binary); Record inRec; binIn.read(reinterpret_cast<char*>(&inRec), sizeof(Record));

选择哪种方式取决于具体需求,C++ 文件流提供了最安全和方便的方式,而 C 风格和文件描述符则提供了更多的控制和更高的性能。

Read more

WSL 安装 Ubuntu

WSL 安装 Ubuntu

系统使用windows 11 启用 Windows 虚拟化和 Linux 子系统功能 * 打开 “启用或关闭 Windows功能”,找到并勾选以下选项 (完成后需重启): * Virtual Machine Platform * Hyper-V * 适用于 Linux 的 Windows 子系统 更新 WSL 打开终端,输入更新命令: wsl --install -d Ubuntu 如果是第一次使用 wsl,可能会下载 wsl 安装包,使用命令行的方式下载速度可能很慢,可以点击这里 手动下载 WSL 离线包并安装。 安装 Ubuntu 22.04 在终端中输入命令: wsl --install -d Ubuntu-22.04 等待下载并安装,

By Ne0inhk
Flutter 三方库 quick_log 定制化高性能鸿蒙端信息收集埋点系统适配剖解:搭建精细颗粒度可控的彩色日志流向引擎大幅削减多线程状态数据跟踪定位成本(适配鸿蒙 HarmonyOS ohos)

Flutter 三方库 quick_log 定制化高性能鸿蒙端信息收集埋点系统适配剖解:搭建精细颗粒度可控的彩色日志流向引擎大幅削减多线程状态数据跟踪定位成本(适配鸿蒙 HarmonyOS ohos)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 quick_log 定制化高性能鸿蒙端信息收集埋点系统适配剖解:搭建精细颗粒度可控的彩色日志流向引擎大幅削减多线程状态数据跟踪定位成本 在鸿蒙应用的开发与维测过程中,如何比传统的 print 更专业、更高效地定位性能瓶颈与逻辑异常?quick_log 提供了一套语义清晰、性能卓越且高度可定制的日志管理方案。本文将详解该库在 OpenHarmony 上的适配要点。 前言 什么是 quick_log?它不仅能将复杂的对象转化为可读性极佳的日志输出,更关键的是它支持日志分级(Verbose, Debug, Info, Warning, Error, Fatal)。在鸿蒙操作系统强调的“全天候稳定性运营”中,利用分级日志可以确保我们在不影响用户体验(生产环境关闭冗余日志)的同时,保留足够的“案发现场”排查能力。 一、原理解析 1.1 基础概念 基于观察者模式(

By Ne0inhk
【Linux系统编程】(三十四)初识进程信号:Linux 软中断的核心奥秘

【Linux系统编程】(三十四)初识进程信号:Linux 软中断的核心奥秘

目录 前言 一、从生活场景理解信号:原来信号这么简单 1.1 快递的故事:完美映射信号处理流程 1.2 生活场景到 Linux 信号的核心结论 二、技术视角:Linux 进程信号的初体验 2.1 第一个实验:Ctrl+C的本质 —— 向前台进程发送 2 号信号SIGINT 代码实现:sig_hello.c 编译运行 2.2 第二个实验:修改信号处理方式 —— 让Ctrl+C不再终止进程 2.2.1 signal函数介绍 2.2.2 代码实现:sig_catch.c 2.2.

By Ne0inhk
Flutter 组件 mock_client 的适配 鸿蒙Harmony 实战 - 驾驭 HTTP 协议级测试模拟、实现鸿蒙端离线环境下的接口断言与质量门禁方案

Flutter 组件 mock_client 的适配 鸿蒙Harmony 实战 - 驾驭 HTTP 协议级测试模拟、实现鸿蒙端离线环境下的接口断言与质量门禁方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 mock_client 的适配 鸿蒙Harmony 实战 - 驾驭 HTTP 协议级测试模拟、实现鸿蒙端离线环境下的接口断言与质量门禁方案 前言 在鸿蒙(OpenHarmony)生态的大型分布式政务办公系统、极繁金融交易内核以及对交互逻辑边界有极致审计要求的各种工业级应用开发中,“测试的确定性”是架构设计的定海神针。面对包含多级鉴权、动态速率限制(Rate Limiting)且环境依赖极重的后端 API。如果仅仅依靠真实的沙箱网络环境进行逻辑验收。那么不仅会导致测试套件由于网络波动引发由于非预期超时导致的频繁“假失败(Flaky Tests)”,更会因为无法模拟极端错误分位(如:服务器 500 时特定的 Payload 反馈)产生严重的代码覆盖率黑洞。 我们需要一种“契约自洽、逻辑伪造”的协议审计艺术。 mock_client(通常作为

By Ne0inhk