C语言读写二进制文件

可以这么说,除了文本文件以外的所有文件都是二进制文件。二进制文件相对于文本文件更容易修改。因为文本文件的修改,需要修改以后写入内存,然后再清空原文件,再从内存中读取出修改以后的内容到本文件中。二进制文件修改只需要找到特定的字符,然后对它进行修改。

对二进制文件进行操作主要用到fopen,fread,fwrite,fseek等函数。

完整代码:

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

struct stu
{
    int id;
    char name[10];
    int age;
};    //定义一个学生结构体

struct stu s1;

void read_file(char *filename)
{
    FILE *fd = fopen(filename,"rb"); 
    if(fd == NULL)
    {
        perror("open failed!");
        exit(1);        //出错、退出
    }

    fread(&s1,sizeof(s1),1,fd);
    printf("%d %d %s\n",s1.id,s1.age,s1.name);

    fclose(fd);
}

//写入文件
void write_file(char *filename)
{
    FILE *fd = fopen(filename,"wb");
    s1.id=77;
    s1.age=17;
    strcpy(s1.name,"yang");

    if(fd == NULL)
    {
        perror("open failed!");
        exit(1);
    }

    fwrite(&s1,sizeof(s1),1,fd);
    fclose(fd);

}

//修改文件
void modify(char *filename)
{
    FILE *fd = fopen(filename,"rb+");
    if(fd == NULL)
    {
        perror("open failed!");
        exit(1);
    }


    while(1)
    {

        int res = fread(&s1,sizeof(s1),1,fd);
        if(res <= 0)
        {
            break;
        }

        if(s1.id == 77)  //通过查找id=77的位置来修改该结构体成员
        {
            s1.age=22;
            strcpy(s1.name,"yangni");
            fseek(fd,-sizeof(s1),SEEK_CUR); //设置偏移量
            fwrite(&s1,sizeof(s1),1,fd);
            break;
        }
    }


}


int main()
{
    write_file("test.txt");
    read_file("test.txt");
    modify("test.txt");

    printf("%d %d %s\n",s1.id,s1.age,s1.name);

    read_file("test.txt");

    return 0;
}

主要函数:

1、fopen()

FILE * fopen(const char * path, const char * mode);

FILE *fd = fopen(filename,"rb"); 
    if(fd == NULL)
    {

        perror("open failed!");
        exit(1);        //出错、退出
    }
  • path字符串包含欲打开的文件路径及文件名
  • 参数 mode 表示文件打开方式

参数mode:

字符串说明
r以只读方式打开,且文件必须存在
r+以读/写方式打开文件,该文件必须存在
rb+以读/写方式打开一个二进制文件,只允许读/写数据
rt+以读/写方式打开一个文本文件,允许读和写
w打开只写文件,若文件存在则长度清为 0,即该文件内容消失,若不存在则创建该文件
w+打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF 符保留)
a+以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的 EOF 符不保留)
wb以只写方式打开或新建一个二进制文件,只允许写数据
wb+以读/写方式打开或建立一个二进制文件,允许读和写
ab+以读/写方式打开一个文本文件,允许读或在文本末追加数据

2、fread()

size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;

返回值:返回实际写入的数据块数目

从文件流中读数据,最多读取count个项,每个项size个字节,如果调用成功返回实际读取到的项个数(小于或等于count),如果不成功或读到文件末尾返回0

  • buffer 用于接收数据的内存地址

  • size 要读的每个数据项的字节数,单位是字节

  • count 要读count个数据项,每个数据项size个字节.

  • stream 输入流


3、fwrite()

size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);

注意:这个函数以二进制形式对文件进行操作,不局限于文本文件

返回值:返回实际写入的数据块数目

(1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;

(2)size:要写入内容的单字节数;

(3)count:要进行写入size字节的数据项的个数;

(4)stream:目标文件指针;

(5)返回实际写入的数据项个数count。


4、fseek()

int fseek(FILE *stream, long offset, int fromwhere);

函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere(偏移起始位置:文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准,偏移offset(指针偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。

(1)stream:文件指针

(2) offset:为偏移量,正数表示正向偏移,负数表示负向偏移

(3) fromwhere:从文件的哪里开始偏移,可能取值为:SEEK_SET,SEEK_CUR、 SEEK_END (对应0 、 1 、 2)

fseek(fp,100L,0); 把stream指针移动到离文件开头100字节处;

fseek(fp,100L,1); 把stream指针移动到离文件当前位置100字节处;

fseek(fp,-100L,2); 把stream指针退回到离文件结尾100字节处。

关于fseek上文代码分析:

if(s1.id == 77)  //通过查找id=77的位置来修改该结构体成员
{
    s1.age=22;
    strcpy(s1.name,"yangni");
    fseek(fd,-sizeof(s1),SEEK_CUR); //设置偏移量
    fwrite(&s1,sizeof(s1),1,fd);
    break;
}

通过查找s1.id获得s1对象,此时光标锁定到了该对象数据末尾,因此修改完数据后。可设置向左偏移该结构体长度,将光标偏移到该结构体之前,再写入数据就可以覆盖之前的s1,就把s1内容给更改了。

  • 19
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C 语言中,读写二进制文件读写普通文本文件的过程有一些不同,需要使用二进制模式打开文件,并使用适当的函数进行读写操作。以下是一个简单的示例代码,用于在 C 语言中进行二进制文件读写操作: ```c #include <stdio.h> #include <stdlib.h> struct student { char name[50]; int age; float weight; }; int main() { FILE *fp; struct student stu; // 打开二进制文件 fp = fopen("students.dat", "wb+"); // 写入结构体到文件 strcpy(stu.name, "John"); stu.age = 18; stu.weight = 65.5; fwrite(&stu, sizeof(struct student), 1, fp); // 定位到文件开始 rewind(fp); // 读取文件内容 fread(&stu, sizeof(struct student), 1, fp); printf("读取文件内容:\n"); printf("姓名:%s\n", stu.name); printf("年龄:%d\n", stu.age); printf("体重:%f\n", stu.weight); // 关闭文件 fclose(fp); return 0; } ``` 这个例子中,程序首先使用 `fopen()` 函数打开一个名为 `students.dat` 的二进制文件,并使用 `wb+` 模式打开,可以进行写入和读取操作。然后,程序使用 `fwrite()` 函数将一个 `struct student` 结构体写入文件中。接着,程序使用 `rewind()` 函数将文件指针定位到文件开始,然后使用 `fread()` 函数读取文件内容到 `struct student` 结构体变量中。最后,程序使用 `fclose()` 函数关闭文件。需要注意的是,在读写二进制文件时,需要使用 `fwrite()` 和 `fread()` 函数,并且在调用这两个函数时,需要指定要读写的数据类型的大小和数量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值