随机读写文件

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

以上是关于随机读写文件的主要内容,如果未能解决你的问题,请参考以下文章

营销MM让我讲MySQL日志顺序读写及数据文件随机读写原理

随机读写文件

MySQL:31 MySQL数据库的日志顺序读写以及数据文件随机读写的原理

C 文件随机读写

Java 实现文件随机读写-RandomAccessFile

用Python对文件进行随机读写