C++的面向对象学习(9):文件操作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、类的封装的多文件实现回顾

假设我们有一个名为Person的类,它包含一个私有成员变量name和一个公共成员函数setName()和getName(),用于设置和获取name的值。我们将在Person.h文件中声明这个类,然后在Person.cpp文件中实现它。
重点:.h文件声明函数和变量。.c在类的作用域下实现函数定义

Person.h:

#ifndef PERSON_H
#define PERSON_H

#include <string>

class Person {
public:
    void setName(const string& name);
    std::string getName() const;

private:
    std::string name;
};

#endif

Person.cpp:

#include "Person.h"

void Person::setName(const string& name) {
    this->name = name;
}

string Person::getName() const {
    return name;
}

在上面的代码中,我们在Person.h文件中声明了Person类,并在Person.cpp文件中实现了它。注意,我们使用了头文件保护来防止多次包含同一个头文件。

现在,我们可以在另一个文件中使用Person类,只需要包含Person.h头文件即可。

main.cpp:

#include <iostream>
#include "Person.h"

int main() {
    Person person;
    person.setName("Tom");
    std::cout << "Name: " << person.getName() << std::endl;

    return 0;
}

在上面的代码中,我们包含了Person.h头文件,并创建了一个Person对象。然后,我们使用setName()函数设置name的值,并使用getName()函数获取它的值。

二、文件操作

程序运行时产生的数据是临时数据,我们想让数据持久化,就可以通过文件来实现。

1.对文件进行操作需要头文件

文件两种类型:
1.文本文件:ASCII码的形式存储
2.二进制文件:二进制形式存储,打开文件无法直接读懂

2.操作文件的三大类方法:读、写、读写

这里涉及到三个类:
读文件是指从文件中读取数据。可以使用ifstream类来读取文件。
写文件是指向文件中写入数据。可以使用ofstream类来写入文件。
读写文件是指同时读取和写入文件。可以使用fstream类来读写文件。

三、实现文本文件的读、写、读写

1.读操作

步骤如下:

①引入头文件:

#include <fstream>

②实例化一个ifstream类的对象

ifstream ifs;
ifs.open("文件路径", 打开方式);

③读数据:

#include <iostream>
#include <fstream>
#include <string>

int main() {
    ifstream rfile;
    rfile.open("example.txt");
    if (rfile.is_open()) {
        string line;
        while (getline(rfile, line)) {
            cout << line << endl;
        }
        rfile.close();
    }
    else {
        cout << "Unable to open file" << endl;
    }
    return 0;
}

使用ifstream类打开了一个名为example.txt的文件,并使用getline()函数逐行读取文件内容。如果文件打开成功,我们将逐行输出文件内容,否则输出错误消息。

2.写操作

步骤如下:

①引入头文件:

#include <fstream>

②实例化一个ofstream类的对象并打开指定的文件

ofstream ofs;
ofs.open("文件路径", 打开方式);

③往文件里面写数据:

ofs<<"要写入的数据";

④关闭文件

ofs.close();

全例:

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

int main() {
    ofstream wfile;
    wfile.open("example.txt",ios::out);
    if (wfile.is_open()) {
        wfile << "Hello, world!" << endl;
        wfile <<"666" endl;
        wfile.close();
    }
    else {
        cout << "Unable to open file" << endl;
    }
    return 0;
}

运行后,会在vs的同级目录下生成一个文件夹,并把写入的内容显示出来。
在这里插入图片描述

四、读写二进制文件

在C++中,可以使用fstream类来读写二进制文件。fstream类是一个通用的文件流类,可以用于读写文本文件、二进制文件等。

1.读取二进制文件

要读取二进制文件,可以使用ifstream类,它是fstream类的派生类,专门用于读取文件。以下是一个简单的读取二进制文件的示例:

#include <iostream>
#include <fstream>

int main() {
    ifstream file("example.bin", ios::binary);
    if (file.is_open()) {
        char buffer[100];
        file.read(buffer, sizeof(buffer));
        file.close();
    }
    else {
        cout << "Unable to open file" << endl;
    }
    return 0;
}

在上面的代码中,我们使用ifstream类打开了一个名为example.bin的二进制文件,并使用read()函数读取文件内容到一个字符数组中。如果文件打开成功,我们将读取文件内容,否则输出错误消息。

2.写入二进制文件

要写入二进制文件,我们可以使用ofstream类,它也是fstream类的派生类,专门用于写入文件。以下是一个简单的写入二进制文件的示例:

#include <iostream>
#include <fstream>

int main() {
    ofstream file("example.bin", ios::binary);
    if (file.is_open()) {
        char buffer[] = "Hello, world!";
        file.write(buffer, sizeof(buffer) - 1);
        file.close();
    }
    else {
        cout << "Unable to open file" << endl;
    }
    return 0;
}

在上面的代码中,我们使用ofstream类打开了一个名为example.bin的二进制文件,并使用write()函数将数据写入文件中。如果文件打开成功,我们将写入一段数据,否则输出错误消息。

五、常用的文件操作成员函数

在C++中,文件操作的fstream类提供了一些常用的成员函数,用于读写文件。以下是一些常用的成员函数:

open():打开文件。

void open(const char* filename, ios_base::openmode mode);

filename是要打开的文件名,mode是打开文件的模式,可以是ios::in(读取模式)、ios::out(写入模式)、ios::app(追加模式)、ios::binary(二进制模式)等。

close():关闭文件。
void close();

关闭当前打开的文件。

is_open():检查文件是否打开。
bool is_open();

返回一个布尔值,表示文件是否打开。

read():从文件中读取数据。
istream& read(char* buffer, streamsize count);

buffer是存储读取数据的缓冲区,count是要读取的字节数。该函数会从文件中读取指定字节数的数据,并将其存储到缓冲区中。

write():向文件中写入数据。
ostream& write(const char* buffer, streamsize count);

buffer是要写入的数据的缓冲区,count是要写入的字节数。该函数会将指定字节数的数据从缓冲区写入到文件中。

seekg():设置读取位置。
istream& seekg(streampos pos);
istream& seekg(streamoff offset, ios_base::seekdir dir);

pos是要设置的绝对位置,offset是要设置的相对位置的偏移量,dir是相对位置的方向(ios::beg表示从文件开头计算,ios::cur表示从当前位置计算,ios::end表示从文件末尾计算)。

seekp():设置写入位置。
ostream& seekp(streampos pos);
ostream& seekp(streamoff offset, ios_base::seekdir dir);

pos是要设置的绝对位置,offset是要设置的相对位置的偏移量,dir是相对位置的方向(ios::beg表示从文件开头计算,ios::cur表示从当前位置计算,ios::end表示从文件末尾计算)。

tellg():获取读取位置。
streampos tellg();

返回当前的读取位置。

tellp():获取写入位置。
streampos tellp();

返回当前的写入位置。

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值