在前面的博文中,会产生一个误区:在我们使用read和write函数的时候,是不是只能对字符串(char型数组)进行操作?显然不是的。
让我们看一下函数的原型
函数原型:ssize_t write(int fd,void *buf,size_t count);
第二个参数是一个void *型的指针,并没有指定是字符串型。所以从语法上,我们传进去一个int型变量的指针,也是可以的,当我写了一个demo验证后,发现在读写时使用int型、char型、甚至结构体都是可以成功读写的。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
struct test
{
int a;
char c;
};
int main()
{
int fd;
struct test data[2] = {{100, 'a'},{101, 'b'}};
struct test data2[2] = {{100, 'a'},{101, 'b'}};
fd = open("./file", O_RDWR);
int n_write = write(fd, &data, sizeof(struct test)*2);
lseek(fd, 0, SEEK_SET);
int n_read = read(fd, &data2, sizeof(struct test)*2);
printf("read.data1: %d %c\n", data2[0].a, data2[0].c);
printf("read.data2: %d %c\n", data2[1].a, data2[1].c);
close(fd);
return 0;
}
运行结果:
orangepi@orangepizero2:~/Desktop/second_part/file$ ./a.out
read.data1: 100 a
read.data2: 101 b
虽然文件可以被读取,但是如果使用vim打开file1,会出现乱码