详解C++编程中对二进制文件的读写操作

2020-01-06 13:50:15刘景俊

答案是可以的,将指定数目的字节读入内存,依次存放在以地址&tud[0]开始的存储空间中。要注意读入的数据的格式要与存放它的空间的格式匹配。由于磁盘文件中的数据是从内存中结构体数组元素得来的,因此它仍然保留结构体元素的数据格式。现在再读入内存,存放在同样的结构体数组中,这必然是匹配的。如果把它放到一个整型数组中,就不匹配了,会出错。

与文件指针有关的流成员函数

在磁盘文件中有一个文件指针,用来指明当前应进行读写的位置。在输入时每读入 一个宇节,指针就向后移动一个字节。在输出时每向文件输出一个字节,指针就向后移动 一个字节,随着输出文件中字节不断增加,指针不断后移。对于二进制文件,允许对指针进行控制,使它按用户的意图移动到所需的位置,以便在该位置上进行读写。文件流提供 一些有关文件指针的成员函数。为了查阅方便,将它们归纳为下表:

详解C++编程中对二进制文件的读写操作

几点说明:

1) 这些函数名的第一个字母或最后一个字母不是g就是p。带 g的是用于输入的函数(g是get的第一个字母,以g作为输入的标识,容易理解和记忆), 带p的是用于输出的函数(P是put的第一个字母,以P作为输出的标识)。例如有两个 tell 函数,tellg用于输入文件,tellp用于输出文件。同样,seekg用于输入文件,seekp用于输出文件。以上函数见名知意,一看就明白,不必死记。

如果是既可输入又可输出的文件,则任意用seekg或seekp。

2) 函数参数中的“文件中的位置”和“位移量”已被指定为long型整数,以字节为单位。“参照位置”可以是下面三者之一:

ios::beg 文件开头(beg是begin的缩写),这是默认值。

ios::cur 指针当前的位置(cur是current的缩写)。

ios::end 文件末尾。

它们是在ios类中定义的枚举常量。举例如下:

infile.seekg(100); //输入文件中的指针向前移到字节位置

infile.seekg(-50,ios::cur); //输入文件中的指针从当前位置后移字节

outfile.seekp(-75,ios::end); //输出文件中的指针从文件尾后移字节

随机访问二进制数据文件

一般情况下读写是顺序进行的,即逐个字节进行读写。但是对于二进制数据文件来说,可以利用上面的成员函数移动指针,随机地访问文件中任一位置上的数据,还可以修改文件中的内容。

[例] 有个学生的数据,要求:

把它们存到磁盘文件中;