一、fseek 函数
FILE 文件结构中 , 存在一个指针 , 每次调用文件的读写函数 , 该指针就会移动 ;
如 fgets / fputs , getc / putc , fscanf / fprintf , fread / fwrite 等函数 ;
默认情况下 , 指针是从前向后移动的 ;
该文件内部的指针指向的位置可以通过 fseek
函数进行改变 ;
fseek 函数原型如下 : 重新设置文件内部指针的位置 ;
#include <stdio.h>
int fseek(FILE *stream, long offset, int fromwhere);
设置的指针的位置是 起始位置 + 偏移量 ;
其中的 int fromwhere
参数就是 起始位置 , 有以下三种选择 :
- 文件头
SEEK_SET
0 - 当前位置
SEEK_CUR
1 - 文件尾
SEEK_END
2
long offset
偏移量参数 , 可以为正数 , 也可以为负数 ;
如果执行成功 , 则返回 0 , 失败返回非 0 , 并设置 error 错误代码 ;
二、fseek 函数代码示例
fseek 函数代码示例 : 先写出 10 字节数据 , 然后正常读取前 2 字节 , 最后跳过 4 字节 再读取 2 字节 ;
#include <stdio.h>
int main()
{
// 以写文本的方式向文件中写出数据
FILE *p = fopen("D:/File/number.dat", "w");
// 写出 10 个字符
char array[10] = {1,2,3,4,5,6,7,8,9,10};
// 将 10 个字符写出到文件中
fwrite(array, 1, sizeof(array), p);
// 关闭文件
fclose(p);
// 正常读取文件前 2 字节
FILE *p1 = fopen("D:/File/number.dat", "r");
// 读取数据缓冲区
char array1[2];
// 读取前 2 字节
fread(array1, 1, sizeof(array1), p1);
// 打印前 2 字节数据
printf("%d , %d\n", array1[0], array1[1]);
// 跳过 4 字节读取文件 2 字节
FILE *p2 = fopen("D:/File/number.dat", "r");
// 读取数据缓冲区
char array2[2];
// 跳过 4 字节 , 此时当前位置是 0
fseek(p2, 4, SEEK_CUR);
// 读取 2 字节
fread(array2, 1, sizeof(array2), p2);
// 打印前 2 字节数据
printf("%d , %d", array2[0], array2[1]);
return 0;
}
执行结果 :