[C++]关于数据永久化的思考(不使用数据库)

本文探讨了如何在不使用数据库的情况下实现数据永久化,主要介绍了C++中的文件操作和JSON使用。文件操作涉及打开、读写文件及文件状态标志验证,而JSON能方便地存储大量关联信息,提供了一种模拟数据库的方式。
摘要由CSDN通过智能技术生成

关于数据永久化的思考(不使用数据库)

==数据永久化==是一个程序很重要的特性。我们知道使用数据库肯定可以实现数据永久化,但对于新手而言,比较艰难。本文讨论的是,如何不使用数据库来完成数据的保存。主要提供两种方法,一种是使用纯粹的文件读写,另一种使用json。首先,我们先来复习一下文件操作的基本信息。

C++文件操作

文件指存放在外部介质上的数据的集合。大家都知道操作系统是以文件为单位来对数据进行管理的。因此如果你要查找外部介质的数据,则先要按文件名找到指定文件,然后再从文件中读取数据,如果要把数据存入外部介质中,如果没有该文件,则先要建立文件,再向它输入数据。由于文件的内容千变万化,大小各不相同,为了统一处理,在C++中用文件流的形式来处理,文件流是以外存文件为输入输出对象的数据流。输出文件流表示从内存流向外存文件的数据,输入文件流则相反。根据文件中数据的组织形式,文件可分为两类:文本文件和二进制文件。文本文件又称为ASCII文件,它的每个字节存放一个ASCII码,代表一个字符。二进制文件则是把内存中的数据,按照其在内存中的存储形式原样写在磁盘上存放。比如一个整数20000,在内存中在两个字节,而按文本形式输出则占5个字节。因此在以文本形式输出时,一个字节对应一个字符,因而便于字符的输出,缺点则是占用存储空间较多。用二进制形式输出数据,节省了转化时间和存储空间,但不能直接以字符的形式输出。

1. 打开文件

在C++中对文件进行操作分为以下几个步骤:

  • (1)建立文件流对象;
    (2)打开或建立文件;
  • (3)进行读写操作;
    (4)关闭文件;

用于文件IO操作的流类主要有三个

  • fstream(输入输出文件流)
  • ifstream(输入文件流)
  • ofstream(输出文件流);

而这三个类都包含在头文件==fstream==中,所以程序中对文件进行操作必须包含该头文件。首先建立流对象,然后使用文件流类的成员函数open打开文件,即把文件流对象和指定的磁盘文件建立关联。成员函数open的一般形式为:

文件流对象.open(文件名,使用方式);

其中文件名可以包括路径(如:e:\c++\file.txt),如果缺少路径,则默认为当前目录。使用方式则是指文件将被如何打开。以下就是文件的部分使用方式,都是ios基类中的枚举类型的值:

此外打开方式有几个注意点:

  • (1)因为nocreate和noreplace,与系统平台相关密切,所以在C++标准中去掉了对它的支持。
  • (2)每一个打开的文件都有一个文件指针,指针的开始位置由打开方式指定,每次读写都从文件指针的当前位置开始。每读一个字节,指针就后移一个字节。当文件指针移到最后,会遇到文件结束符EOF,此时流对象的成员函数eof的值为非0值,表示文件结束。
  • (3)用in方式打开文件只能用于输入数据,而且该文件必须已经存在。
  • (4)用app方式打开文件,此时文件必须存在,打开时文件指针处于末尾,且该方式只能用于输出。
  • (5)用ate方式打开一个已存在的文件,文件指针自动移到文件末尾,数据可以写入到其中。

如果文件需要用两种或多种方式打开,则用”|”来分隔组合在一起。除了用open成员函数打开文件,还可以用文件流类的构造函数来打开文件,其参数和默认值与open函数完全相同。比如:文件流类 stream(文件名,使用方法);如果文件打开操作失败,open函数的返回值为0,用构造函数打开的话,流对象的值为0。所以无论用哪一种方式打开文件,都需要在程序中测试文件是否成功打开。

在每次对文件IO操作结束后,都需要把文件关闭,那么就需要用到文件流类的成员函数close,一般调用形式:流对象.close();关闭实际上就是文件流对象和磁盘文件失去关联。

2. 文件的读写

我将分别从文本文件读写和二进制文件的读写来介绍。其实文件的读写是十分容易的。流类库中的IO操作==<<、>>、put、get、getline、read和write==都可以用于文件的输入输出。

写文件:
#include <iostream>
#include <fstream>

using namespace std;
int main(int argc, const char * argv[]) {
    fstream File("/Users/yanzexin/Desktop/programming code/file_operation/input.txt", ios::app);
    if (File.is_open()) {
        char str[100];
        cin.getline(str, 100);
        File.write(str, sizeof(str));
        File.write("\n", 1);
    }
    File.close();
    return 0;
}
读文件:
#include <iostream>
#include <fstream>

using namespace std;
int main(int argc, const char * argv[]) {
    fstream File(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值