C++读写二进制格式文件

在实际应用中,为了节约存储空间,文件多会以二进制格式保存,所以有必要了解如何在C++中读取二进制文件中的数据。

头文件

使用C++读取二进制格式的文件,首先应该将头文件包含进来。

C++合法的绝对路径名

既然有绝对路径,那么就有相对路径。相对路径名一般是指存储在当前VC工程目录下的文件名,多数情况下只给出文件名。如”data.txt”。

在Windows系统中文件绝对路径名格式为:“C:\Users\Administrator\Desktop\data.txt”。但是用文件输入输出流读写该路径的文件时会提示出错。因为在C++中用‘\’定义了转义字符,所以在C++中文件路径名有自己特定的格式,下面两种写法都合法:

①  “C:\\Users\\Administrator\\Desktop\\data.txt

②  “C:/Users/Administrator/Desktop/data.txt

将流对象与文件关联

将文件输入流对象与文件关联有两种方式:

①  ifstream fin(“文件名”,ios::binary)

②  ifstream fin;fin.open(“文件名”,ios::binary)

同样,将文件输出流对象与文件关联也有两种方式:

①  ofstream fout(“文件名”,ios::binary)

②  ofstream fout;fout.open(“文件名”,ios::binary)

其中,ios::binary为文件的模式,它指定了文件以二进制方式读或写。

文件流读写二进制数据的成员函数

读取二进制文件,经常会使用成员函数read()。MSDN在线帮助系统中给出的read函数原型为:

basic_istream& read(char_type *_Str, streamsize_Count)。其作用是读取指定数量(streamsize_Count)个字符到字符数组中(_Str)。

使用时,需要注意三点:①第一个形参类型为char *②读取数据的单位为字符③读取数据的个数不要超过数组的容量,否则会报错。④如果还未读取streamsize_Count个字符就到达了文件末尾,编译器会设置 ios::failbit,当设置failbit后,之后的I/O操作就不再执行。⑤读取操作时,以覆盖的方式修改_Str中的值。例如:文件有abc三个字符,上一次正常读取两个字符后_Str数组中的值_Str[0]='a',_Str[1]='b',当前再次执行读取两个字符的操作时会出现④描述的情况,这时编译器会读取一个字符‘c’,然后到达文件尾结束本次读取操作。这时_Str数组中的值_Str[0]=‘c’,_Str[1]=‘b'

写入二进制数据到文件,经常会使用成员函数write函数。MSDN在线帮助系统中给出的wtrite原型为:

basic_ostream<_Elem, _Tr>& write(const char_type *_Str,streamsize _Count)。其作用是把从地址_Str开始的streamsize _Count个字符写入到流中。

使用时,需要注意两点:①第一个形参类型为char *②写入数据的单位为字符

关闭文件

在读写完二进制文件后,记得调用文件流的close()成员函数,断开流对象与文件的关联。


再补充两个知识点

关于eof()函数

在使用C++读文件的时候,你可能会调用文件流的成员函数——eof()函数,来判断文件是否读到文件结尾。如果你对eof()函数不够了解,那么会出现令你匪夷所思的结果。下面简明扼要的介绍下eof()函数:

eof()函数是当流对象读到文件结束符时返回true,否则返回false。文件的结束符并不是文件有效数据的最后一个字符,这与C字符串最末尾的’\0’字符类似。比如:空文件中其实有一个文件结束符。所以,当程序正好读到文件的最后一个字符时程序不会退出读取操作,还会再进行读取一次。

eof()函数不能达到你的目的时,可使用文件流的peek()函数。peek函数返回输入文件流中的下一个字符,但不抽取输入流中的字符。也就是说它能够查看下一个输入字符,但是并不读入流中。

关于字节序

字节序分大端序(big-endian)和小端序(little-endian)。VS软件中字节序是小端序,所以,在VS中用C++读写二进制文件时一定要弄清楚数据以哪种字节序存储。关于字节序详细介绍请看字节序介绍文章。

你可能感兴趣的:(C++面试题目,C++读写二进制格式文件,fstream,eof,MNIST)