【Linux C】fseek函数使用小结

0x00 前言

演示使用的Linux版本(#cat /etc/issue):Ubuntu 18.04.6 LTS \n \l

最后更新日期:2023.7.17

0x01 fseek函数使用小结

1.函数描述

设置stream文件的位置指针偏移到指定位置1

2.声明

#include <stdio.h>
int fseek( FILE *stream, long offset, int origin );

参数:
stream:这是指向 FILE 对象的指针,该 FILE 对象标识了流。
offset:相对 origin 偏移的字节数。
origin:起始位置 。它为指定的下列值之一: SEEK_SETSEEK_CURSEEK_END

选项说明
SEEK_SET当前位置为文件的开头
SEEK_CUR当前位置为文件指针的位置
SEEK_END当前位置为文件的末尾

返回值:
成功时为 ​0​ ,否则为非零。

3.实例

该例实现功能为:从a文件复制其全部内容,然后覆写到b文中,最后再将一个字符串"hello word!"内容追加到b文件中。

#include <stdio.h>
#include<string.h>

int main(int argc, char* argv[])
{
    int num = 0;
    int count = 0;
    char buffer[1024] = {0};
    char str[1024] = "hello word!";
    FILE* source_fd;
    FILE* target_fd;
    if(argc != 3){
        printf("Usage:copy Sourcefile Targetfile\n");
        return -1;
    }
    if(!(source_fd = fopen(*(argv + 1), "rb"))){//二进制读取文件内容
        printf("Source file open error!\n");
        return -2;
    }
    if(!(target_fd = fopen(*(argv + 2), "wb"))){ //文件清空,再二进制写入新的数据,若不想清空文件,第二参数写"ab"变为追加方式
        printf("Target file open error!\n");
        return -3;
    }

    num = fread(buffer, sizeof(char), sizeof(buffer), source_fd);

    fseek(target_fd, 0, SEEK_SET);
    if(fwrite(buffer, sizeof(char), strlen(buffer), target_fd) != num){
        printf("Target file write buffer error!\n");
        return -4;
    }

    fseek(target_fd, strlen(buffer), SEEK_SET);
    if(fwrite(str, sizeof(char), strlen(str), target_fd) != strlen(str)){
        printf("Target file write str error!\n");
        return -5;
    }
    
    fclose(source_fd);
    fclose(target_fd);
    
    return 0;
}

当前目录下有a、b两个文件,其中a文件有内容如下,b文件内容为空:
a:
在这里插入图片描述

b:
在这里插入图片描述

gcc编译程序并运行:
在这里插入图片描述
此时查看b文件:
在这里插入图片描述

可以看到覆写成功。此时若我们将代码中的第二个fseek(target_fd, strlen(buffer), SEEK_SET);改成fseek(target_fd, 4, SEEK_SET);也就是将文件位置指针偏移4个字节(小于a内容长度),再编译运行则b文件内容如下:
在这里插入图片描述

可以看到这次的修改将从第4个字节后开始覆写字符串"hello word!"内容。

以上。


  1. https://www.apiref.com/cpp-zh/c/io/fseek.html ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值