<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg>
讯享网
- 在C++中,文件操作属于技术的应用,不是基本语法。
- 数据持久化的两种方式:文件和数据库。

讯享网
文本文件一般以行的形式组织数据。
包含头文件:
类:
示例:
讯享网

对于open()成员函数的参数,可以用C风格的字符串,也可以用string.
如果要指定目录的话:
讯享网
一般文件名要全路径,书写的方法如下:
- 错误。
- 原始字面量,C++11标准。
- 转义字符。
- 把斜线反着写。
- Linux系统采用的方法。
创建文件输出流对象,打开文件,如果文件不存在,则创建它。
讯享网
这里有三种方法:
- 第一种
- 第二种第二个参数是最多读取内容的字节数
讯享网
- 第三个
讯享网
首先我们先看看数据在内存中的分配

对于第一个string类型的。每个字节存放一个字符,字符在内存中存放的是码,不是符号。
对于第二个int类型的。如果是整数变量存放,那么它就是二进制数据,或者二进制格式。
文件操作
- 写文件:把内存中的数据转移到磁盘文件中。
- 读文件:把磁盘文件中的数据转移到内存中。
- 内存和硬盘都是存储设备,本质上没有区别。
文本文件和二进制文件
- 文本文件:存放的是字符串,以行的方式组织数据,每个字节都是有意义的符号。
- 二进制文件:存放的不一定是字符串,以数据类型组织数据,内容要作为一个整体来考虑,单个字节没有意义。
二进制文件以数据块的形式组织数据,把内存中的数据直接写入文件。
包含头文件:
类:
打开文件的模式(方式):
对于,不管用哪种模式打开文件,如果文件不存在,都会创建文件。
ios:out 缺省值:会截断文件内容。
ios:trunc 截断文件内容。(truncate)
ios:app 不截断文件内容,只在文件未尾追加文件。(append)
ios::binary 以二进制的方式打开文件
文本和二进制方式的区别:

- 在windows平台下,文本文件的换行标志是。
- 在windows平台下,如果以文本方式打开文件,写入数据的时候,系统会将转换成;读取数据的时候,系统会将转换成。如果以二进制方式打开文件,写和读都不会进行转换。

二进制文件的格式
- 二进制文件的格式多样,由业务需求决定。
- 程序员自定义的二进制文件格式,只有程序员自己才知道。
- 通用的二进制文件格式: mp3(音乐)、mp4(视频)、bmp(位图)、jpg(图片)、png(图片)
文本文件VS二进制文件
- 文件文件:由可显示的字符组成,方便阅读(解码),占用的空间比较多。
- 二进制文件:由比特0和1组成,组织数据的格式与文件用途有关,不方便阅读(解码)。为了节省存储空间,还可能采用压缩技术。为了保证数据安全,也可能采用加密技术。
包含头文件
类:
ifstream 打开文件的模式(方式):
对于,如果文件不存在,则打开文件失败
讯享网
- 在windows 平台下,文本文件的换行标志是. (也就是多两个字节)
- 在linux平台下,文本文件的换行标志是。
- 在windows平台下,如果以文本方式打开文件,写入数据的时候,系统会将转换成
;读取数据的时候,系统会将转换成。如果以二进制方式打开文件,写和读都不会进行转换。 - 在Linux平台下,以文本或二进制方式打开文本文件,系统不会做任何转换。
- 以文本方式读取文件的时候,遇到换行符停止,读入的内容中没有换行符;以二制方式读取文件的时候,遇到换行符不会停止,读入的内容中包括换行符(换行符被视为数据)。
- 在实际开发中,从兼容和语义考虑,一般: a)以文本模式打开文本文件,用行的方法操作它;b)以二进制模式打开二进制文件;用数据块的方法操作它;c)以二进制模式打开文本文件,用数据块的方法操作它(不用行hang的方法),这种情况表示不关心数据的内容;d)不要以文本模式打开二进制文件,也不要用行的方法操作二进制文件,可能会破坏二进制数据文件的格式,也没有必要。(因为二进制文件中的某字节的取值可能是换行符,但它的意义并不是换行,可能是整数n个字节中的某个字节)
之前讲了类,还有类。
下面讲一下类。
类既可以读文本/二进制文件,也可以写文本/二进制文件。
类的缺省模式是。
普遍的做法是:
- 如果只想写入数据,用;如果只想读取数据,用;如果想写和读数据,用,这种情况不多见。不同的类体现不同的语义。
也就是对于上面的代码将或者改成。这种情况不多见。不同的类体现不同的语义。 - 在Linux平台下,文件的写和读有严格的权限控制。(需要的权限越少越好)
- 获取文件位置指针
类的成员函数是;类的成员函数是,类两个都有,效果相同
讯享网
例如:
对于这个结果:

他的位置指针是自己变化的,不需要我们进行调整。
2. 移动文件位置指针
类的函数是 类的函数是 fstream类两个都有,效果相同。
方法一:
讯享网
方法二:
讯享网

写文件的时候,就是先向缓冲区中写数据,如果缓冲区满了,然后在向磁盘中写入。
读数据的时候,就是系统先把更多的数据从磁盘文件中读取出来,放到缓冲区中。
总的来说,缓冲区可以减少磁盘I/O的次数,提高读和写的效率。
文件缓冲区(缓存)是系统预留的内存空间,用于存放输入或输出的数据。
根据输出和输入流,分为输出缓冲区和输入缓冲区。
注意,在C++中,每打开一个文件,系统就会为它分配缓冲区。不同的流,缓冲区是独立的。程序员不用关心输入缓冲区,只关心输出缓冲区就行了。
在缺省模式下,输出缓冲区中的数据满了才把数据写入磁盘,但是,这种模式不一定能满足业务的需求。
输出缓冲区的操作:
- flush()成员函数
直接刷新缓冲区。 - endl
换行,然后刷新缓冲区 - unitbuf
fout<<unitbuf;
设置fout输出流,在每次操作之后都进行刷新缓冲区。 - nounitbuf
fout<<nounitbuf;
设置fout输出流,让fout回到缺省的缓冲方式
- eofbit
当输入流操作到达文件末尾时,将设置eofbit。
eof()成员函数检查流是否设置了eofbit。 - badbit
无法诊断的失败破坏流时,将设置badbit。(例如:对输入流进行写入;磁盘没有剩余空间)。bad()成员函数检查流是否设置了badbit。 - failbit
当输入流操作未能读取预期的字符时,将设置failbit(非致命错误,可挽回,一般是软件错误,例如:想读取一个整数,但内容是一个字符串;文件到了未尾)IО失败也可能设置 failbit。
fail()成员函数检查流是否设置了failbit。 - clear()成员函数清理流状态。
- setstate()成员函数重置流状态。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/171912.html