由前面章节可知,对文件的操作都是基于字符串,但对文件的操作并不仅限于此,这个时候需要重新审视几个文件操作的函数原型,函数原型如下:
ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
其中无论是写入(write)还是读取(read)函数,其第二个参数都是无类型的指针,而指针就是地址,前面我们是直接写入字符串名字,因为字符串名字就是地址,所以第二个参数我们只需要写入相应数据类型的地址即可。那么我们可以写入一个整型变量并读取,也可以写入一个结构体并读取,甚至写入一个结构体数组并读取。
写入整型变量时我们将函数的第二个参数写入整型变量名并取地址,在计算字节时只需计算整型变量的字节数即可。
代码展示
#include
#include
#include
#include
#include
#include
#include
int main()
{
nt fd;
int data1 = 100;
int data2 = 0;
fd = open("./file1",O_RDWR);
int n_write = write(fd,&data1,sizeof(int));//将data1取地址,由于data1是整型数,其大小就是int的字节数(系统为4个字节),将其写入文件描述符fd对应的文件file1
lseek(fd,0,SEEK_SET);//将光标移到文件头,方便读取
int n_read = read(fd,&data2,sizeof(int));//与写入函数类似
printf("data2 is %d\n",data2);
return 0;
}
可见data2原先值为0,但通过调用两个函数后,data2的值为100,实现了写入整型变量并读取
写入结构体时我们需定义一个结构体,将第二个参数写入结构体地址,同时字节计算时只需计算结构体大小即可
代码展示
#include
#include
#include
#include
#include
#include
#include
struct Test
{
int a;
char b;
};
int main()
{
int fd;
struct Test data1 = {999,'f'};
struct Test data2;
fd = open("./file1",O_RDWR);
int n_write = write(fd,&data1,sizeof(struct Test));
lseek(fd,0,SEEK_SET);
int n_read = read(fd,&data2,sizeof(struct Test));
printf("data2 is %d,%c\n",data2.a,data2.b);
return 0;
}
可见一开始结构体data2中没有数据,通过调用两个函数后将结构体data1的值赋给结构体data2,实现了写入结构体并读取
写入结构体数组与结构体类似,只需在结构体前加数组符号即可
代码展示
#include
#include
#include
#include
#include
#include
#include
struct Test
{
int a;
char b;
};
int main()
{
int fd;
struct Test data1[2] ={ {999,'f'},{100,'d'}};
struct Test data2[2];
fd = open("./file1",O_RDWR);
int n_write = write(fd,&data1,sizeof(struct Test)*2);
lseek(fd,0,SEEK_SET);
int n_read = read(fd,&data2,sizeof(struct Test)*2);
printf("data2 is %d,%c\n",data2[0].a,data2[0].b);//需用数组下标指向结构体数据
printf("data2 is %d.%c\n",data2[1].a,data2[1].b);
return 0;
}
可见一开始结构体数组data2中没有数据,通过调用两个函数后将结构体数组data1的值赋给结构体数组data2,实现了写入结构体数组并读取