9.4.5 文件的随机访问——fseek()
对流式文件可以进行顺序读写,也可以进行随机读写。如果位置指针是按字节位置顺序移动,就是顺序读写;如果可以将位置指针按需要移动到指定位置,就实现了随机读写。进行随机读写的关键在于控制文件的位置指针,在随机读写时,读完上一个字节后,可直接将位置指针移动到用户指定的任一字节进行读写。
fseek()函数就可以改变文件的位置指针,以实现文件的随机访问。
调用方式:int fseek(FILE*stream,long offset,int origin);
函数功能:按偏移量offset和起始位置origin的值,设置与stream相绑定文件位置指示器。操作成功返回值为0,否则返回值为非0。
偏移量offset是从起始位置origin到要确定的新位置之间的字节数目,当文件是结构类型时,可用sizeof()确定偏移量。起始位置的值用0、1或2表示:0表示从文件头开始;1表示从当前位置开始;2则表示从文件末端开始。通常,“偏移量”指以起始位置为基点,向前移动的字节数,并要求位移量是长整型(long)数据,以支持大于64KB的文件,下面是fseek()函数调用的几个简例:
fseek(fp,100L,0); 将位置指针移到离文件头100个字节处。
fseek(fp,50L,1); 将位置指针移到离当前位置50个字节处。
fseek(fp,−10L,2); 将位置指针从文件末尾向文件头方向退10个字节。
其中,fp是指向文件的指针。
fseek()函数一般用于二进制文件,因为文本文件要发生字符转换,计算位置时往往会发生混乱而达不到预期的目的。
例9-11 程序把位置指针移到离文件“test”开头10个字节处,然后由get()函数取出文件指针指向的字符。
如果test磁盘文件中存放的信息是:“Testing the function of fseek”,则程序运行的结果是:第十一个字符e。
从上面讲述的内容中,我们已看到在应用程序的开发中经常要使用文件。由于C标准函数已提供了不少有关处理文件的函数,这就使文件的处理工作大为简化。本章我们列举了几个重要的函数,以说明函数的使用方法及文件处理的一般过程。文件处理的基本步骤是:
1.在处理文件之前,必须首先用fopen()函数打开指定的文件。这个函数返回一个指向FILE类型的指针,并将该指针赋予一个已定义的指向FILE类型的指针变量(如fp)。使用指针变量可以实现对文件的各种操作。
2.根据对文件的不同操作,当需要从文件中读取信息时,可使用输入函数getc()、fgets()、fread()和fscanf()等;当需要向文件中写入信息时,可使用输出函数putc()、fputs()、fw rite() 和fprintf()等。
3.如果出现了错误,可以使用feof()和ferror()来确定应该采取的处理方式。
4.最后应该使用fclose()函数关闭文件以确保文件被正确终止和保存。
常见的编程错误9.1
访问文件时,在内部文件指针变量名的位置使用文件的外部名。使用数据文件外部名(即含盘符、路径和文件名的文件标识)的唯一标准库函数是fopen()函数。
遗漏文件指针名。在数据文件的读写中没有指定文件指针。
在没有首先检查一个给定的文件名称是否存在的情况下就打开这个文件用于输出。不预先检查先前存在的文件将可能导致文件内容被覆盖。
没有理解文件的结尾只有在EOF标记被读取或被传递之后才能检测到。
在写入一个二进制文件时,要写入指定的字节数时没有使用sizeof()运算符。
在读取一个二进制文件时,要读取指定的字节数时没有使用sizeof()运算符。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。