C++创建文件&&写入数据&&读取数据&&删除数据)

前言

在C++中进行文件读写操作通常使用标准库中的头文件。这个头文件提供了三个主要的类:<ifstream>(用于读取文件)、<ofstream>(用于写入文件)和<fstream>(用于读写文件),详情如下所示:

数据类型描述
ofstream该数据类型表示输出文件流,用于创建文件并向文件写入信息。
ifstream该数据类型表示表示文件流,用于从文件读取信息。
fstream该数据类型通常表示文件流,且同时具有ofstream和ifstream两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。

要在C++中矩形文件的操作时,必须在C++源代码文件中包含头文件<iostream>和<fstream>。

一、创建文件&&向文件写入数据

  1. 代码
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. 代码详情解析

(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对象,然后使用传入的文件名以追加模式打开文件。接着检查文件是否成功打开,如果失败则输出错误信息并返回。如果文件成功打开,则将传入的数据写入文件,最后关闭文件。这个过程确保了文件操作的可靠性和安全性。

二、读取文件数据

  1. 代码
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. 代码详情解析

(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类,可以方便地进行文件读操作。函数首先以二进制读模式打开文件,然后获取文件大小,并将文件内容读取到传入的缓冲区中,最后关闭文件。这个过程确保了文件操作的可靠性和安全性。如果文件打开失败,函数会输出错误信息。

三、删除文件数据

  1. 代码
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. 代码详情解析

(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类,可以方便地进行文件读写操作。函数首先以二进制模式打开文件,然后获取文件大小并检查删除范围是否有效。接着读取文件数据,将不需要删除的部分保存到临时文件中,最后删除原文件并用临时文件替换原文件。这个过程确保了文件操作的可靠性和安全性。

四、总结

至此,文章内容已经讲解完啦,如果有问题欢迎评论交流。
由于笔者是第一次创作,如有问题,欢迎大家批评指正!

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值