如何使用文件的fseek函数对文件指针进行操作
<上一节下一节>
头文件:#include <stdio.h>
fseek()函数可以移动文件的读写指针到指定的位置,即移动当前文件的位置指针,其原型为:
int fseek(FILE * stream, long offset, int fromwhere);
【参数】stream为文件指针,offset为偏移量,fromwhere为指针的起始位置。
参数 offset 为根据参数 fromwhere 来移动读写位置的位移数。参数 fromwhere 为下列其中一种:
当 fromwhere 为 SEEK_CUR 或 SEEK_END 时,参数 offset 允许负值的出现。
对于以二进制方式打开的文件流,移动后的位置为 fromwhere + offset。
对于以文本方式打开的文件流,offset 必须为 0 或 ftell() 函数的返回值,而且 fromwhere 必须为 SEEK_SET。
fseek() 函数一般用于二进制文件,也可以用于文本文件。用于文本文件操作时,需特别注意回车换行的情况:因为在一般浏览工具如UltraEdit中,回车换行视为两个字符0x0D和0x0A,但真实的文件读写和定位时却按照一个字符0x0A进行处理,因此碰到此类问题时,可以考虑将文件整个读入内存,然后在内存中手工插入0x0D的方法,这样可以达到较好的处理效果。
如果参数为其它值,那么结果将根据特定平台和库实现而定。
【返回值】成功返回 0,否则返回非 0 值。如果发生读写错误,将会设置设置文件错误标识。
注意:经笔者测试,超出文件末尾位置,还是返回 0。往回偏移超出首位置,返回-1,且指向一个 -1 的位置,请小心使用。
如果函数执行成功,将会设置文件结束标志,并将消除函数 ungetc() 的所有影响。
fseek()函数和lseek()函数类似,但lseek()返回的是一个 off_t 数值,而fseek()返回的是一个整型。而且 fseek() 不像 lseek() 会返回当前读写位置,必须使用ftell()来取得目前读写的位置。
如果以追加的方式(a+)打开文件,那么fseek()允许在读和写之间切换。
举两个例子:
【实例】创建一个文件,写入数据后读取并显示出来。
a_string
6500
3.141500
x
程序首先创建一个文件,使用 fprintf() 函数往文件流中写入一些数据,然后使用 fseek() 函数把文件的当前读/写指针定位到 文件头,再使用 fscanf() 函数按格式逐个读取写入的数据并显示。
C语言辅导班,帮助有志青年!全程一对一,永久学习,QQ在线,随时响应! |
【C++辅导班】一对一辅导,快速学习,仅需50天,玩转C++开发,找到靠谱的工作! |
fseek()函数可以移动文件的读写指针到指定的位置,即移动当前文件的位置指针,其原型为:
int fseek(FILE * stream, long offset, int fromwhere);
【参数】stream为文件指针,offset为偏移量,fromwhere为指针的起始位置。
参数 offset 为根据参数 fromwhere 来移动读写位置的位移数。参数 fromwhere 为下列其中一种:
- SEEK_SET:从距文件开头 offset 位移量为新的读写位置;
- SEEK_CUR:以目前的读写位置往后增加 offset 个位移量;
- SEEK_END:将读写位置指向文件尾后再增加 offset 个位移量。
当 fromwhere 为 SEEK_CUR 或 SEEK_END 时,参数 offset 允许负值的出现。
对于以二进制方式打开的文件流,移动后的位置为 fromwhere + offset。
对于以文本方式打开的文件流,offset 必须为 0 或 ftell() 函数的返回值,而且 fromwhere 必须为 SEEK_SET。
fseek() 函数一般用于二进制文件,也可以用于文本文件。用于文本文件操作时,需特别注意回车换行的情况:因为在一般浏览工具如UltraEdit中,回车换行视为两个字符0x0D和0x0A,但真实的文件读写和定位时却按照一个字符0x0A进行处理,因此碰到此类问题时,可以考虑将文件整个读入内存,然后在内存中手工插入0x0D的方法,这样可以达到较好的处理效果。
如果参数为其它值,那么结果将根据特定平台和库实现而定。
【返回值】成功返回 0,否则返回非 0 值。如果发生读写错误,将会设置设置文件错误标识。
注意:经笔者测试,超出文件末尾位置,还是返回 0。往回偏移超出首位置,返回-1,且指向一个 -1 的位置,请小心使用。
如果函数执行成功,将会设置文件结束标志,并将消除函数 ungetc() 的所有影响。
fseek()函数和lseek()函数类似,但lseek()返回的是一个 off_t 数值,而fseek()返回的是一个整型。而且 fseek() 不像 lseek() 会返回当前读写位置,必须使用ftell()来取得目前读写的位置。
如果以追加的方式(a+)打开文件,那么fseek()允许在读和写之间切换。
举两个例子:
- 将读写位置移动到文件开头:fseek(fp, 0, SEEK_SET);
- 将读写位置移动到文件尾时:fseek(fp, 0, SEEK_END);
- 将读写位置动到离文件开头100字节处:fseek(fp,100L, SEEK_SET);
- 将读写指针移动到离文件当前位置100字节处:fseek(fp,100L, SEEK_CUR);
- 将读写指针退回到离文件结尾100字节处:fseek(fp, -100L, SEEK_END);
【实例】创建一个文件,写入数据后读取并显示出来。
- #include<iostream.h>
- #include<stdio.h>
- void main(void)
- {
- FILE* stream;
- long l;
- float fp;
- char s[81];
- char c;
- stream = fopen("fscanf.txt","w+");
- if(stream == NULL) // 打开文件失败
- {
- printf("the file is opeaned error! ");
- }
- else // 输出信息
- {
- fprintf(stream,"%s %ld %f %c","a_string",6500,3.1415,"x"); // 格式化
- fseek(stream,0L,SEEK_SET); // 文件定位
- fscanf(stream,"%s",s);
- fscanf(stream,"%ld",&l);
- fscanf(stream,"%f",&fp);
- fscanf(stream," %c",&c);
- printf("%s ",s);
- printf("%ld ",l);
- printf("%f ",fp);
- printf("%c ",c);
- fclose(stream); // 关闭
- }
- }
a_string
6500
3.141500
x
程序首先创建一个文件,使用 fprintf() 函数往文件流中写入一些数据,然后使用 fseek() 函数把文件的当前读/写指针定位到 文件头,再使用 fscanf() 函数按格式逐个读取写入的数据并显示。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。