12.4 定位问题
打开一个文件之后,一般情况下只能从前到后地读写。然而,有时候,程序的要求可能是重新读写前面的数据,这时就需要对文件重新定位。
12.4.1 ftell()函数
ftell()函数返回的是一个已经打开的流“stream”相对于文件开头的当前操作位置,出错时该函数返回“-1L”。
可以用一个“long”类型的变量记录下返回的这个当前读写位置,以便再次返回这个位置。
12.4.2 fseek()函数
fseek()函数的功能是设置已经打开的“stream”流的操作位置,后续的读写操作将从这个设置的位置开始。
对于二进制文件,此位置被设置为从“whence”开始的第“offset”个字节处。
在“stdio.h”中定义了3个符号常量可以直接作为“whence”的实参。
SEEK_SET 值为“0L”,表示文件开始处。
SEEK_CUR 值为“1L”,表示文件当前位置。
SEEK_END 值为“2L”,表示文件文件结尾位置,此时“offset”可以为正或负,为正时会对文件进行扩展。
对于文本文件,“offset”必须取值为“0L”或前一次调用ftell()函数所得到的值。
fseek()函数在出错时返回一个非0值,否则返回0值。
12.4.3 rewind()函数
这个函数实际上等价于fseek(stream, 0L, SEEK_SET)。也就是说,将操作位置重新置为文件的开头。
12.4.4 fgetpos()函数和fsetpos()函数
这个两个函数的函数原型分别是
从前面fseek()函数的函数原型中可以发现,fseek()函数显然无法对很大(尺寸超过“long”的表示范围)的文件进行操作。这里的两个函数是针对大文件的ftell()和fseek()。
这里出现了一种新的数据类型“fpos_t”,这个类型在“stdio.h”,中由编译器自己定义。
这两个函数返回0值表示成功,否则返回一个非0值,并在errno中存入一个编译器自己确定的正值。errno是一个编译器定义的外部变量。