随机读写文件
Posted LC编程开发者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随机读写文件相关的知识,希望对你有一定的参考价值。
当调用fopen()函数打开一个文件的时候,返回一个文件指针,指向打开的文件。得到的文件指针,指向文件的起始位置。
所以,调用fopen()函数打开一个文件指针,接着调用fread()、fwrite()函数对文件进行读写操作,都是从文件的起始位置进行读写操作。
那么,如果文件有30个字节,想调用fopen()打开文件之后,可以跳到第9个字符进行读取,只读取第9个字符?
C语言提供了fseek()函数,可以实现该操作。fseek()函数的定义如下:
int fseek( FILE *stream, long offset, int origin);
函数说明:移动stream文件指针,从origin地址开始,移动offset个偏移字节。那么,origin参数有如下的取值:
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2数值。可以举例如下:
fseek(fp,100L,0);把fp指针移动到离文件开头100字节处;
fseek(fp,100L,1);把fp指针移动到离文件当前位置100字节处;
fseek(fp,100L,2);把fp指针退回到离文件结尾100字节处。
参数offset为偏移量,正数表示正向偏移,负数表示负向偏移。
返回值:成功返回0,失败返回-1。
文件指针经过跳转之后,可以调用rewind()函数,把文件指针恢复到文件的起始位置。该函数的定义如下:
void rewind(FILE *stream);
函数说明:把参数stream指向的文件指针,恢复到文件的起始位置。
如下是一个程序测试例子:
在编译运行程序之前,我们先创建test.txt文件,准备测试的数据,如下:
此时,创建test.txt文件,并存放 "ABCDEF" 字符串。然后,查看该文件的数据。
此时,准备的测试文件完成。然后,编译运行程序:
可以看到,打开test.txt文件的时候,fp文件指针指向文件的首地址。就是指向字符'A',然后,调用fseek()往后移动3个字节,指向字符'D'。
那么,调用fgetc()函数读取一个字符,就读取到字符'D'。然后,调用rewind()函数,把文件指针恢复到起始地址。接着调用fseek()函数,移动到SEEK_END指向的文件末尾,同时offset设置为“负数”,那么,就往回移动。所以,从文件的末尾往回移动。
fseek(fp, -3, SEEK_END);
c = fgetc(fp); //往回移动3个字节,读取字符 E;
fseek(fp, -2, SEEK_END);
c = fgetc(fp); //往回移动2个字节,读取字符 F;
fseek(fp, -1, SEEK_END);
c = fgetc(fp); //往回移动1个字节,读取字符串结束符; 注意,还需要考虑字符串结束符。
所以,可以随意移动文件指针,读取指定偏移地址处的数据。调用fseek()函数,可以移动文件指针,读取指定位置处的数据。
韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip
以上是关于随机读写文件的主要内容,如果未能解决你的问题,请参考以下文章
MySQL:31 MySQL数据库的日志顺序读写以及数据文件随机读写的原理