Linux文件系统编程之写入文件的不只是字符串

这篇博客详细介绍了如何在Linux环境下进行文件系统编程,包括如何将整型、整型数组、结构体以及单链表写入文件并进行读取。虽然文件中显示的是乱码,但通过程序正确读取后,数据能够被正确识别。示例代码展示了使用`write()`和`read()`函数进行数据存取,并通过`lseek()`设置文件指针。最后,作者提到由于链表内存非连续,因此在读写链表时需要逐节点操作。
摘要由CSDN通过智能技术生成

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;
}

结果与前面的测试结果一样,我们在终端成功读取到了写入的链表的内容,文件里依然是我们不认识的字符,为了方便测试我们在链表的每个节点只存放了整型变量,感兴趣的可以加入其他的数据类型测试以下结果。

总结

我们成功在文件中写入了整型数据,整型数组,结构体及链表,虽然我们打开文件看到的似乎不是我们想要的结果,但是我们在终端看到了实际的值,说明计算机是能够识别的,由于笔者能力有限,如有错误之处,欢迎指正,当然感兴趣朋友的可以试着写入其他的一些变量类型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值