1、fseek()函数
库函数 fseek()用于设置文件读写位置偏移量。
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
stream : FILE 指针。
offset :偏移量,以字节为单位
whence :用于定义参数 offset 偏移量对应的参考值,该参数为下列其中一种(宏定义):
⚫ SEEK_SET :读写偏移量将指向 offset 字节位置处(从文件头部开始算);
⚫ SEEK_SET :读写偏移量将指向 offset 字节位置处(从文件头部开始算);
⚫ SEEK_CUR :读写偏移量将指向当前位置偏移量 + offset 字节位置处, offset 可以为正、也可以为负,如果是正数表示往后偏移,如果是负数则表示往前偏移;
⚫ SEEK_END :读写偏移量将指向文件末尾 + offset 字节位置处,同样 offset 可以为正、也可以为负, 如果是正数表示往后偏移、如果是负数则表示往前偏移。
返回值: 成功返回 0 ;发生错误将返回 -1 ,并且会设置 errno 以指示错误原因。
示例代码:使用 fseek()调整文件读写位置
#include <stdio.h>
#include <stdlib.h>int main(void)
{FILE *fp = NULL;char rd_buf[100] = {0};char wr_buf[] = "Linux应用编程,开心快乐每一天!";int ret;/* 打开文件 */if (NULL == (fp = fopen("./test_file", "w+"))){perror("fopen error");exit(-1);}printf("文件打开成功!\n");/* 写文件 */if (sizeof(wr_buf) >fwrite(wr_buf, 1, sizeof(wr_buf), fp)){printf("fwrite error\n");fclose(fp);exit(-1);}printf("数据写入成功!\n");/* 将读写位置移动到文件头部 */if (0 > fseek(fp, 0, SEEK_SET)){perror("fseek error");fclose(fp);exit(-1);}/* 读文件 */if (sizeof(wr_buf) > (ret = fread(rd_buf, 1, sizeof(wr_buf), fp))){printf("fread error\n");fclose(fp);exit(-1);}printf("成功读取%d 个字节数据: %s\n", ret, rd_buf);/* 关闭文件 */fclose(fp);exit(0);
}
程序中首先调用 fopen() 打开当前目录下的 test_file 文件,参数 mode 设置为 "w+" ;接着调用 fwrite() 将 wr_buf 缓冲区中的字符串数据"Linux应用编程,开心快乐每一天!" 写入到文件中;由于调用了 fwrite(),所以此时的读写位置已经发生了改变,不再是文件头部,所以程序中调用了 fseek() 将读写位置移动到了文件头,接着调用 fread() 从文件头部开始读取刚写入的数据,读取成功之后打印出信息。
运行测试:

2、ftell()函数
库函数 ftell() 可用于获取文件当前的读写位置偏移量。
#include <stdio.h>
long ftell(FILE *stream);
参数 stream 指向对应的文件,函数调用成功将返回当前读写位置偏移量;调用失败将返回 -1 ,并会设置 errno 以指示错误原因。
示例代码:使用 fseek()和 ftell()函数获取文件大小
编译测试:
#include <stdio.h>
#include <stdlib.h>int main(void)
{FILE *fp = NULL;int ret;/* 打开文件 */if (NULL == (fp = fopen("./testApp.c", "r"))){perror("fopen error");exit(-1);}printf("文件打开成功!\n");/* 将读写位置移动到文件末尾 */if (0 > fseek(fp, 0, SEEK_END)){perror("fseek error");fclose(fp);exit(-1);}/* 获取当前位置偏移量 */if (0 > (ret = ftell(fp))){perror("ftell error");fclose(fp);exit(-1);}printf("文件大小: %d 个字节\n", ret);/* 关闭文件 */fclose(fp);exit(0);
}
首先打开当前目录下的 testApp.c 文件,将文件的读写位置移动到文件末尾,然后再获取当前的位置偏移量,也就得到了整个文件的大小。
编译测试:
