【C++核心编程-11】----C++之文件操作实战

🎩 欢迎来到技术探索的奇幻世界👨‍💻

📜 个人主页@一伦明悦-CSDN博客

✍🏻 作者简介: C++软件开发、Python机器学习爱好者

🗣️ 互动与支持:💬评论      👍🏻点赞      📂收藏     👀关注+

如果文章有所帮助,欢迎留下您宝贵的评论,点赞加收藏支持我,点击关注,一起进步!

目录

前言             

正文

01-文件操作简介             

    (1)文本文件操作

    (2)二进制文件操作

02-文本文件简介             

     (1)写文本文件

     (2)读文本文件

​ 03-二进制文件简介             

     (1)写二进制文件

     (2)读二进制文件

总结           


前言             

        在C++中,文件操作是一种重要的功能,它使程序能够读取和写入外部文件,从而实现数据的持久化存储和共享。以下是文件操作的几个重要作用:

         数据存储和检索: 文件操作允许程序将数据存储在文件中,以便在程序退出后仍然保留。这样可以实现数据的持久化,使得数据可以长期保存,并且可以在需要时重新加载到程序中。

        数据共享: 文件操作使得数据可以在不同的程序之间进行共享。一个程序可以将数据写入文件,而另一个程序可以从同一文件中读取相同的数据,从而实现数据的传递和共享。

        配置文件和日志记录: 文件操作常用于创建和读取配置文件,这些文件包含了程序的各种设置和参数。同时,文件操作还可用于记录程序的运行日志,以便在需要时进行故障排除和调试。                

        数据备份和恢复: 通过文件操作,程序可以定期将数据写入文件作为备份,以防止数据丢失或损坏。在需要时,可以使用这些备份文件来恢复数据。

        外部数据处理: 文件操作允许程序处理外部文件中的数据,这些文件可能是由其他程序生成的,或者是用户提供的。这样可以实现数据的导入、导出和转换,以满足不同的需求和格式要求。        

        总的来说,文件操作是C++编程中的重要部分,它提供了一种灵活的方式来处理数据,并且可以与其他程序和系统进行交互,从而实现更广泛的功能和应用。 

正文

01-文件操作简介             

        在C++中,文件操作是通过标准库中的 <fstream> 头文件来实现的。文件操作可以分为两种类型:文本文件和二进制文件。文本文件是由字符组成的文件,可以使用文本编辑器打开和编辑,而二进制文件是由字节组成的文件,不能直接使用文本编辑器打开。

        对于文件操作,主要有三大类操作:输入、输出和定位。下面将详细介绍这三大类操作在文本文件和二进制文件中的应用。

     (1)文本文件操作

        输入操作(ifstream): 用于从文本文件中读取数据。通过创建 ifstream 对象并打开文件,然后使用输入运算符 >> 从文件中读取数据。代码如下:

#include <fstream>
#include <iostream>
using namespace std;

int main() {
    ifstream inFile("example.txt"); // 打开文件
    int num;
    inFile >> num; // 从文件中读取数据
    cout << "Number read from file: " << num << endl;
    inFile.close(); // 关闭文件
    return 0;
}

        输出操作(ofstream): 用于向文本文件中写入数据。通过创建 ofstream 对象并打开文件,然后使用输出运算符 << 向文件中写入数据。 代码如下:

#include <fstream>
using namespace std;

int main() {
    ofstream outFile("example.txt"); // 打开文件
    outFile << "Hello, World!"; // 向文件中写入数据
    outFile.close(); // 关闭文件
    return 0;
}

        定位操作: 对于文本文件,可以使用 seekg() 和 tellg() 函数来定位和获取当前文件指针的位置。 代码如下:

inFile.seekg(0, ios::beg); // 将文件指针移动到文件开头
int pos = inFile.tellg(); // 获取当前文件指针的位置

        (2)二进制文件操作

        输入操作(ifstream): 与文本文件操作类似,但需要使用 read() 函数来读取二进制数据。 代码如下:

#include <fstream>
#include <iostream>
using namespace std;

int main() {
    ifstream inFile("example.bin", ios::binary); // 打开二进制文件
    int num;
    inFile.read(reinterpret_cast<char*>(&num), sizeof(int)); // 读取二进制数据
    cout << "Number read from binary file: " << num << endl;
    inFile.close(); // 关闭文件
    return 0;
}

        输出操作(ofstream): 与文本文件操作类似,但需要使用 write() 函数来写入二进制数据。 代码如下:

#include <fstream>
using namespace std;

int main() {
    ofstream outFile("example.bin", ios::binary); // 打开二进制文件
    int num = 10;
    outFile.write(reinterpret_cast<char*>(&num), sizeof(int)); // 写入二进制数据
    outFile.close(); // 关闭文件
    return 0;
}

        定位操作: 与文本文件操作类似,但使用的是 seekg() 和 tellg() 函数。 代码如下:

inFile.seekg(0, ios::beg); // 将文件指针移动到文件开头
int pos = inFile.tellg(); // 获取当前文件指针的位置

02-文本文件简介             

        文本文件是由字符组成的文件,可以使用文本编辑器打开和编辑。在C++中,文本文件通常用于存储和处理以文本形式表示的数据。与二进制文件相比,文本文件更易于理解和处理,但在存储大量数据时可能会占用更多的空间。

        一些常见的文本文件包括:

        纯文本文件: 只包含基本的文本内容,如.txt文件。

        配置文件: 存储程序的各种设置和参数,通常采用特定的格式,如.ini文件。

        日志文件: 记录程序运行时的各种信息和事件,方便后续排查和分析,如.log文件。

        源代码文件: 包含程序源代码的文件,如.cpp、.h文件等。

        在C++中,可以使用输入流和输出流来读取和写入文本文件。读取文本文件时,通常会逐行读取文件内容,并将其解析为程序可以理解的数据格式。而写入文本文件时,则将数据按照一定的格式输出到文件中,以便其他程序或用户可以读取和理解。

        总的来说,文本文件在C++编程中具有广泛的应用,是一种常见且易于处理的数据存储和交换格式。

     (1)写文本文件

        写文本文件是指将程序中的数据写入到文本文件中,以便长期保存或与其他程序共享。在C++中,可以使用输出流(ofstream)来实现写文本文件的操作。下面是对写文本文件的详细解释以及具体代码分析:

        打开文件: 首先,需要创建一个输出流对象并打开目标文件。可以使用ofstream类的构造函数来创建输出流对象,并指定文件名和打开模式。例如,ofstream outFile("example.txt"); 将创建一个名为example.txt的文件,并以写入模式打开它。

        检查文件是否成功打开: 在尝试写入文件之前,应该检查文件是否成功打开。可以使用成员函数is_open()来检查文件是否已成功打开。如果文件成功打开,则可以开始写入数据;如果打开失败,则可能是由于文件路径错误或者权限问题。

        写入数据: 使用输出流对象的插入运算符(<<)将数据写入到文件中。可以将各种数据类型(如字符串、数字等)直接写入文件中。例如,outFile << "Hello, World!" << endl; 将字符串"Hello, World!"写入到文件中,并在末尾添加一个换行符。

        关闭文件: 在写入完所有数据后,应该关闭文件以释放资源并确保数据被正确写入到文件中。可以使用成员函数close()来关闭文件。在关闭文件之前,务必检查文件是否成功打开,以避免关闭一个未成功打开的文件。

        下面是一个示例代码,演示了如何写入文本文件并进行错误处理:在这个示例中,程序尝试打开名为example.txt的文件,并将两行文本写入到文件中。如果文件成功打开,则会输出"Text file written successfully.“;否则,会输出"Unable to open file.” 表示文件打开失败。   

#include <fstream>
#include <iostream>
using namespace std;

int main() {
    ofstream outFile("example.txt"); // 打开文本文件
    if (outFile.is_open()) { // 检查文件是否成功打开
        outFile << "Hello, World!" << endl; // 写入数据到文件
        outFile << "This is a text file." << endl;
        outFile.close(); // 关闭文件
        cout << "Text file written successfully." << endl;
    } else {
        cout << "Unable to open file." << endl; // 打开文件失败
    }
    return 0;
}

         下面给出具体代码分析应用过程:这段代码演示了如何使用C++中的ofstream类来写入文本文件。这里简要分析一下:

        包含头文件: 使用了iostream和fstream头文件,iostream用于输入输出流,fstream用于文件操作。

        创建流对象: 创建了一个ofstream对象ofs,用于写入文件。

        打开文件: 使用open()函数打开文件,参数为文件名和打开方式。这里使用了ios::out打开方式,表示以写入模式打开文件。如果文件不存在,则创建新文件;如果文件已存在,则清空文件内容。

        写入内容: 使用流对象ofs的插入运算符(<<)将数据写入到文件中。这里写入了字符串"姓名: 张三"并在末尾添加了换行符endl。

        关闭文件: 使用close()函数关闭文件,释放资源。

#include <iostream>
using namespace std;
#include<fstream>

// 文本文件  写文件

void test01()
{
	// 1、包含头文件 fstream

    // 2、创建流对象
	ofstream ofs;
	// 3、打开方式
	ofs.open("test.txt", ios::out); // out 打开时候写入文件  不指定路径,生成在项目同级目录

	// 4、写入内容
	ofs << "姓名: 张三" << endl;

	// 5、关闭
	ofs.close();
}


int main()
{

	test01();


	system("pause");
	return 0;

        得到的文本文件如下图所示:

 

        (2)读文本文件

      读取文本文件是指将文本文件中的内容读取到程序中,以便进行处理或显示。在C++中,可以使用输入流(ifstream)来实现读取文本文件的操作。下面是对读取文本文件的详细解释以及具体代码分析:

        打开文件: 首先,需要创建一个输入流对象并打开源文件。可以使用ifstream类的构造函数来创建输入流对象,并指定文件名和打开模式。例如,ifstream inFile("example.txt"); 将创建一个名为example.txt的文件,并以读取模式打开它。

        检查文件是否成功打开: 在尝试读取文件之前,应该检查文件是否成功打开。可以使用成员函数is_open()来检查文件是否已成功打开。如果文件成功打开,则可以开始读取数据;如果打开失败,则可能是由于文件路径错误或者权限问题。

        读取数据: 使用输入流对象的getline()函数或者其他读取函数来从文件中读取数据。getline()函数用于逐行读取文件内容,并将每行内容存储到一个字符串中。可以根据需要选择读取方式,比如按行读取或按字符读取。

        关闭文件: 在读取完所有数据后,应该关闭文件以释放资源。可以使用成员函数close()来关闭文件。

        下面是一个示例代码,演示了如何读取文本文件并进行错误处理:在这个示例中,程序尝试打开名为example.txt的文件,并将文件内容逐行读取并输出。如果文件成功打开,则会输出"File read successfully.“;否则,会输出"Unable to open file.” 表示文件打开失败。

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

void readFile(const string& filename) {
    ifstream inFile(filename); // 打开文本文件
    if (inFile.is_open()) { // 检查文件是否成功打开
        string line;
        while (getline(inFile, line)) { // 逐行读取文件内容
            cout << line << endl; // 输出每一行内容
        }
        inFile.close(); // 关闭文件
        cout << "File read successfully." << endl;
    } else {
        cout << "Unable to open file." << endl; // 打开文件失败
    }
}

int main() {
    readFile("example.txt"); // 读取名为example.txt的文件
    return 0;
}

        下面给出具体代码分析应用过程:这段代码演示了如何使用C++中的ifstream类来读取文本文件。以下是简要分析:

        包含头文件: 使用了iostream和fstream头文件,iostream用于输入输出流,fstream用于文件操作。

        创建流对象: 创建了一个ifstream对象ifs,用于读取文件。

        打开文件: 使用open()函数打开文件,参数为文件名和打开方式。这里使用了ios::in打开方式,表示以读取模式打开文件。

        检查文件是否成功打开: 使用is_open()函数检查文件是否成功打开,如果打开失败,则输出"文件打开失败"并返回。

        读取内容方式: 使用while循环结合输入运算符(>>)从文件中逐行读取内容,并将读取的内容输出到控制台。

        关闭文件: 使用close()函数关闭文件,释放资源。

#include <iostream>
using namespace std;
#include<fstream>

// 文本文件  写文件

void test01()
{
	// 1、包含头文件 fstream

	// 2、创建流对象
	ifstream ifs;
	// 3、打开方式
	ifs.open("test.txt", ios::in); // in 打开时候读文件
	// 判断打开  ifs.is_open() 返回的是一个布尔值
	if (!ifs.is_open())
	{
		cout << "文件打开失败" << endl;
		return;
	}
	// 4、读取内容方式
	// 1、
	char buf[1024] = { 0 };
	while (ifs>>buf)
	{
		cout << buf << endl;
	}

	// 5、关闭
	ifs.close();
}


int main()
{

	test01();
	system("pause");
	return 0;
}

        运行结果如下图所示:

 03-二进制文件简介             

        二进制文件是一种以二进制形式存储数据的文件,与文本文件相比,它们不使用可打印字符来表示数据,而是使用字节的二进制形式来存储。这意味着二进制文件可以存储任意类型的数据,包括文本、图像、音频、视频等。二进制文件通常以其特定的格式存储数据,这些格式可能是由特定的应用程序或标准定义的。

        相对于文本文件,二进制文件的优点是:

        a、可以存储任意类型的数据,包括非文本数据。

        b、通常比文本文件更加紧凑,因为它们不需要使用可打印字符来表示数据。

        二进制文件的一些常见用途包括:

        a、存储和读取程序状态或配置信息。

        b、存储和传输多媒体数据,如图像、音频和视频文件。

        c、存储和交换复杂的数据结构,如数据库文件或网络数据包。

        在C++中,可以使用文件流类(如ifstream和ofstream)来读写二进制文件。与文本文件不同,读写二进制文件时需要注意数据的二进制表示形式,以确保数据的正确性和完整性。二进制文件的格式通常由程序开发者自行定义,并且读写时需要严格按照定义的格式进行操作。

     (1)写二进制文件

        写入二进制文件是指将数据以二进制形式写入文件。在C++中,可以使用输出流(ofstream)来实现将数据写入二进制文件的操作。以下是写入二进制文件的详细解释以及具体代码分析:

        打开文件: 首先,需要创建一个输出流对象并打开目标二进制文件。可以使用ofstream类的构造函数来创建输出流对象,并指定文件名以及打开模式。例如,ofstream outFile("example.bin", ios::binary); 将创建一个名为example.bin的二进制文件,并以二进制写入模式打开它。

        将数据写入文件: 使用输出流对象的write()函数来将数据写入二进制文件。write()函数需要传入要写入的数据的地址和字节数。可以将各种数据类型(如整数、浮点数、结构体等)转换为char*类型,然后使用write()函数将其写入文件。

        关闭文件: 在写入完所有数据后,应该关闭文件以释放资源。可以使用成员函数close()来关闭文件。

        下面是一个示例代码,演示了如何将数据以二进制形式写入文件:在这个示例中,程序将两个Data结构体对象以二进制形式写入到名为example.bin的文件中。需要注意的是,在写入和读取二进制文件时,必顿时保持数据的二进制表示形式的一致性,以确保正确地读写数据。

#include <fstream>
#include <iostream>
using namespace std;

struct Data {
    int id;
    float value;
};

void writeBinaryFile(const string& filename) {
    ofstream outFile(filename, ios::binary); // 打开二进制文件
    if (outFile.is_open()) { // 检查文件是否成功打开
        Data data1 = {1, 3.14};
        Data data2 = {2, 2.718};

        outFile.write(reinterpret_cast<char*>(&data1), sizeof(Data)); // 将data1写入文件
        outFile.write(reinterpret_cast<char*>(&data2), sizeof(Data)); // 将data2写入文件

        outFile.close(); // 关闭文件
        cout << "Binary file written successfully." << endl;
    } else {
        cout << "Unable to open file." << endl; // 打开文件失败
    }
}

int main() {
    writeBinaryFile("example.bin"); // 写入到名为example.bin的二进制文件
    return 0;
}

         (2)读二进制文件

        读取二进制文件是指从二进制文件中读取数据。在C++中,可以使用输入流(ifstream)来实现从二进制文件中读取数据的操作。以下是读取二进制文件的详细解释以及具体代码分析:

        打开文件: 首先,需要创建一个输入流对象并打开目标二进制文件。可以使用ifstream类的构造函数来创建输入流对象,并指定文件名以及打开模式。例如,ifstream inFile("example.bin", ios::binary); 将创建一个名为example.bin的二进制文件,并以二进制读取模式打开它。

        读取数据: 使用输入流对象的read()函数来从二进制文件中读取数据。read()函数需要传入一个缓冲区的地址以及要读取的字节数。可以使用char数组作为缓冲区,并指定读取的字节数。

        处理读取的数据: 一旦数据被读取到缓冲区中,可以根据数据的类型进行相应的处理。如果读取的是基本数据类型(如整数、浮点数),可以直接将缓冲区中的数据转换为相应的类型。如果读取的是自定义类型(如结构体),则需要使用reinterpret_cast将缓冲区中的数据转换为相应的类型。

  1. 关闭文件: 在读取完所有数据后,应该关闭文件以释放资源。可以使用成员函数close()来关闭文件。

        下面是一个示例代码,演示了如何从二进制文件中读取数据:在这个示例中,程序从名为example.bin的二进制文件中读取了两个Data结构体对象的数据,并将其打印到控制台上。需要注意的是,读取和写入二进制文件时必须保持数据的二进制表示形式的一致性,以确保正确地读写数据。

#include <fstream>
#include <iostream>
using namespace std;

struct Data {
    int id;
    float value;
};

void readBinaryFile(const string& filename) {
    ifstream inFile(filename, ios::binary); // 打开二进制文件
    if (inFile.is_open()) { // 检查文件是否成功打开
        Data data1, data2;

        inFile.read(reinterpret_cast<char*>(&data1), sizeof(Data)); // 从文件中读取data1
        inFile.read(reinterpret_cast<char*>(&data2), sizeof(Data)); // 从文件中读取data2

        cout << "Data 1: id = " << data1.id << ", value = " << data1.value << endl;
        cout << "Data 2: id = " << data2.id << ", value = " << data2.value << endl;

        inFile.close(); // 关闭文件
        cout << "Binary file read successfully." << endl;
    } else {
        cout << "Unable to open file." << endl; // 打开文件失败
    }
}

int main() {
    readBinaryFile("example.bin"); // 从名为example.bin的二进制文件中读取数据
    return 0;
}

总结           

        读写文本文件和二进制文件都是常见的文件操作,它们有着不同的特点和适用场景:

        读写文本文件:

        a、文本文件以可打印字符的形式存储数据,易于人类阅读和编辑。

        b、文本文件通常用于存储文本数据,如配置文件、日志文件等。

        c、在C++中,可以使用ifstream和ofstream类来读写文本文件。

        d、读写文本文件时,数据以字符串的形式存储和处理,操作相对简单。

        读写二进制文件:

        a、二进制文件以字节的二进制形式存储数据,不直接可读,适用于存储非文本数据,如图像、音频、视频等。

        b、二进制文件通常比文本文件更加紧凑,因为它们不需要使用可打印字符来表示数据。

        c、在C++中,可以使用ifstream和ofstream类来读写二进制文件,需要以二进制模式打开文件。

        d、读写二进制文件时,需要严格保持数据的二进制表示形式的一致性,以确保正确地读写数据。

        总的来说,选择读写文本文件还是二进制文件取决于所处理的数据类型和需求。如果数据是文本形式且需要人类可读,通常使用文本文件;如果数据是非文本形式或需要更高效地存储,可以选择二进制文件。

  • 40
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 27
    评论
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一伦明悦

感谢,您的支持是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值