Linux 应用编程之fseek()、ftell()函数

1、fseek()函数
库函数 fseek()用于设置文件读写位置偏移量。

#include 
int fseek(FILE *stream, long offset, int whence);
stream FILE 指针。
offset 偏移量,以字节为单位
whence 用于定义参数 offset 偏移量对应的参考值,该参数为下列其中一种(宏定义):
SEEK_SET :读写偏移量将指向 offset 字节位置处(从文件头部开始算);
SEEK_CUR :读写偏移量将指向当前位置偏移量 + offset 字节位置处, offset 可以为正、也可以为负,如果是正数表示往后偏移,如果是负数则表示往前偏移;
SEEK_END :读写偏移量将指向文件末尾 + offset 字节位置处,同样 offset 可以为正、也可以为负, 如果是正数表示往后偏移、如果是负数则表示往前偏移。
返回值: 成功返回 0 ;发生错误将返回 -1 ,并且会设置 errno 以指示错误原因。
示例代码:使用 fseek()调整文件读写位置
#include 
#include 

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() 从文件头部开始读取刚写入的数据,读取成功之后打印出信息。

运行测试:

Linux 应用编程之fseek()、ftell()函数_第1张图片

 

2、ftell()函数
库函数 ftell() 可用于获取文件当前的读写位置偏移量。
#include 
long ftell(FILE *stream);
参数 stream 指向对应的文件,函数调用成功将返回当前读写位置偏移量;调用失败将返回 -1 ,并会设置 errno 以指示错误原因。
示例代码:使用 fseek()和 ftell()函数获取文件大小
#include 
#include 

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 文件,将文件的读写位置移动到文件末尾,然后再获取当前的位置偏移量,也就得到了整个文件的大小。


编译测试:
Linux 应用编程之fseek()、ftell()函数_第2张图片

你可能感兴趣的:(linux,fseek,ftell)