0


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

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

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

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

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

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

**前言 **

** **在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、读写二进制文件时,需要严格保持数据的二进制表示形式的一致性,以确保正确地读写数据。**

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

本文转载自: https://blog.csdn.net/m0_59951855/article/details/139044215
版权归原作者 一伦明悦 所有, 如有侵权,请联系我们删除。

“【C++核心编程-11】----C++之文件操作实战”的评论:

还没有评论