C++ 文件操作实战:文本文件与二进制文件的读写

C++ 文件操作实战:文本文件与二进制文件的读写

在C++编程中,文件操作是一项非常重要的技能,无论是处理用户数据、配置文件还是日志记录,都离不开对文件的读写操作。本文将通过一个实际的项目案例,详细介绍C++中如何实现文本文件和二进制文件的读写操作。我们将从代码实现的角度,逐步解析每一个功能模块的设计思路和实现细节。

项目背景

在实际开发中,我们经常需要对文件进行读写操作。文本文件通常用于存储可读的文本数据,如日志、配置文件等;而二进制文件则用于存储结构化的数据,如程序的配置信息、用户数据等。本文的项目将展示如何通过C++实现以下功能:

  1. 写入文本文件:将一些基本信息写入文本文件。

  2. 读取文本文件:以多种方式读取文本文件的内容。

  3. 写入二进制文件:将结构化的数据以二进制形式写入文件。

  4. 读取二进制文件:从二进制文件中读取数据并还原为原始结构。

项目结构

本项目包含以下几个文件:

  • me.h:头文件,声明了各个功能函数。

  • main.cpp:主程序文件,调用各个功能函数。

  • 写文本文件.cpp:实现文本文件的写入功能。

  • 读文本文件.cpp:实现文本文件的读取功能。

  • 写二进制文件.cpp:实现二进制文件的写入功能。

  • 读二进制文件.cpp:实现二进制文件的读取功能。

1. 写入文本文件

实现代码 (写文本文件.cpp)

cpp复制

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

void test1()
{
    ofstream ofs; // 创建写文件类
    ofs.open("test.txt", ios::out); // 打开文件,指定为文本写入模式
    ofs << "姓名:张三" << endl; // 写入文本内容
    ofs << "性别:未知" << endl;
    ofs << "年龄:未知" << endl;
    ofs.close(); // 关闭文件
}

功能解析

  • 使用ofstream类创建一个文件输出流对象ofs

  • 调用open方法打开文件,指定文件名和打开模式(ios::out表示文本写入模式)。

  • 使用<<运算符将字符串写入文件。

  • 调用close方法关闭文件,确保数据被正确写入并释放资源。

2. 读取文本文件

实现代码 (读文本文件.cpp)

cpp复制

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

void test2(int a)
{
    ifstream ifs; // 创建文件输入流对象
    ifs.open("test.txt", ios::in); // 打开文件,指定为文本读取模式
    if (!ifs.is_open()) // 判断文件是否成功打开
    {
        cout << "打开失败" << endl;
        return;
    }

    switch (a)
    {
        case 1: // 单字符读入
        {
            cout << "读文件方式1:单字符读入" << endl;
            char c = '0';
            while ((c = ifs.get()) != EOF) // 使用get方法逐字符读取
            {
                cout << c;
            }
            break;
        }
        case 2: // 单字符写入buf
        {
            cout << "读文件方式2:单字符写入buf" << endl;
            char buf[1024] = {0};
            while (ifs >> buf) // 使用>>运算符读取单词
            {
                cout << buf << endl;
            }
            break;
        }
        case 3: // 单行写入buf
        {
            cout << "读文件方式3:单行写入buf,语法1,推荐使用" << endl;
            char buf[1024] = {0};
            while (ifs.getline(buf, sizeof(buf))) // 使用getline方法读取整行
            {
                cout << buf << endl;
            }
            break;
        }
        case 4: // 单行写入buf,语法2
        {
            cout << "读文件方式4:单行写入buf,语法2" << endl;
            string buf;
            while (getline(ifs, buf)) // 使用getline方法读取整行
            {
                cout << buf << endl;
            }
            break;
        }
        default:
            cout << "输入错误" << endl;
            break;
    }
    ifs.close(); // 关闭文件
}

功能解析

  • 使用ifstream类创建一个文件输入流对象ifs

  • 调用open方法打开文件,指定文件名和打开模式(ios::in表示文本读取模式)。

  • 根据传入的参数a,选择不同的读取方式:

    • 单字符读入:使用get方法逐字符读取。

    • 单字符写入buf:使用>>运算符读取单词。

    • 单行写入buf:使用getline方法读取整行。

    • 单行写入buf(语法2):使用getline方法读取整行,使用string类型作为缓冲区。

  • 调用close方法关闭文件,确保资源被正确释放。

3. 写入二进制文件

实现代码 (写二进制文件.cpp)

cpp复制

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

class my_class
{
public:
    char m_a[64]; // 使用C的char数组存储字符串
    int m_b;
};

void test3()
{
    ofstream ofs; // 创建文件输出流对象
    ofs.open("my_class.txt", ios::out | ios::binary); // 打开文件,指定为二进制写入模式
    my_class m1 = {"张三", 100}; // 初始化对象
    ofs.write((const char*)&m1, sizeof(m1)); // 使用write方法写入二进制数据
    ofs.close(); // 关闭文件
}

功能解析

  • 定义一个my_class类,包含一个字符数组m_a和一个整数m_b

  • 使用ofstream类创建一个文件输出流对象ofs

  • 调用open方法打开文件,指定文件名和打开模式(ios::out | ios::binary表示二进制写入模式)。

  • 使用write方法将对象m1的二进制数据写入文件。write方法的第一个参数是数据的地址,第二个参数是数据的大小。

  • 调用close方法关闭文件,确保数据被正确写入并释放资源。

4. 读取二进制文件

实现代码 (读二进制文件.cpp)

cpp复制

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

class my_class
{
public:
    char m_a[64];
    int m_b;
};

void test4()
{
    ifstream ifs; // 创建文件输入流对象
    ifs.open("my_class.txt", ios::in | ios::binary); // 打开文件,指定为二进制读取模式
    if (!ifs.is_open()) // 判断文件是否成功打开
    {
        cout << "打开失败" << endl;
        return;
    }
    my_class m1 = {"0", 0}; // 初始化对象
    ifs.read((char*)&m1, sizeof(m1)); // 使用read方法读取二进制数据
    cout << m1.m_a << endl << m1.m_b << endl; // 输出读取到的数据
    ifs.close(); // 关闭文件
}

功能解析

  • 使用ifstream类创建一个文件输入流对象ifs

  • 调用open方法打开文件,指定文件名和打开模式(ios::in | ios::binary表示二进制读取模式)。

  • 使用read方法将文件中的二进制数据读取到对象m1中。read方法的第一个参数是目标地址,第二个参数是数据的大小。

  • 输出读取到的数据,验证读取是否成功。

  • 调用close方法关闭文件,确保资源被正确释放。

总结

通过上述代码实现,我们详细介绍了C++中如何实现文本文件和二进制文件的读写操作。文本文件的读写操作相对简单,主要使用ofstreamifstream类,结合<<>>运算符以及getline方法。二进制文件的读写操作则需要使用writeread方法,并确保数据的大小和地址正确。

在实际开发中,选择文本文件还是二进制文件取决于具体需求。文本文件适合存储可读的文本数据,便于调试和查看;二进制文件则适合存储结构化的数据,读写效率更高,但可读性较差。希望本文的介绍能帮助你更好地理解和掌握C++文件操作的技巧。

如果你对本文的内容有任何疑问或建议,欢迎在评论区留言,我们一起交流学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值