c - 读取文件并填充结构

标签 c file struct

我有一个具有以下定义的结构:

typedef struct myStruct{
    int a;
    char* c;
    int f;
} OBJECT;

我能够填充此对象并将其写入文件。但是我无法读取其中的 char* c 值...在尝试读取它时,它给了我一个段错误。我的代码有什么问题吗:

//writensave.c

#include "mystruct.h"
#include <stdio.h>
#include <string.h>


#define p(x) printf(x)

int main()
{
    p("Creating file to write...\n");
    FILE* file = fopen("struct.dat", "w");
    if(file == NULL)
    {
        printf("Error opening file\n");
        return -1;
    }

    p("creating structure\n");
    OBJECT* myObj = (OBJECT*)malloc(sizeof(OBJECT));
    myObj->a = 20;
    myObj->f = 45;
    myObj->c = (char*)calloc(30, sizeof(char));
    strcpy(myObj->c, 
        "This is a test");
    p("Writing object to file...\n");
    fwrite(myObj, sizeof(OBJECT), 1, file);
    p("Close file\n");
    fclose(file);
    p("End of program\n");
    return 0;       
}

这是我尝试阅读它的方式:

//readnprint.c
#include "mystruct.h"
#include <stdio.h>
#define p(x) printf(x)
int main()
{   
    FILE* file = fopen("struct.dat", "r");
    char* buffer;
    buffer = (char*) malloc(sizeof(OBJECT));
    if(file == NULL)
    {
        p("Error opening file");
        return -1;
    }

    fread((void *)buffer, sizeof(OBJECT), 1, file);
    OBJECT* obj = (OBJECT*)buffer;
    printf("obj->a = %d\nobj->f = %d \nobj->c = %s",
        obj->a,
        obj->f,
        obj->c);
    fclose(file);
    return 0;
}

最佳答案

当您编写对象时,您是在将指针值写入文件而不是指向的信息。

您需要做的是只是写/读您的整个结构,而是一次只写一个字段。 f 像处理对象一样编写 a 和 f,但是您需要对字符串做一些特殊的事情。尝试 fwrite/fread 长度(未在您的数据结构中表示,这很好),然后 fwrite/fread 字符缓冲区。当然,在阅读时你需要分配它。

关于c - 读取文件并填充结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2767623/

相关文章:

c++ - 在两台计算机之间发送带有意外错误字节的结构

c++ - 基于结构成员数据从 vector 返回结构项的函数

c:这条线是做什么的?

C# WPF - 只允许某些文件扩展名

c - 我如何开始在 UBUNTU 9.04 上进行 CUDA 开发?

php - 在 PHP 中,在使用 fopen() 将文件指针资源分配给变量后,如何从变量中获取文件名?

java - 如何在Android中读取文件

c - 如何在c中对结构体数组进行malloc

c - 文件之间的结构

C 代码只能在某一点上运行良好