C++文件操作

C++文件操作

核心类

类名 头文件 用途 继承自 默认打开模式
ifstream <fstream> 从文件读取(输入) istream ios::in
ofstream <fstream> 向文件写入(输出) ostream ios::out(覆盖)
fstream <fstream> 读写文件 iostream 需显式指定模式

读写对比:

步骤 文本模式 二进制模式
打开 ofstream out("file.txt"); ofstream out("file.bin", ios::binary);
写入 out << "Hello" << endl; out.write(reinterpret_cast<char*>(&x), sizeof(x));
读取 in >> word;getline(in, s); in.read(reinterpret_cast<char*>(&x), sizeof(x));
关闭 out.close(); in.close();

写入文件

1、文本写入

cpp 复制代码
int main()
{
	system("chcp 65001");
	// 写入文件
	ofstream file("d:/log/123456.txt", std::ios::out | std::ios::trunc);
	if (!file.is_open()) {
		std::cerr << "无法打开文件 " << std::endl;
		return -1;
	}

	// 写入UTF-8 BOM
	//const unsigned char bom[] = { 0xEF, 0xBB, 0xBF };
	//file.write(reinterpret_cast<const char*>(bom), sizeof(bom));

	//英文字符
	std::u8string str1 = u8"hello world!";
	file.write(reinterpret_cast<const char*>(str1.data()), str1.size());
	file << std::endl;

	// u8string中文
	str1 = u8"测试中文内容string!";
	file.write(reinterpret_cast<const char*>(str1.data()), str1.size());
	file << std::endl;

	// u8string表情符
	str1 = u8"测试表情字符🌍😀 😃 😄 😁 😆!";
	file.write(reinterpret_cast<const char*>(str1.data()), str1.size());
	file << std::endl;

	file.close();

	return 0;
}

2、二进制写入

cpp 复制代码
int main()
{
	system("chcp 65001");
	// 写入文件
	ofstream file("d:/log/123456.txt", std::ios::binary | std::ios::trunc);
	if (!file.is_open()) {
		std::cerr << "无法打开文件 " << std::endl;
		return -1;
	}

	// 写入UTF-8 BOM
	//const unsigned char bom[] = { 0xEF, 0xBB, 0xBF };
	//file.write(reinterpret_cast<const char*>(bom), sizeof(bom));

	//英文字符
	std::u8string str1 = u8"hello world!";
	file.write(reinterpret_cast<const char*>(str1.data()), str1.size());
	file << std::endl;

	// u8string中文
	str1 = u8"测试中文内容string!";
	file.write(reinterpret_cast<const char*>(str1.data()), str1.size());
	file << std::endl;

	// u8string表情符
	str1 = u8"测试表情字符🌍😀 😃 😄 😁 😆!";
	file.write(reinterpret_cast<const char*>(str1.data()), str1.size());
	file << std::endl;

	file.close();

	return 0;
}

读取文件

1、文本读取

cpp 复制代码
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
	system("chcp 65001");
	ifstream file("d:/log/123456.txt", std::ios::in);
	if (!file.is_open()) {
		std::cerr << "无法打开文件 " << std::endl;
		return -1;
	}

	std::string line;
	long lineCount = 0;
	std::cout << getStringFromU8string(u8"=== 文本模式读取 ===") << std::endl;
	while (std::getline(file, line)) {
		lineCount++;
		std::cout << getStringFromU8string(u8"第") << lineCount << getStringFromU8string(u8"行: ") << line << std::endl;
	}
	file.close();

	return 0;
}

2、二进制读取

cpp 复制代码
int main()
{
	system("chcp 65001");
	ifstream file("d:/log/123456.txt", std::ios::binary);
	if (!file.is_open()) {
		std::cerr << "无法打开文件 " << std::endl;
		return -1;
	}

	std::string line;
	long lineCount = 0;
	std::cout << getStringFromU8string(u8"=== 二进制模式读取 ===") << std::endl;
	while (std::getline(file, line)) {
		lineCount++;
		std::cout << getStringFromU8string(u8"第") << lineCount << getStringFromU8string(u8"行: ") << line << endl;
	}
	file.close();

	return 0;
}

打开模式

可通过 | 组合多个标志

模式 说明 适用流类型
std::ios::in 以读方式打开 ifstream, fstream
std::ios::out 以写方式打开 ofstream, fstream
std::ios::app 追加写入(自动定位到文件末尾) ofstream, fstream
std::ios::ate 打开时将文件指针置于末尾(仍可写任意位置) 所有
std::ios::trunc 若文件存在则清空内容 ofstream(默认)
std::ios::binary 以二进制模式打开(非文本) 所有
std::ios::_Nocreate 指定文件不存在,则打开操作失败 可用exists判断
std::ios::_Noreplace 指定文件已存在,则创建操作失败 可用exists判断
cpp 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <filesystem>

using namespace std;

int main()
{
	system("chcp 65001");
	// 写入文件
	ofstream ofile("d:/log/123456.txt", std::ios::binary | std::ios::out | std::ios::trunc);
	//ofstream ofile("d:/log/123456.txt", std::ios::binary | std::ios::out | std::ios::app);
	//ofstream ofile("d:/log/123456.txt", std::ios::binary | std::ios::out | std::ios::ate);
	ofile.close();

	// _Nocreate文件不存在,则打开操作失败(不会自动创建)
	std::cout << getStringFromU8string(u8"------------写入文件std::ios::_Nocreate使用------------") << endl;
	ofstream ofile1("d:/log/654321.txt", std::ios::binary | std::ios::_Nocreate);
	std::cout << "is_open() = " << boolalpha << ofile1.is_open() << endl;
	std::cout << "exists() = " << boolalpha << std::filesystem::exists("d:/log/654321.txt") << endl;

	// _Noreplace如果文件已存在,则创建操作失败
	std::cout << getStringFromU8string(u8"------------写入文件std::ios::_Noreplace使用------------") << endl;
	ofstream ofile2("d:/log/123456.txt", std::ios::binary | std::ios::_Noreplace);
	std::cout << "is_open() = " << boolalpha << ofile2.is_open() << endl;
	std::cout << "exists() = " << boolalpha << std::filesystem::exists("d:/log/123456.txt") << endl;

	// 读取文件
	ifstream ifile("d:/log/123456.txt", std::ios::in);
	//ifstream ifile("d:/log/123456.txt", std::ios::binary | std::ios::in);
	ifile.close();

	// _Nocreate文件不存在,则打开操作失败(不会自动创建)
	std::cout << getStringFromU8string(u8"------------读取文件std::ios::_Nocreate使用------------") << endl;
	ifstream ifile1("d:/log/654321.txt", std::ios::binary | std::ios::_Nocreate);
	std::cout << "is_open() = " << boolalpha << ifile1.is_open() << endl;
	std::cout << "exists() = " << boolalpha << std::filesystem::exists("d:/log/654321.txt") << endl;

	// _Noreplace如果文件已存在,则创建操作失败
	std::cout << getStringFromU8string(u8"------------读取文件std::ios::_Noreplace使用------------") << endl;
	ifstream ifile2("d:/log/123456.txt", std::ios::binary | std::ios::_Noreplace);
	std::cout << "is_open() = " << boolalpha << ifile2.is_open() << endl;
	std::cout << "exists() = " << boolalpha << std::filesystem::exists("d:/log/123456.txt") << endl;

	return 0;
}

常用方法

函数/方法 返回类型 说明
.open(filename, mode) void 手动打开文件
.is_open() bool 是否成功打开文件 ✅ 推荐检查
.close() void 关闭文件(析构时自动调用)
.good() bool 流状态正常(无错误)
.fail() bool 发生逻辑错误(如格式不匹配)
.bad() bool 发生严重错误(如磁盘故障)
.eof() bool 到达文件末尾(⚠️ 不可靠作循环条件)
.clear() void 清除错误状态位
cpp 复制代码
int main()
{
	system("chcp 65001");
	// 读取文件
	ifstream file("d:/log/123456.txt", std::ios::in);
	std::cout << "is_open() = " << boolalpha << file.is_open() << endl;
	std::cout << "good() = " << boolalpha << file.good() << endl;
	std::cout << "bad() = " << boolalpha << file.bad() << endl;
	std::cout << "fail() = " << boolalpha << file.fail() << endl;
	std::cout << "eof() = " << boolalpha << file.eof() << endl;

	file.clear();
	file.close();

	return 0;
}
相关推荐
王老师青少年编程3 小时前
信奥赛C++提高组csp-s之搜索进阶(搜索剪枝案例实践1)
c++·csp·高频考点·信奥赛·提高组·搜索剪枝·小木棍
石山代码3 小时前
ArrayList / HashMap / ConcurrentHashMap
java·开发语言
程序大视界3 小时前
【Python系列课程】Python正则表达式(下):环视、命名分组与日志实战
开发语言·python·正则表达式
枫叶v.4 小时前
Agent 分层存储架构设计:从记忆方法到中间件选型
开发语言·python
sleven fung5 小时前
MinerU与BabelDOC与KTransformers与OpenAI API库
开发语言·python·ai·langchain
萤萤七悬5 小时前
【Python笔记】AI帮实现CLI工具-使用argparse.ArgumentParser接收命令参数
开发语言·笔记·python
iCxhust6 小时前
C# 命令行指令 查看二进制文件
开发语言·单片机·嵌入式硬件·c#·proteus·微机原理·8088单板机
csdn_aspnet6 小时前
Java 霍尔分区算法(Hoare‘s Partition Algorithm)
java·开发语言·算法
王老师青少年编程6 小时前
信奥赛C++提高组csp-s之搜索进阶(搜索剪枝核心思想 )
c++·dfs·csp·信奥赛·搜索剪枝·搜索优化
一拳一个呆瓜6 小时前
【STL】使用 C++ 标准库标头
c++·stl