C语言fseek()随机读写文件(图文并茂,附带实例)
在 C语言中,文件偏移(也称为文件指针或文件位置)表示当前在文件中的位置,用于读取和写入操作。
当使用 fopen() 函数打开一个文件时,文件偏移通常被设置为文件开头(对于读模式)或文件结尾(对于追加模式)。
实际上,文件结构中保存了一个表示当前文件读写位置的指针。在 fopen() 函数打开文件后,这个指针指向文件中的第一个字节。当任意文件操作函数读写相应长度的字节后,指针也会偏移相应的长度。
例如,每次 fgetc() 函数获取一个字节时,文件指针都会向后移动一个字节,如下图所示:

图 1 fgetc()函数读取一个字符
每次 fgets() 函数获取一行字符时,文件指针都会向后移动到下一行开始,如下图所示:

图 2 fgets()函数获取一行字符
要在 C语言中操作文件偏移,可以使用 fseek()。
fseek() 函数用于设置文件偏移至指定位置,fseek() 函数的语法格式如下:
例如,若要从文件开头偏移 5 字节,使文件指针指向 'a',可使用以下代码:

图 3 从文件开头偏移5字节
若要从文件结尾偏移 -5 字节,使文件指针指向 'i',可使用以下代码:

图 4 从文件结尾偏移-5字节
下面是一个使用 fseek() 函数设置文件偏移至指定位置的实例:
当使用 fopen() 函数打开一个文件时,文件偏移通常被设置为文件开头(对于读模式)或文件结尾(对于追加模式)。
实际上,文件结构中保存了一个表示当前文件读写位置的指针。在 fopen() 函数打开文件后,这个指针指向文件中的第一个字节。当任意文件操作函数读写相应长度的字节后,指针也会偏移相应的长度。
例如,每次 fgetc() 函数获取一个字节时,文件指针都会向后移动一个字节,如下图所示:

图 1 fgetc()函数读取一个字符
每次 fgets() 函数获取一行字符时,文件指针都会向后移动到下一行开始,如下图所示:

图 2 fgets()函数获取一行字符
要在 C语言中操作文件偏移,可以使用 fseek()。
fseek() 函数用于设置文件偏移至指定位置,fseek() 函数的语法格式如下:
int fseek(FILE * stream, long offset, int origin);参数说明:
- stream:一个指向 FILE 类型的指针,指示要设置偏移量的文件。
- offset:一个长整数,表示相对于 origin 的偏移量。它可以为正数(向前移动文件指针)或负数(向后移动文件指针)。
- origin:一个整数,表示偏移的参考点。它可以是以下三个常量之一:
- SEEK_SET:从文件开头计算偏移;
- SEEK_CUR:从当前文件指针位置计算偏移;
- SEEK_END:从文件末尾计算偏移。
例如,若要从文件开头偏移 5 字节,使文件指针指向 'a',可使用以下代码:
fseek(pFile, 5, SEEK_SET);下图展示了偏移的过程:

图 3 从文件开头偏移5字节
若要从文件结尾偏移 -5 字节,使文件指针指向 'i',可使用以下代码:
fseek(pFile, -5, SEEK_END);下图展示了偏移的过程。需要注意的是,SEEK_END 是从文件最后一个字符的下一个开始进行偏移的,而不是从最后一个字符 \n 开始偏移。

图 4 从文件结尾偏移-5字节
下面是一个使用 fseek() 函数设置文件偏移至指定位置的实例:
#include <stdio.h> int main() { FILE* pFile = fopen("data.txt", "r"); if (pFile == NULL) { return -1; } char ch; // 从文件开头偏移 5 字节 fseek(pFile, 5, SEEK_SET); ch = fgetc(pFile); putchar(ch); // 从文件结尾偏移-5 字节 fseek(pFile, -5, SEEK_END); ch = fgetc(pFile); putchar(ch); fclose(pFile); return 0; }运行结果为:
ai