C++实现文本与二进制文件读写操作的示例
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一、文件操作核心类</li><li>二、文本文件操作</li><ul class="second_class_ul"><li>1. 写入文本文件</li><li>2. 读取文本文件</li></ul><li>三、二进制文件操作</li><ul class="second_class_ul"><li>1. 写入二进制数据</li><li>2. 读取二进制数据</li></ul><li>四、文件打开模式详解</li><ul class="second_class_ul"></ul><li>五、错误处理机制</li><ul class="second_class_ul"></ul><li>六、最佳实践与性能优化</li><ul class="second_class_ul"><li>1. RAII管理资源</li><li>2. 高效文件复制</li><li>3. C++17文件系统操作</li></ul><li>七、应用案例:日志系统</li><ul class="second_class_ul"></ul></ul></div><p>在C++开发中,文件操作是必备技能之一。本文将全面解析C++文件读写的核心概念、操作方法和最佳实践,包含丰富的代码示例。</p><p class="maodian"></p><h2>一、文件操作核心类</h2>
<p>C++通过<code><fstream></code>头文件提供三种核心类:</p>
<table><thead><tr><th>类名</th><th>功能描述</th><th>继承关系</th></tr></thead><tbody><tr><td>ofstream</td><td>文件输出流(写操作)</td><td>继承自ostream</td></tr><tr><td>ifstream</td><td>文件输入流(读操作)</td><td>继承自istream</td></tr><tr><td>fstream</td><td>文件输入输出流(读写操作)</td><td>继承自iostream</td></tr></tbody></table>
<p class="maodian"></p><h2>二、文本文件操作</h2>
<p class="maodian"></p><h3>1. 写入文本文件</h3>
<div class="jb51code"><pre class="brush:cpp;">#include <fstream>
#include <string>
int main() {
// 创建输出流(默认覆盖模式)
std::ofstream outFile("data.txt");
if (!outFile) {
std::cerr << "文件创建失败!" << std::endl;
return 1;
}
// 写入不同类型数据
outFile << "用户日志\n";
outFile << "ID: " << 1001 << "\n";
outFile << "余额: $" << 2450.75 << "\n";
// 自动关闭文件(RAII)
return 0;
}
</pre></div>
<p class="maodian"></p><h3>2. 读取文本文件</h3>
<div class="jb51code"><pre class="brush:cpp;">#include <fstream>
#include <iostream>
int main() {
std::ifstream inFile("data.txt");
if (!inFile.is_open()) {
std::cerr << "文件打开失败!" << std::endl;
return 1;
}
// 逐行读取
std::string line;
while (std::getline(inFile, line)) {
std::cout << line << std::endl;
}
// 重置读取位置
inFile.clear();
inFile.seekg(0);
// 格式化读取
int id;
double balance;
inFile.ignore(100, ':');// 跳过"ID: "
inFile >> id;
inFile.ignore(100, '$'); // 跳过"余额: $"
inFile >> balance;
std::cout << "\n解析结果: ID=" << id
<< ", 余额=" << balance << std::endl;
return 0;
}
</pre></div>
<p class="maodian"></p><h2>三、二进制文件操作</h2>
<p class="maodian"></p><h3>1. 写入二进制数据</h3>
<div class="jb51code"><pre class="brush:cpp;">#include <fstream>
struct UserData {
int id;
double balance;
char name;
};
int main() {
UserData user = {1001, 2450.75, "张三"};
std::ofstream binFile("user.dat", std::ios::binary);
binFile.write(reinterpret_cast<char*>(&user), sizeof(user));
return 0;
}
</pre></div>
<p class="maodian"></p><h3>2. 读取二进制数据</h3>
<div class="jb51code"><pre class="brush:cpp;">#include <fstream>
#include <iostream>
int main() {
std::ifstream binFile("user.dat", std::ios::binary);
if (!binFile) {
std::cerr << "二进制文件打开失败!" << std::endl;
return 1;
}
UserData user;
binFile.read(reinterpret_cast<char*>(&user), sizeof(user));
std::cout << "用户ID: " << user.id << "\n"
<< "姓名: " << user.name << "\n"
<< "余额: " << user.balance << std::endl;
return 0;
}
</pre></div>
<p class="maodian"></p><h2>四、文件打开模式详解</h2>
<p><strong>通过位或运算符组合多种模式:</strong></p>
<table><thead><tr><th>模式标志</th><th>描述</th></tr></thead><tbody><tr><td>std::ios::in</td><td>读模式(默认ifstream)</td></tr><tr><td>std::ios::out</td><td>写模式(默认ofstream)</td></tr><tr><td>std::ios::app</td><td>追加模式(不覆盖原有内容)</td></tr><tr><td>std::ios::ate</td><td>打开后定位到文件末尾</td></tr><tr><td>std::ios::trunc</td><td>清空文件(默认)</td></tr><tr><td>std::ios::binary</td><td>二进制模式</td></tr></tbody></table>
<div class="jb51code"><pre class="brush:cpp;">// 示例:以追加模式写入文本
std::ofstream logFile("app.log",
std::ios::out | std::ios::app);
// 示例:读写二进制文件(不截断)
std::fstream dataFile("records.dat",
std::ios::binary |
std::ios::in |
std::ios::out);
</pre></div>
<p class="maodian"></p><h2>五、错误处理机制</h2>
<p><strong>健壮的文件操作必须包含错误处理:</strong></p>
<div class="jb51code"><pre class="brush:cpp;">std::fstream file("critical.dat");
// 检查文件状态
if (file.fail()) {
std::cerr << "文件操作失败!" << std::endl;
}
// 详细错误诊断
if (!file) {
if (file.bad()) {
std::cerr << "不可恢复的错误" << std::endl;
} else if (file.eof()) {
std::cerr << "到达文件末尾" << std::endl;
} else if (file.fail()) {
std::cerr << "非致命错误(如格式错误)" << std::endl;
}
}
</pre></div>
<p class="maodian"></p><h2>六、最佳实践与性能优化</h2>
<p class="maodian"></p><h3>1. RAII管理资源</h3>
<div class="jb51code"><pre class="brush:cpp;">{
std::ofstream tmpFile("temp.txt");
// 文件在作用域结束时自动关闭
}
</pre></div>
<p class="maodian"></p><h3>2. 高效文件复制</h3>
<div class="jb51code"><pre class="brush:cpp;">bool copyFile(const std::string& src, const std::string& dst) {
std::ifstream in(src, std::ios::binary);
std::ofstream out(dst, std::ios::binary);
if (!in || !out) return false;
const size_t BUFFER_SIZE = 4096;
char buffer;
while (in.read(buffer, BUFFER_SIZE)) {
out.write(buffer, BUFFER_SIZE);
}
out.write(buffer, in.gcount());// 写入剩余字节
return true;
}
</pre></div>
<p class="maodian"></p><h3>3. C++17文件系统操作</h3>
<div class="jb51code"><pre class="brush:cpp;">#include <filesystem>
namespace fs = std::filesystem;
// 检查文件存在
if (fs::exists("data.txt")) {
// 获取文件大小
auto size = fs::file_size("data.txt");
// 重命名文件
fs::rename("old.txt", "new.txt");
}
</pre></div>
<p class="maodian"></p><h2>七、应用案例:日志系统</h2>
<div class="jb51code"><pre class="brush:cpp;">class Logger {
public:
Logger(const std::string& filename)
: logFile(filename, std::ios::app) {}
~Logger() { if (logFile) logFile.close(); }
void log(const std::string& message) {
if (!logFile) return;
auto now = std::chrono::system_clock::now();
auto time = std::chrono::system_clock::to_time_t(now);
logFile << std::put_time(std::localtime(&time), "%F %T")
<< " | " << message << "\n";
}
private:
std::ofstream logFile;
};
// 使用示例
Logger logger("app.log");
logger.log("系统启动");
logger.log("用户登录: ID=1001");
</pre></div>
<p>到此这篇关于C++实现文本与二进制文件读写操作的示例的文章就介绍到这了,更多相关C++ 文本与二进制文件读写操作内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>C++使用read()和write()读写二进制文件</li><li>C++ 二进制文件读写方式及示例详解</li><li>C\C++实现读写二进制文件的方法详解</li><li>C++用read()和write()读写二进制文件的超详细教程</li><li>C++读写(CSV,Yaml,二进制)文件的方法详解</li><li>C/C++中二进制文件&顺序读写详解及其作用介绍</li><li>C/C++读写文本文件、二进制文件的方法</li><li>利用C/C++二进制读写png文件的方法示例</li><li>详解C++编程中对二进制文件的读写操作</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]