随机访问指的是直接移动到文件的任何位置,并直接访问文件任何位置的内容。随机访问常被用于数据库文件,程序维护一个独立的索引文件,该文件指出在主数据文件中的位置。程序可以直接跳到这个位置,读取其中的数据。如果文件由长度相同的记录组成,这种方法实现最简单。每条记录表示一组相关的数据。
对于输入流,和stream读写位置相关的成员函数如下:
对于输出流,和stream读写位置相关的成员函数包括:
上述函数分别以特殊字符g或p结尾,g代表“get”,p代表“put”。用于读写的位置函数定义于类Basic_istream,用于改写的位置函数定义于类Basic_ostream。然而,并不是所有输入流和输出流均能够支持读写定位。例如,cin、cout和cerr就不支持读写定位。
当程序读写文件时,它将协调地移动输入缓冲区中的输入指针和输出缓冲区中的输出指针。在文件中,移动文件指针也需要一种方式。类Fstream继承了两个函数:seekg()和seekp()。前者将输入指针移到指定位置,后者将输出指针转移到指定的文件位置。将seekg()用于类Ifstream的对象,将seekp()用于类Ofstream的对象。
函数seekg()和seekp()可以接受一个绝对位置或一个相对位置。对于绝对位置,必须采用tellg()和tellp(),会返回一个绝对位置,型别为pos_type。在文件中,逻辑位置和实际位置可能并不相同,这和字节表示法有关系,是非常复杂的问题。
对于相对位置,偏移值可以和3个位置相关,通常这3个参数被定义于类Ios_base中,型别均为seekdir。这3个参数是ios_base::beg、ios_base::cur和ios_base::end。
对于文件位置的偏移量,其类型都属于off_type型别,是streamoff的间接定义。由于streamoff是带正负号的整数型别,使用整数作为stream的偏移值。
无论是文件位置的绝对值,还是偏移值,其位置均在文件长度中有效,如果该位置超越了文件开头或文件结尾,均会导致未定义的行为。
seekg()函数和seekp()的原型分别为:
第一种形式仅包含一个参数,参数代表距离文件开头特定距离的位置;第二种形式包含两个参数,第一个参数的位置描述是相对于第二个参数的,第二个参数可以使用3个值:
(www.xing528.com)
输入流和输出流还分别提供了tellg()函数和tellp(),用于检查文件指针的当前位置,其返回值均为表示当前位置的streampos类型值。创建类Fstream的对象时,输入指针和输出指针将一前一后地移动,是分别独立的。对于同一个文件,如果使用类Ifstream对象来管理输入流,使用类Ofstream来使用输出流,则输入指针和输出指针将彼此独立地移动。此时,tellp()和tellg()的返回值是不同的,是独立的。
例7-14
例7-14执行效果如图7-7所示。
图7-7例7-14的执行效果
例7-15
例7-15的执行效果如图7-8所示。
图7-8 例7-15的执行效果
总结
本节使用两个例题说明了文件随机访问的方法。在两个例题中,文件均为文本文件,这样便于读者校对源代码和程序的输出结果。本节借这两个例题主要讲述了seekg()和seekp()函数的使用方法。因tellg()和tellp()的使用较为简单,故没有在例题中体现。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。