C语言读取文档的结构体

把结构体内容写入.txt文件中

//write.c
#include <stdio.h>

struct test{
          
   
        int a;
        float b;
};

int main()
{
          
   
        struct test v = {
          
   1, 2.3};
        FILE *fp;
        fp = fopen("save.txt", "w");
        if(fp == NULL)return -1;
        fprintf(fp, "%d %f", v.a, v.b);
        fclose(fp);

        return 0;

}

fprintf函数可以把数据以可读的形式写入到文件中,最后写出来的文件输出样式为:

1 2.300000

我用过fwrite写入到文件中,会出现乱码,然后读取出来的数据也会出现乱码的形式。暂时还没想到什么原因。知道的小伙伴可以留言教一下我。

读取文件中的结构体

// read.c
#include <stdio.h>

struct test{
          
   
        int a;
        float b;
};

int main()
{
          
   
        struct test v;
        FILE *fp;
        fp = fopen("save.txt", "r");
        if(fp == NULL)return -1;

        fscanf(fp, "%d%f", &v.a, &v.b);

        printf("get, a=%d, b=%f
", v.a, v.b);

        fclose(fp);

        return 0;

}

读取结构体的话使用fscanf函数,该函数会把文件中符合int的块和float块找出来,然后给到对应的内存空间。

暂时用这个解决了可以读取结构体的问题。 现在碰到的新问题是,用read和write函数读写结构体就会出现一些问题。

在同一个文件中读写结构体是可以的。

// demo1.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

struct Test{
          
   
        int age;
        char *name;
};

int main()
{
          
   
        const char *pathname = "./test.txt";
        int fd = open(pathname, O_RDWR|O_CREAT|O_APPEND, S_IRWXU);
        if(fd == -1){
          
   
                perror("file open fail:");
                exit(-1);
        }else{
          
   
                // ssize_t write(int fd, const void *buf, size_t count);

                /*char *buf = "try to write something in it.
";
                int count = strlen(buf);*/

                struct Test test={
          
   10, "testname"};

                int write_byte = write(fd, &test, sizeof(struct Test));
                if (write_byte == -1){
          
   
                        perror("write failed:");
                        exit(-1);
                }else{
          
   
                        printf("write_byte=%d
", write_byte);
                        printf("write success!
");
                }
        }
        struct Test data2;
        // read
        int ret_read = read(fd, &data2, sizeof(struct Test));
        printf("read age=%d, name=%s
", data2.age, data2.name);
        close(fd);
        return 0;
}

这样子是可以打印出10 和 testname。但是如果我把读写操作分开写,一个文件写,一个文件读,最后读的操作会出现读不到的情况,之后会去思考以下这个问题,如果有懂的小伙伴留言告诉一下,大家一起学习啊。

经验分享 程序员 微信小程序 职场和发展