C++基础学习——文件操作详解

一、文件流类概述

C++ 标准库提供了三个主要的文件流类:

  1. ifstream (输入文件流):用于从文件读取数据
  2. ofstream (输出文件流):用于向文件写入数据
  3. fstream (文件流):既可读又可写

这些类都继承自 iostream 类,因此可以使用 <<>> 操作符进行格式化I/O操作。

二、文件打开与关闭

1. 打开文件

#include <fstream>
using namespace std;// 方法1:先声明再打开
ofstream outFile;
outFile.open("output.txt");// 方法2:声明时直接打开
ifstream inFile("input.txt");// 方法3:使用fstream
fstream ioFile;
ioFile.open("data.txt", ios::in | ios::out);

2. 文件打开模式

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

组合示例:

// 以写入和追加模式打开
ofstream logFile("log.txt", ios::out | ios::app);// 以读写和二进制模式打开
fstream dataFile("data.dat", ios::in | ios::out | ios::binary);

3. 关闭文件

outFile.close();
inFile.close();
ioFile.close();

注意:虽然流对象析构时会自动关闭文件,但显式关闭是个好习惯。

三、文件状态检查

ifstream file("data.txt");if (file.is_open()) {// 文件成功打开
} else {// 文件打开失败
}// 检查流状态
if (file.good()) {// 流状态良好
}if (file.fail()) {// 操作失败(非致命错误)
}if (file.bad()) {// 严重错误
}if (file.eof()) {// 到达文件末尾
}

四、文本文件操作

1. 写入文本文件

ofstream out("output.txt");
if (out.is_open()) {out << "第一行文本" << endl;out << 123 << " " << 3.14 << endl;out << "这是另一行文本" << endl;out.close();
} else {cerr << "无法打开文件!" << endl;
}

2. 读取文本文件

逐行读取:
ifstream in("input.txt");
string line;
if (in.is_open()) {while (getline(in, line)) {cout << line << endl;}in.close();
}
逐词读取:
ifstream in("input.txt");
string word;
if (in.is_open()) {while (in >> word) {cout << word << endl;}in.close();
}
格式化读取:
ifstream in("data.txt");
int id;
double value;
string name;if (in.is_open()) {while (in >> id >> value >> name) {cout << "ID: " << id << ", Value: " << value << ", Name: " << name << endl;}in.close();
}

五、二进制文件操作

1. 写入二进制数据

struct Record {int id;char name[50];double salary;
};Record emp = {101, "John Doe", 4500.50};ofstream out("employees.dat", ios::binary);
if (out.is_open()) {out.write(reinterpret_cast<char*>(&emp), sizeof(Record));out.close();
}

2. 读取二进制数据

Record emp;
ifstream in("employees.dat", ios::binary);
if (in.is_open()) {in.read(reinterpret_cast<char*>(&emp), sizeof(Record));cout << "ID: " << emp.id << endl;cout << "Name: " << emp.name << endl;cout << "Salary: " << emp.salary << endl;in.close();
}

3. 二进制文件随机访问

fstream file("data.dat", ios::in | ios::out | ios::binary);// 写入多个记录
Record records[3] = {{101, "Alice", 5000},{102, "Bob", 6000},{103, "Charlie", 7000}
};file.write(reinterpret_cast<char*>(records), 3 * sizeof(Record));// 直接读取第二个记录
Record emp;
file.seekg(1 * sizeof(Record), ios::beg);
file.read(reinterpret_cast<char*>(&emp), sizeof(Record));// 修改第三个记录
emp = {103, "David", 7500};
file.seekp(2 * sizeof(Record), ios::beg);
file.write(reinterpret_cast<char*>(&emp), sizeof(Record));file.close();

六、文件定位

1. 获取当前位置

streampos pos = file.tellg();  // 获取读取位置
streampos pos = file.tellp();  // 获取写入位置

2. 设置位置

// 绝对定位
file.seekg(0, ios::beg);  // 移动到文件开头
file.seekg(0, ios::end);  // 移动到文件末尾// 相对定位
file.seekg(10, ios::cur);  // 从当前位置向前移动10字节
file.seekg(-5, ios::cur);  // 从当前位置向后移动5字节

七、实用文件操作函数

1. 检查文件是否存在

#include <sys/stat.h>bool fileExists(const string& filename) {struct stat buffer;return (stat(filename.c_str(), &buffer) == 0);
}

2. 获取文件大小

streampos getFileSize(const string& filename) {ifstream file(filename, ios::ate | ios::binary);return file.tellg();
}

3. 复制文件

bool copyFile(const string& source, const string& dest) {ifstream src(source, ios::binary);ofstream dst(dest, ios::binary);if (!src || !dst) {return false;}dst << src.rdbuf();return true;
}

4. 读取CSV文件

void readCSV(const string& filename) {ifstream file(filename);string line;while (getline(file, line)) {stringstream ss(line);string cell;vector<string> row;while (getline(ss, cell, ',')) {row.push_back(cell);}// 处理行数据for (const auto& val : row) {cout << val << "\t";}cout << endl;}
}

八、错误处理最佳实践

void processFile(const string& filename) {ifstream file(filename);if (!file) {cerr << "错误:无法打开文件 " << filename << endl;perror("原因");  // 打印系统错误信息return;}try {// 文件处理代码string line;while (getline(file, line)) {// 处理每一行}if (file.bad()) {throw runtime_error("读取文件时发生严重错误");}if (file.fail() && !file.eof()) {throw runtime_error("文件格式错误");}} catch (const exception& e) {cerr << "错误: " << e.what() << endl;file.close();return;}file.close();
}

九、性能考虑

  1. 缓冲区大小:默认缓冲区大小可能不适合大文件操作,可以自定义:

    char buffer[8192];  // 8KB缓冲区
    ifstream file;
    file.rdbuf()->pubsetbuf(buffer, sizeof(buffer));
    file.open("largefile.dat");
    
  2. 二进制 vs 文本:二进制操作通常比文本操作更快,特别是对于大量数据。

  3. 内存映射文件:对于极大文件,考虑使用操作系统特定的内存映射文件API。

十、C++17 文件系统库

C++17 引入了 <filesystem> 库,提供了更高级的文件操作:

#include <filesystem>
namespace fs = std::filesystem;// 检查文件是否存在
if (fs::exists("test.txt")) {// 获取文件大小auto size = fs::file_size("test.txt");// 复制文件fs::copy("source.txt", "destination.txt");// 删除文件fs::remove("old_file.txt");// 遍历目录for (auto& entry : fs::directory_iterator(".")) {cout << entry.path() << endl;}
}

通过掌握这些文件操作技术,您可以在C++程序中高效地处理各种文件I/O任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916261.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android补全计划 DrawerLayout使用

DrawerLayout其实用了很久了&#xff0c;甚至封装了一些代码方便不同项目使用&#xff0c;但重构代码的时候突然意识到这块内容很不成体系&#xff0c;因此又参考了些文档&#xff0c;组建了自己的一个文档。 toolbardrawerlayout能写的效果很多&#xff0c;在此我也只是截取了…

人工智能之数学基础:概率论之韦恩图的应用

韦恩图的应用由于事件的计算有时候太过于抽象了&#xff0c;此时我们可以使用韦恩图的方式来进行验证&#xff0c;我们下面来举一个例子&#xff0c;A∪B&#xff09;-CA∪(B-C)是否成立&#xff1f;我们可以通过韦恩图来完成这个任务&#xff1a;我们通过这种方式来一点一点的…

小白成长之路-部署Zabbix7(二)

文章目录一、zabbix-自动发现二、自动注册三、zabbix-网易云邮箱-发送消息二、zabbix-钉钉告警总结一、zabbix-自动发现 1.在准备两台虚拟机&#xff0c;我的是192.168.144.12,192.168.144.13 server换成zabbix服务器的ip地址 vim /etc/zabbix/zabbix_agentd.conf 2.创建自动…

CMU15445-2024fall-project4踩坑经历

project4目录Task1Task2ReconstructSeqScanTask3InsertCommitTxnMgrDbgGenerateNewUndoLog And GenerateUpdateUndoLogUpdate And Delete垃圾回收Task4Index Insert并发控制Index ScanDelete、Update并发控制主键更新Bonus 1Bonus 2处理写倾斜感谢CMU的教授们给我们分享了如此精…

C++20 协程

摘要&#xff1a;C20 引入的协程机制为异步编程提供了轻量级解决方案&#xff0c;其核心优势在于通过用户态调度实现高效的上下文切换&#xff0c;适用于 I/O 密集型任务、生成器模式等场景。本文系统阐述 C20 协程的底层原理与实践要点&#xff0c;首先解析协程的基本结构&…

《计算机组成原理与汇编语言程序设计》实验报告二 基本数字逻辑及汉字显示

目 录 一、实验学时 二、实验目的 三、实验要求 四、实验内容 五、实验步骤 1、打开Logisim软件&#xff0c;列出并行四位二进制全加器逻辑电路真值表&#xff0c;并使用与、或、非、异或等基本原件实现并行四位二进制全加器逻辑电路&#xff0c;铺设完成后进行测试进而…

问卷调查小程序的设计与实现

问卷调查小程序的设计与实现&#xff1a;技术与功能全解析在数字化时代&#xff0c;问卷调查成为数据收集的重要工具。一款高效、易用的问卷调查小程序能够显著提升用户体验和数据质量。本文将深入探讨基于现代技术栈的问卷调查小程序的设计与实现&#xff0c;涵盖核心功能、技…

STM32项目实战:正弦波

波形发生器对我的钱包不怎么友好&#xff0c;手里面有stm32f103c8t6&#xff0c;于是就想,放在哪儿吃灰也是吃灰&#xff0c;不如做个正弦波发生器。方案 dac没怎么用过&#xff0c;所以打算使用输出模拟正弦波。我们决定采用以下方案&#xff1a;1.使用TIM2_CH3&#xff08;PA…

Unity 时间抗锯齿(Temporal Antialiasing, TAA)技术解析

时间抗锯齿&#xff08;Temporal Antialiasing, TAA&#xff09;技术解析 一、什么是时间抗锯齿&#xff08;TAA&#xff09;&#xff1f; 时间抗锯齿&#xff08;TAA&#xff09;是一种先进的实时抗锯齿技术&#xff0c;通过在时间维度上积累多帧渲染数据&#xff0c;实现比传…

uniapp打开导航软件并定位到目标位置的实现

/*** 打开导航* param location 经纬度(例如&#xff1a;"117.214713,39.116884")* param address 地址*/ export function mapNavigation(location, address) {const locationArr location.split(,)const longitude locationArr[0]const latitude locationArr[1]…

Mysql实现高可用(主从、集群)

一、背景 需求&#xff1a;客户要实现Mysql8.0高可用&#xff0c;出现故障时&#xff0c;需要实现自动切换。 分析&#xff1a;实现切换有两种方式&#xff0c;一种数据库自动切换&#xff0c;一种代码实现。 本着麻烦别人&#xff0c;别麻烦自己的原则&#xff0c;得给客户的D…

AI编程革命:自动化代码生成、低代码开发与智能优化实践全景解析

AI编程革命&#xff1a;自动化代码生成、低代码开发与智能优化实践全景解析 人工智能正在重塑软件开发的基本范式&#xff0c;从自动化代码生成到低代码开发平台&#xff0c;再到算法智能优化&#xff0c;AI编程技术正以指数级速度改变开发者工作方式。 一、自动化代码生成技术…

[实战] 用1 PPS 驯服本地恒温晶振(OCXO/TCXO)

1 PPS 驯服本地恒温晶振&#xff08;OCXO/TCXO&#xff09; “让任何工程师都能在一周内做出自己的 GPSDO” 文章目录1 PPS 驯服本地恒温晶振&#xff08;OCXO/TCXO&#xff09;前言1 系统总体框图2 硬件清单与连接3 时间间隔测量&#xff08;TDC&#xff09;原理4 数字锁相环算…

基于RK3576+FPGA的无人机飞控系统解决方案

基于RK3576FPGA的无人机飞控系统解决方案设计如下&#xff1a;一、硬件架构设计‌异构计算核心模块‌主控采用RK3576处理器&#xff0c;四核Cortex-A72&#xff08;2.3GHz&#xff09;运行路径规划算法&#xff08;A*、RRT*&#xff09;&#xff0c;支持动态避障响应时间<50…

2025暑期—05神经网络-卷积神经网络

1. 卷积神经网络实际上就是避免过拟合&#xff0c;就是“特征”神经网络。这个特征和卷积核相关。卷积和相关类似&#xff0c;有点是本质属性和输出属性的感觉。着重注意三通道卷积padding 上下左右、前后都要加边池化就是解决特征过多问题&#xff0c;缩小1倍较多。均值池化&a…

Elasticsearch部署全攻略:编译安装与 Yum 安装实践,日志切割及报错处理

前言&#xff1a;在 Linux 运维工作中&#xff0c;Elasticsearch 的部署与运维是高频需求——无论是快速搭建测试环境还是构建生产级集群&#xff0c;选择合适的安装方式&#xff08;编译安装或 Yum 安装&#xff09;直接影响后续维护效率。同时&#xff0c;日志的合理切割能避…

TypeScript 配置参数详解 (tsconfig.json)

文章目录前言核心配置基本选项严格类型检查选项模块解析选项Source Map 选项实验性选项其他选项文件包含/排除选项详细用法示例最佳实践建议前言 tsconfig.json 是 TypeScript 项目的配置文件&#xff0c;用于指定编译选项和文件包含规则。以下是所有主要配置参数的中文详解&a…

Java经典笔试题

1.计算机网络传输层有哪些协议&#xff1f;分别适用于什么场景&#xff1f; TCP&#xff1a;面向连接、可靠传输&#xff08;重传机制&#xff09;&#xff0c;适用于对数据完整性要求高的场景&#xff0c;如文件传输 &#xff08;FTP&#xff09;、HTTP 通信、邮件发送&…

如何序列化和反序列化动态 XmlElement ?

有如下XML&#xff0c;Index_0-Index_N为动态的&#xff0c;N为可变数&#xff0c;如何将对象NoneXML序列化为XML&#xff0c;以及如何将XML内容反序列化为对象NoneXML&#xff1f;1、XML内容<NoneXML><Index_0><UseInSummary>0</UseInSummary><Beg…

分布式高可用ELK平台搭建及使用保姆级教程指南 (附安装包网盘免费下载)

1 ELK 简介 1.1 ELK 是什么 ​ ELK是一套开源免费且功能强大的日志分析管理系统,由 Elasticsearch、Logstash、Kibana 三部分组成,是三个软件产品的首字母缩写,简称ELK。这三款软件都是开源软件,通常是配合使用,且归于 Elastic.co 公司名下,所以被简称为 ELK。 ​ ELK…