Linux文件系统编程之写入文件的不只是字符串
Linux文件写入整数
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
//以上为必备的头文件
int main()
{
int fd;
int data = 10;
int data2 = 0;
fd = open("./testFile",O_RDWR|O_CREAT,0600);
//将data整型变量写入到文件
write(fd,&data,sizeof(int));
//光标重新定位到文件开头
lseek(fd,0,SEEK_SET);
//读取文件内容
read(fd,&data2,sizeof(int));
//在终端将内容打印出来
printf("read %d\n",data2);
return 0;
}
我们观察结果发现终端成功输出文件内容为整型数10,vi打开文件观察到的是像乱码的字符,说明计算机能够成功识别,只是我们不认识,实际上已经写入成功。
Linux文件写入整型数组
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
int fd;
int i;
int data[3] = {1,2,3};
int data2[3];
fd = open("./testFile",O_RDWR|O_CREAT,0600);
//数组名本身就是地址,所以不加&
write(fd,data,sizeof(data));
lseek(fd,0,SEEK_SET);
read(fd,data2,sizeof(data2));
for(i=0;i<3;i++){
printf("%d ",data2[i]);
}
printf("\n");
close(fd);
return 0;
}
最终结果和上面一样,终端打印出了数组的内容,我们在文件中观察到的还是乱码,写入成功。
Linux文件写入结构体
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
struct Test{
int data;
char c;
};
int main()
{
int fd;
struct Test data = {10,'c'};
struct Test data2;
fd = open("./testFile",O_RDWR|O_CREAT,0600);
write(fd,&data,sizeof(data));
lseek(fd,0,SEEK_SET);
read(fd,&data2,sizeof(data2));
printf("read %d %c\n",data2.data,data2.c);
close(fd);
return 0;
}
结果与之前一样,终端成功打印处读取的结构体变量的值,不一样的是打开文件发现结构体中的整型变量为乱码,字符正常显示。
Linux文件写入单链表
与之前不同的是,链表的内存空间不是连续的空间,所以写入以及读取的时候需要对每个节点进行操作。
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
struct Test
{
int data;
struct Test *next;
};
//头插法函数,不知道的可以查看之前笔者关于链表的博文
struct Test* insertNode(struct Test *head,struct Test *new)
{
struct Test *p = head;
if(head == NULL){
head = new;
return head;
}
while(p->next != NULL){
p = p->next;
}
p->next = new;
return head;
}
//创建链表函数
struct Test* creatLink(struct Test *head)
{
struct Test *new = NULL;
while(1){
new = (struct Test*)malloc(sizeof(struct Test));
printf("please input a new node\n");
scanf("%d",&new->data);
if(new->data == 0){
return head;
}
head = insertNode(head,new);
}
}
//将链表写入文件的操作封装一个函数
void writeLink(struct Test *head,int fd)
{
struct Test *p = head;
//通过遍历链表的方式将链表的每个节点写入到文件
while(p != NULL){
write(fd,p,sizeof(struct Test));
p = p->next;
}
}
//读取写入的链表内容
void readLink(int fd)
{
struct Test *p = (struct Test *)malloc(sizeof(struct Test));
//同样通过遍历链表读取每个节点
while(p != NULL){
read(fd,p,sizeof(struct Test));
printf("%d ",p->data);
p = p->next;
}
putchar('\n');
}
int main()
{
int fd;
struct Test *head = NULL;
//先创建一个链表
head = creatLink(head);
//打开文件
fd = open("./file",O_RDWR);
if(fd == -1){
printf("open file failed\n");
exit(-1);
}
//写入文件,参数为链表头和文件描述符
writeLink(head,fd);
//将光标重新定位到文件开头
lseek(fd,0,SEEK_SET);
//读取文件,参数为文件描述符
readLink(fd);
//关闭文件
close(fd);
return 0;
}
结果与前面的测试结果一样,我们在终端成功读取到了写入的链表的内容,文件里依然是我们不认识的字符,为了方便测试我们在链表的每个节点只存放了整型变量,感兴趣的可以加入其他的数据类型测试以下结果。
总结
我们成功在文件中写入了整型数据,整型数组,结构体及链表,虽然我们打开文件看到的似乎不是我们想要的结果,但是我们在终端看到了实际的值,说明计算机是能够识别的,由于笔者能力有限,如有错误之处,欢迎指正,当然感兴趣朋友的可以试着写入其他的一些变量类型。