IO через двоичные файлы в C - PullRequest
1 голос
/ 21 марта 2020

Как правильно использовать скрипт c для сохранения пользовательского struct в виде двоичного файла и чтения его из другого c сценария?

Есть два раздела кодов ниже. Save struct section создает и сохраняет пользовательскую структуру в виде двоичного файла. Read struct section пытается прочитать двоичный файл.

Если я запускаю весь сценарий с обоими разделами, раздел чтения получает структуру очень хорошо. Тем не менее, если я закомментирую read section и просто сначала запускаю save section, а закомментирую save section и просто потом запускаю read section. Он сломался и дал ошибку сегментации.

#include <stdio.h>
#include <stdlib.h>

struct Case_dict {
    int full_circ_size;
    int num_clusters;
    int *cluster_circ_sizes;
    struct Cluster *all_cluster_prob;
};

struct Cluster {
    int cluster_idx, num_instance, num_qubits;
    struct Instance *instances;
};

struct Instance {
    int cluster_idx, instance_idx;
    int *init, *meas;
};

int main(int argc, char *argv[])
{
    // Save struct section
    int *init = malloc(4*sizeof(int));
    init[0] = 0;
    init[1] = 1;
    init[2] = 2;
    init[3] = 3;
    int *meas = malloc(4*sizeof(int));
    meas[0] = 4;
    meas[1] = 5;
    meas[2] = 6;
    meas[3] = 7;
    struct Instance *instance = malloc(sizeof(struct Instance));
    instance->cluster_idx = 3;
    instance->instance_idx = 3;
    instance->init = init;
    instance->meas = meas;

    struct Cluster *cluster = malloc(sizeof(struct Cluster));
    cluster->cluster_idx = 3;
    cluster->num_instance = 5;
    cluster->num_qubits = 10;
    cluster->instances = instance;

    printf("Finished building struct Cluster\n");

    FILE *output_fptr = fopen("test.bin","wb");
    fwrite(cluster, sizeof(struct Cluster), 1, output_fptr);
    fclose(output_fptr);

    printf("Finished writing binary\n");

    // Read struct section
    struct Cluster cluster_2;
    FILE *input_fptr = fopen("test.bin","rb");
    fread(&cluster_2, sizeof(struct Cluster), 1, input_fptr);
    fclose(input_fptr);

    printf("cluster_idx = %d, %d instances, %d qubits\n",cluster_2.cluster_idx,cluster_2.num_instance,cluster_2.num_qubits);
    struct Instance *instances_2 = cluster_2.instances;
    int i;
    printf("Instance %d of cluster %d\n",instances_2[0].instance_idx,instances_2[0].cluster_idx);
    printf("init_meas: ");
    for (i=0;i<4;i++) {
        printf("%d ",instances_2[0].init[i]);
    }
    for (i=0;i<4;i++) {
        printf("%d ",instances_2[0].meas[i]);
    }
    printf("\n");
    return 0;
}
...