程序产生的数据都属于临时数据,只有持久化到磁盘形成文件才能保存。
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对象的值被写入。所以读文件不光可以读出内容,还可以将其赋给对象,当然前提是对象按对应形式存储。
网友评论