文章说明:在初学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;
}