前言
在C++中进行文件读写操作通常使用标准库中的头文件。这个头文件提供了三个主要的类:<ifstream>(用于读取文件)、<ofstream>(用于写入文件)和<fstream>(用于读写文件),详情如下所示:
数据类型 | 描述 |
---|---|
ofstream | 该数据类型表示输出文件流,用于创建文件并向文件写入信息。 |
ifstream | 该数据类型表示表示文件流,用于从文件读取信息。 |
fstream | 该数据类型通常表示文件流,且同时具有ofstream和ifstream两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。 |
要在C++中矩形文件的操作时,必须在C++源代码文件中包含头文件<iostream>和<fstream>。
一、创建文件&&向文件写入数据
- 代码
void file_write(string filename, char *data)
{
// 向文件写入数据
ofstream outfile;
outfile.open(filename, ios::app); // 使用传入的文件名
// 检查文件是否成功打开
if (!outfile.is_open()) {
std::cerr << "无法打开文件进行写入" << std::endl;
return;
}
// 定位到 outfile 的末尾
outfile << data;
outfile.close();
}
- 代码详情解析
(1)函数定义
void file_write(string filename, char *data);
void:表示函数没有返回值。
file_write:函数名。
string filename:函数参数,表示文件名,类型为string。
char *data:函数参数,表示要写入文件的数据,类型为char*(字符指针)。
(2)创建ofstream对象
ofstream outfile;
ofstream:用于文件写操作的类
outfile:ofstream对象的名称。
(3)打开文件
outfile.open(filename, ios::app);
打开名为filename,并以追加模式(ios::app)打开。追加模式意味着写入的数据将追加到文件的末尾,而不是覆盖原有内容。
(4) 检查文件是否成功打开
if (!outfile.is_open()) {
std::cerr << "无法打开文件进行写入" << std::endl;
return;
}
outfile.is_open():检查文件是否成功打开。
std::cerr:用于输出错误信息。
return:如果文件打开失败,函数将返回,不再继续执行后续代码。
(5)写入数据
outfile << data;
将data指向的字符数据写入文件。data是一个char*类型的指针,指向要写入的字符数据。
(6)关闭文件
outfile.close();
关闭文件,释放资源。
(7)总结
这段代码定义了一个向指定文件写入数据的成员函数。通过使用ofstream类,可以方便地进行文件写操作。函数首先创建一个ofstream对象,然后使用传入的文件名以追加模式打开文件。接着检查文件是否成功打开,如果失败则输出错误信息并返回。如果文件成功打开,则将传入的数据写入文件,最后关闭文件。这个过程确保了文件操作的可靠性和安全性。
二、读取文件数据
- 代码
void file_read(string filename, char* data, int *n)
{
// 以读模式打开文件
ifstream infile(filename, ios::binary);
// 判断是否打开文件
if (infile.is_open())
{
// 获取文件大小
infile.seekg(0, ios::end);
streampos fileSize = infile.tellg();
*n = fileSize;
// 从头开始获取文件内部数据
infile.seekg(0, ios::beg);
infile.read(data, fileSize);
infile.close();
}
else
{
cout << "文件无法打开" << endl;
}
}
- 代码详情解析
(1)函数定义
void file_read(string filename, char* data, int *n)
void:表示函数没有返回值。
file_read:函数名。
string filename:函数参数,表示文件名,类型为string。
char* data:函数参数,表示用于存储读取数据的缓冲区,类型为char*(字符指针)。
int *n:函数参数,表示用于存储文件大小的指针,类型为int*。
(2)创建ifstream对象
ifstream infile(filename, ios::binary);
ifstream:用于文件读操作的类。
infile:ifstream对象的名称。
filename:传入的文件名。
ios::binary:以二进制模式打开文件,确保读取的数据不会被解释为文本。
(3)判断文件是否成功打开
if (infile.is_open())
infile.is_open():检查文件是否成功打开。
(4)获取文件大小
infile.seekg(0, ios::end);
streampos fileSize = infile.tellg();
*n = fileSize;
infile.seekg(0, ios::end):将文件指针移动到文件末尾。
infile.tellg():获取当前文件指针的位置,即文件大小。
streampos fileSize = infile.tellg():将文件大小存储在fileSize变量中。
*n = fileSize:将文件大小存储在传入的n指针所指向的变量中。
(5)从头开始读取文件数据
infile.seekg(0, ios::beg);
infile.read(data, fileSize);
infile.seekg(0, ios::beg):将文件指针移动到文件开头。
infile.read(data, fileSize):从文件中读取fileSize字节的数据,并存储到data指向的缓冲区中。
(6)关闭文件
infile.close();
infile.close():关闭文件,释放资源。
(7)文件打开失败处理
else
{
cout << "文件无法打开" << endl;
}
cout << “文件无法打开” << endl:如果文件打开失败,输出错误信息。
(8)总结
这段代码定义了一个从指定文件读取数据的成员函数。通过使用ifstream类,可以方便地进行文件读操作。函数首先以二进制读模式打开文件,然后获取文件大小,并将文件内容读取到传入的缓冲区中,最后关闭文件。这个过程确保了文件操作的可靠性和安全性。如果文件打开失败,函数会输出错误信息。
三、删除文件数据
- 代码
void file_delete(string filename, int start_n, int end_n)
{
// 以读模式打开文件
ifstream infile(filename, ios::binary);
if (!infile) {
cerr << "无法打开文件: " << filename << endl;
return;
}
// 创建临时文件
ofstream outfile("temp.txt", ios::binary);
if (!outfile)
{
cerr << "无法创建临时文件" << endl;
infile.close();
return;
}
//判断是否打开文件
if (infile.is_open())
{
// 获取文件大小
ifstream file_1(filename, ios::binary);
file_1.seekg(0, ios::end);
streampos fileSize = file_1.tellg();
// 检查删除范围
if ((start_n > end_n) || (start_n < 0) || (end_n > fileSize))
{
cerr << "无效的删除范围" << endl;
infile.close();
outfile.close();
return;
}
//从头开始获取文件内部数据
char data[1024], data_temp[1024];
int location = 0;
file_1.seekg(0, ios::beg);
infile.read(data, fileSize);
for (int i = 0; i < fileSize; i++)
{
if ((i >= start_n) && (i <= end_n))
{
continue;
}
else
{
//保存不需要被删除的文件
data_temp[location] = data[i];
location ++;
}
}
//将不需要被删除的文件写入临时文件
outfile.write(data_temp, location);
}
//关闭文件
infile.close();
outfile.close();
// 删除原文件并重命名临时文件
if (remove(filename .c_str()) == 0)
{
cout << "\r\n删除文件成功!" << endl;
}
else
{
perror("\r\n文件删除失败\r\n"); // 输出详细的错误信息
}
if (rename((char*)"temp.txt", filename.c_str()) == 0)
{
cout << "重命名文件成功!" << endl;
}
else
{
perror("文件重命名失败"); // 输出详细的错误信息
}
}
- 代码详情解析
(1)函数定义
void file_delete(string filename, int start_n, int end_n)
void:表示函数没有返回值。
file_delete:函数名。
string filename:函数参数,表示文件名,类型为string。
int start_n:函数参数,表示删除范围的起始位置。
int end_n:函数参数,表示删除范围的结束位置。
(2)以读模式打开文件
ifstream infile(filename, ios::binary);
if (!infile) {
cerr << "无法打开文件: " << filename << endl;
return;
}
ifstream infile(filename, ios::binary):以二进制读模式打开名为filename的文件。
if (!infile):检查文件是否成功打开,如果失败则输出错误信息并返回。
(3)创建临时文件
ofstream outfile("temp.txt", ios::binary);
if (!outfile)
{
cerr << "无法创建临时文件" << endl;
infile.close();
return;
}
ofstream outfile(“temp.txt”, ios::binary):以二进制写模式创建名为"temp.txt"的临时文件。
if (!outfile):检查临时文件是否成功创建,如果失败则输出错误信息并关闭已打开的文件。
(4)判断文件是否成功打开
if (infile.is_open())
infile.is_open():检查文件是否成功打开。
(5)获取文件大小
ifstream file_1(filename, ios::binary);
file_1.seekg(0, ios::end);
streampos fileSize = file_1.tellg();
ifstream file_1(filename, ios::binary):创建另一个ifstream对象file_1,以二进制模式打开文件。
file_1.seekg(0, ios::end):将文件指针移动到文件末尾。
file_1.tellg():获取当前文件指针的位置,即文件大小。
streampos fileSize = file_1.tellg():将文件大小存储在fileSize变量中。
(6)检查删除范围
if ((start_n > end_n) || (start_n < 0) || (end_n > fileSize))
{
cerr << "无效的删除范围" << endl;
infile.close();
outfile.close();
return;
}
检查删除范围是否有效,如果无效则输出错误信息并关闭文件。
(7)从头开始获取文件内部数据
char data[1024], data_temp[1024];
int location = 0;
file_1.seekg(0, ios::beg);
infile.read(data, fileSize);
char data[1024], data_temp[1024]:定义两个字符数组,用于存储文件数据和临时数据。
int location = 0:定义一个变量用于记录临时数据的写入位置。
file_1.seekg(0, ios::beg):将文件指针移动到文件开头。
infile.read(data, fileSize):从文件中读取fileSize字节的数据,并存储到data数组中。
(8)处理数据并保存不需要删除的部分
for (int i = 0; i < fileSize; i++)
{
if ((i >= start_n) && (i <= end_n))
{
continue;
}
else
{
// 保存不需要被删除的文件
data_temp[location] = data[i];
location++;
}
}
遍历文件数据,将不需要删除的部分保存到data_temp数组中。
(9)将不需要删除的数据写入临时文件
outfile.write(data_temp, location);
outfile.write(data_temp, location):将data_temp数组中的数据写入临时文件。
(10)关闭文件
infile.close();
outfile.close();
关闭已打开的文件。
(11)删除原文件并重命名临时文件
if (remove(filename.c_str()) == 0)
{
cout << "\r\n删除文件成功!" << endl;
}
else
{
perror("\r\n文件删除失败\r\n"); // 输出详细的错误信息
}
if (rename("temp.txt", filename.c_str()) == 0)
{
cout << "重命名文件成功!" << endl;
}
else
{
perror("文件重命名失败"); // 输出详细的错误信息
}
remove(filename.c_str()):删除原文件。
rename(“temp.txt”, filename.c_str()):将临时文件重命名为原文件名。
(12)总结
这段代码定义了一个从指定文件中删除指定范围数据的函数。通过使用ifstream和ofstream类,可以方便地进行文件读写操作。函数首先以二进制模式打开文件,然后获取文件大小并检查删除范围是否有效。接着读取文件数据,将不需要删除的部分保存到临时文件中,最后删除原文件并用临时文件替换原文件。这个过程确保了文件操作的可靠性和安全性。
四、总结
至此,文章内容已经讲解完啦,如果有问题欢迎评论交流。
由于笔者是第一次创作,如有问题,欢迎大家批评指正!