C++ 的文件操作主要涉及文件的打开、关闭、读取和写入。C++标准库中的 头文件提供了用于文件操作的类,其中 std::ifstream 用于读取文件, std::ofstream 用于写入文件,而 std::fstream 则既可以读取也可以写入文件。
打开文件
在读取或写入文件之前,需要使用相应的文件流对象打开一个文件。可以通过提供文件名来构造一个文件流对象,该对象会在构造时尝试打开文件。如下为样例代码:
#include <fstream>
#include <iostream>
int main() {
// 创建一个用于写入的文件流对象
std::ofstream outfile("test.txt");
// 检查文件是否成功打开
if (!outfile) {
std::cerr << "failed to open the file" << std::endl;
return 1;
}
// 写入一些数据到文件
outfile << "hello" << std::endl;
// 关闭文件
outfile.close();
return 0;
}
读取文件
使用 std::ifstream 可以读取文件的内容。可以使用流提取运算符 >> 或 getline 函数来读取数据。如下为样例代码:
#include <fstream>
#include <iostream>
#include <string>
int main() {
// 创建一个用于读取的文件流对象
std::ifstream infile("test.txt");
// 检查文件是否成功打开
if (!infile)
{
std::cerr << "failed to open the file" << std::endl;
return 1;
}
// 读取文件内容
std::string line;
while (std::getline(infile, line))
{
std::cout << line << std::endl;
}
// 关闭文件
infile.close();
return 0;
}
快速读取大文件
如果需要快速读取一个大文件,则要避免逐行读取或者逐字符读取带来的额外开销。一种快速读取文件的方法是使用文件流的 read 成员函数,它可以一次读取多个字符,这样可以减少系统调用的次数,从而提高读取效率。如下为样例代码:
#include <fstream>
#include <iostream>
#include <vector>
int main() {
// 打开文件
std::ifstream file("large_file.bin", std::ios::binary);
// 检查文件是否成功打开
if (!file)
{
std::cerr << "failed to open the file" << std::endl;
return 1;
}
// 获取文件大小
file.seekg(0, std::ios::end);
std::streamsize fileSize = file.tellg();
file.seekg(0, std::ios::beg);
// 分配足够的内存来存储文件内容
std::vector<char> buffer(fileSize);
// 读取文件内容到buffer
if (!file.read(buffer.data(), fileSize))
{
std::cerr << "读取文件失败" << std::endl;
return 1;
}
// 在这里处理文件内容,例如可以将其输出到标准输出
std::cout.write(buffer.data(), fileSize);
// 关闭文件
file.close();
return 0;
}
读写文件
下面是一个同时包含读取和写入操作的示例:
#include <fstream>
#include <iostream>
#include <string>
int main() {
// 写入文件
std::ofstream outfile("test.txt");
if (!outfile)
{
std::cerr << "failed to open the file" << std::endl;
return 1;
}
outfile << "first line" << std::endl; //写入第一行
outfile << "second line" << std::endl; //写入第二行
outfile.close();
// 读取文件
std::ifstream infile("test.txt");
if (!infile) {
std::cerr << "failed to open the file" << std::endl;
return 1;
}
std::string line;
while (std::getline(infile, line))
{
std::cout << line << std::endl;
}
infile.close();
return 0;
}
文件流的状态
可以使用文件流对象的 is_open() 成员函数来检查文件是否已成功打开。此外,还可以使用 fail() , eof() , 和 bad() 等成员函数来检查流的状态。
文件流的其他操作
clear(): 重置流的状态标志。
seekg() 和 seekp(): 移动文件的读写指针。
tellg() 和 tellp(): 返回文件的读写指针当前位置。
flush(): 清空输出缓冲区,确保所有数据都被写入文件。