【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 
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 
#include

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:
【Linux C】fseek函数使用小结_第1张图片

b:
【Linux C】fseek函数使用小结_第2张图片

gcc编译程序并运行:
在这里插入图片描述
此时查看b文件:
【Linux C】fseek函数使用小结_第3张图片

可以看到覆写成功。此时若我们将代码中的第二个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 ↩︎

你可能感兴趣的:(linux,c语言,数据库)