C++ 提供了强大的文件操作功能,主要包括文件重定向、文件读写等操作。下面我将详细介绍这些内容。
一、文件重定向
概念:是指将标准输入/输出流重定向到文件,而不是默认的控制台,这主要在命令行环境中使用,而不是直接在C++代码中实现。但在C++中,我们可以使用流重定向来实现类似功能,下面举例进行说明。
-
标准流重定向
#include
#include
void redirect_stdout() {
std::ofstream out(“output.txt”);
// 保存原来的cout缓冲区
auto old_buf = std::cout.rdbuf();
// 重定向cout到文件
std::cout.rdbuf(out.rdbuf());
std::cout << “这将被写入文件而不是控制台\n”;
// 恢复原来的cout缓冲区
std::cout.rdbuf(old_buf);
} -
标准输入重定向
void redirect_stdin() {
std::ifstream in(“input.txt”);
auto old_buf = std::cin.rdbuf();
std::cin.rdbuf(in.rdbuf());
std::string line;
while (std::getline(std::cin, line)) {
std::cout << "从文件读取: " << line << “\n”;
}
std::cin.rdbuf(old_buf);
}
二、文件读写操作
C++ 使用 头文件进行文件操作,主要类包括:
ifstream:用于从文件读取数据
ofstream:用于向文件写入数据
fstream:既能读取文件数据,也能向文件写入数据
文件读写操作步骤
1、包含头文件
2、创建文件流对象
3、打开文件
4、检查文件是否成功打开
5、文件读写操作
6、关闭文件
举例说明
#include //包含头文件
#include
int main() {
std::ofstream outFile(“example.txt”); //创建文件流对象的同时打开文件
if (!outFile) { //检查文件是否成功打开
std::cerr << “文件打开失败” << std::endl;
return 1;
}
outFile << “第一行文本\n”; //文件写操作
outFile << “第二行文本\n”;
outFile << 12345 << “\n”;
outFile.close(); //关闭文件
return 0;
}
文件基本操作
1、写入文件
#include
#include
void write_to_file() {
// 创建输出文件流(覆盖模式)
std::ofstream out_file(“example.txt”);
if (out_file.is_open()) {
out_file << “这是第一行\n”;
out_file << “这是第二行\n”;
out_file << 12345 << “\n”;
out_file.close();
} else {
std::cerr << “无法打开文件\n”;
}
// 追加模式
std::ofstream append_file(“example.txt”, std::ios::app);
if (append_file.is_open()) {
append_file << “这是追加的内容\n”;
append_file.close();
}
}
2、读取文件
void read_from_file() {
std::ifstream in_file(“example.txt”);
std::string line;
if (in_file.is_open()) {
// 逐行读取
while (std::getline(in_file, line)) {
std::cout << line << “\n”;
}
in_file.close();
} else {
std::cerr << “无法打开文件\n”;
}
// 读取单个单词(空格分隔)
std::ifstream in_file2(“example.txt”);
std::string word;
while (in_file2 >> word) {
std::cout << "单词: " << word << “\n”;
}
in_file2.close();
}
3、二进制文件操作
void binary_file_operations() {
// 写入二进制数据
std::ofstream bin_out(“data.bin”, std::ios::binary);
int data[] = {1, 2, 3, 4, 5};
if (bin_out.is_open()) {
bin_out.write(reinterpret_cast<char*>(data), sizeof(data));
bin_out.close();
}
// 读取二进制数据
std::ifstream bin_in(“data.bin”, std::ios::binary);
int read_data[5];
if (bin_in.is_open()) {
bin_in.read(reinterpret_cast<char*>(read_data), sizeof(read_data));
bin_in.close();
for (int i = 0; i < 5; ++i) {
std::cout << read_data[i] << " ";
}
std::cout << "\n";
}
}
4、文件状态检查
void file_status_checks() {
std::fstream file(“test.txt”, std::ios::in | std::ios::out);
if (!file) {
std::cerr << “文件打开失败\n”;
return;
}
// 检查文件是否在结尾
if (file.eof()) {
std::cout << “到达文件末尾\n”;
}
// 检查是否出错
if (file.fail()) {
std::cerr << “操作失败\n”;
}
// 获取文件大小
file.seekg(0, std::ios::end);
std::streampos size = file.tellg();
std::cout << “文件大小: " << size << " 字节\n”;
file.seekg(0, std::ios::beg);
file.close();
}
5、文件操作模式
打开文件时可以指定不同的模式:
std::ios::in 打开用于读取
std::ios::out 打开用于写入
std::ios::binary 二进制模式
std::ios::ate 打开时定位到文件末尾
std::ios::app 追加模式,所有写入都在末尾
std::ios::trunc 如果文件存在,先截断
错误处理:
使用is_open()检查文件是否成功打开
通过流状态(good()、eof()、fail()、bad())判断操作结果
可以组合使用:
std::fstream file(“data.txt”, std::ios::in | std::ios::out | std::ios::binary);
6、文件位置操作
void file_positioning() {
std::fstream file(“data.txt”, std::ios::in | std::ios::out);
// 获取当前位置
std::streampos pos = file.tellg();
// 移动到文件开头
file.seekg(0, std::ios::beg);
// 移动到文件末尾
file.seekg(0, std::ios::end);
// 向前移动10字节
file.seekg(10, std::ios::cur);
// 向后移动5字节
file.seekg(-5, std::ios::cur);
}
4万+

被折叠的 条评论
为什么被折叠?



