Linux文件编程:写一个整型和结构体数组到文件

文章说明:在初学open,write,read函数时,我们经常会把对字符串的读写操作作为模拟练习的对象,于是对初学者来说就容易形成一个误区:以为写入和读取的文件内容只能是字符串。其实不然,write函数和read函数也可以对整型,数组,结构体,链表来进行读写操作。此篇文章,主要目的在于对整型和结构体数组的读写操作进行举例区分和对字符串读写操作的格式区别

write函数read函数的原型

ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);

write函数read函数的参数说明:

①  fd:文件描述符;文件打开成功后返回值就是fd。对文件进行操作都需要利用文件描述符来实现;

②  void *buf:缓冲区buf为无类型指针,在初学时经常会定义buf为char型的指针类型,然后对文件的读写操作就会使用字符串作为文件内容。既然函数原型已经声明这是一个无类型指针,那么就可以根据操作需要,将buf定义为其他的指针类型;

③  size_t count:表示字节大小,在使用字符串作为文件内容时,经常会使用strlen来计算字节长度。那么在使用整型数作为文件内容时,我们就可以直接使用sizeof来计算类型的大小。

代码实现:

①写一个整型数到文件:将无类型指针buf定义为int型,并赋值;取地址data,并计算int型大小;在写入文件后,光标会移动至文件内容尾,须使用lseek函数移动光标到文件内容头,在使用read函数读取文件内容。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
        int fd;
        int data = 100;
        int data2 = 0;  //data2赋初值为0; 
        fd = open("./file1",O_RDWR);//打开文件
        write(fd,&data,sizeof(int));//写入data的值100到文件描述符;
        lseek(fd,0,SEEK_SET);//光标移动到文件内容头;
        read(fd,&data2,sizeof(int));//读fd里data的值到data2里
        printf("data2=%d\n",data2);//打印出data2的值=100
        close(fd);
        return 0;
}

②写结构体到文件:首先要会使用结构体,先定义结构体变量,赋值,在计算结构体的大小,其他的和写入整型到文件的方法一样;

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

struct Test
{                  //定义结构体变量
        int a;     //整型
        char c;    //字符型
};
int main()
{
        int fd;
        struct Test data = {100,'a'};//赋值 
        struct Test data2;

        fd = open("./file1",O_RDWR);
        write(fd,&data,sizeof(struct Test));//计算结构体大小
        lseek(fd,0,SEEK_SET);//移动光标
        read(fd,&data2,sizeof(struct Test));
        printf("a=%d,c=%c\n",data2.a,data2.c);
        close(fd);
        return 0;
}

③写结构体数组到文件:这里主要注意计算结构体数组的大小,下图代码因为是一个二维数组,所以在使用sizeof时,直接乘以2就可以了。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

struct Test
{                   //定义结构体变量
        int a;      //整型
        char c;     //字符型
};
int main()
{
        int fd;
        struct Test data[2] = {{100,'a'},{101,'b'}};//为结构体数组赋值 
        struct Test data2[2];

        fd = open("./file1",O_RDWR);
        write(fd,&data,sizeof(struct Test)*2);//这是二维数组,计算大小时直接结构体*2即可

        lseek(fd,0,SEEK_SET);
        read(fd,&data2,sizeof(struct Test)*2);

        printf("a=%d,c=%c\n",data2[0].a,data2[0].c);//打印结果时注意数组项数
        printf("a=%d,c=%c\n",data2[1].a,data2[1].c);

        close(fd);
        return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D.•

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值