美文网首页
19 文件操作

19 文件操作

作者: ca8519be679b | 来源:发表于2020-11-07 22:23 被阅读0次

    程序产生的数据都属于临时数据,只有持久化到磁盘形成文件才能保存。

    C++对文件操作需要包含include <fstream>

    文件类型分为2种:文本文件(已ascii码格式存储于计算机中),二进制文件(01进制文件保存,用户直接看不懂)

    文件流有3种,ofstream写操作(输出流),ifstream读操作(输入流),fstream可读写操作,注意别少了f否则和标准输出流搞混

    写文件

    步骤如下,导入头文件,创建文件输出流对象ostream ofs ,打开文件ofs.open(文件路径,打开方式),ofs<<重定向内容到输出流,最后ofs.close()关闭输出流节省资源

    1

    打开方式如上,我们可以选择读方式,写方式,追加,二进制等等,如果想使用二进制写入,就是符合方式,使用或逻辑连接,如 ofs.open("d:/test.bin",ios::out | ios::binary)

    2

    如上,我们就实现了一个文件的写入,当然我们要记住步骤,还有区分文件的打开方式。

    3

    当然我们想写入文件多行的时候还是要记得追加换行,如上。

    读文件

    也是5步,导入头文件,创建文件输入流对象,输入流ifs.open(文件路径,打开方式)并判断是否打开成功,读取数据(可以有4种方式读取),最后关闭输入流对象。

    4

    如上,我们尝试打开一个不存在的文件,先不读取,可以使用输入流的is_open()返回是否成功打开,否就输出失败。

    接下来我们讲解4种读取方式,方式1是创建char数组,使用循环读取

    5

    如上,while循环的条件是ifs往buf里写数据,底层是每次复写一行,然后循环到头就返回标志位提示文件读到头了,跳出循环。可以看到右侧输出结果

    方式2,也是使用char数组,读取时使用文件输入流的getline方法每次获取一行,同时还带使用char指针的功能。

    6

    如上,getline有2个参数,第一个是char *指针,我们正好使用数组名,第二个是指定字符长度,这里我们就默认使用sizeof(buf)即1024,读取效果是一样的

    方式3,使用字符串读取,导入string模块,自带全局函数getline,2个参数,分别是文件流和字符串对象,然后循环逐行读取

    7

    如上,效果是一样的。

    方式4 按字符逐个读取,直到判断读取到的是否为EOF文件结束标识。

    8

    如上,使用输入流的get方法,可以获取逐个字符,我们判断字符为EOF时,就停止循环,当然这里因为是字符,是可以输出换行的,而之前的getline的结果默认不包括换行

    二进制文件读写

    二进制的操作本质和前面一样,重点是读写方式,写的时候用的是输出流的write方法。

    9

    如上,这里需要注意的是,我们打开文件是可以在构造ofs对象时传入的,然后我们要使用write方法写入,write方法要求要2个参数,const char *指针和长度,这里长度我们就使用p的长度,结束后就实现了将Person实例p写入到了文件中,打开可以看到只有张三认识,其他都是乱码,因为是二进制写入。注意我们非二进制写入时是使用<<重定向。注意这里的类实例化使用了像结构体一样的赋值,虽然没有讲过,但也是可以的。

    上面完成了二进制的写入,写下来我们使用二进制的读取read方法,read方法的2个参数还是const char *指针,和长度,即按char类型逐字节读回来。

    10

    如上,我们使用read方法读,我们可以给一个对象的指针,一般转化为char *,因为我们是按char *去写的,我们将Person对象p的地址传给read第一个参数,同时将其强转,我们可以看到p对象的值被写入。所以读文件不光可以读出内容,还可以将其赋给对象,当然前提是对象按对应形式存储。

    相关文章

      网友评论

          本文标题:19 文件操作

          本文链接:https://www.haomeiwen.com/subject/qfifbktx.html