чтение структуры внутри структуры из файла - PullRequest
2 голосов
/ 14 марта 2012

Ниже определена структура.

typedef struct{
    int a;
    char b;
}X;
typedef struct{
    X m;
    int c;
    char d;
}B;
B n,q;
n.m.a = 12;
n.m.b = 'a';
n.c = 13;
n.d = 'b';

Я пишу следующую структуру в файле.Файл открывается, как показано ниже.

fp = fopen("D://tests//t11test.txt","wb");
fwrite(&n, sizeof(B), 1, fp);

Файл успешно выполнен, и я проверил содержимое файла, соответствующего fp.Но когда я закрываю и заново открываю файл, когда делаю фред с тем же файлом, я не могу прочитать содержимое подструктуры m.Фред

fp = fopen("D://tests//t11test.txt","rb");
fread(&q, sizeof(B), 1,fp);

Куда я иду не так?

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Я думаю, вы что-то напутали, это работает:

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

typedef struct{
    int a;
    char b;
} X;
typedef struct{
    X m;
    int c;
    char d;
} B;

int main() {
    FILE *fd;
    B n, q;

    n.m.a = 12;
    n.m.b = 'a';
    n.c = 13;
    n.d = 'b';

    if((fd = fopen("test.dat", "wb")) == NULL) {
        fprintf(stderr, "Error opening file: %s\n", strerror(errno));
        exit(-1);
    }

    fwrite(&n, sizeof(n), 1, fd);
    fclose(fd);

    if((fd = fopen("test.dat", "rb")) == NULL) {
        fprintf(stderr, "Error opening file: %s\n", strerror(errno));
        exit(-1);
    }

    fread(&q, sizeof(q), 1, fd);
    fclose(fd);

    printf(
        "n.m.a: %d, q.m.a: %d; n.m.b: %c, q.m.b: %c; n.c: %d, q.c: %d; n.d: %c, q.d: %c\n",
        n.m.a, q.m.a, n.m.b, q.m.b, n.c, q.c, n.d, q.d
    );

    return 0;
}

Вывод:

n.m.a: 12, q.m.a: 12; n.m.b: a, q.m.b: a; n.c: 13, q.c: 13; n.d: b, q.d: b
1 голос
/ 14 марта 2012

Я не вижу, в чем проблема, но, FWIW, это сработало:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <assert.h>

typedef struct{ int a; char b; }X;
typedef struct{ X m; int c; char d; }B;

void print_B(B* a_b)
{
    printf("{ { %d, %c }, %d, %c }",
           a_b->m.a,
           a_b->m.b,
           a_b->c,
           a_b->d);
}

int main()
{
    /* Write structure. */
    {
        FILE* fp;
        B n;
        n.m.a = 12;
        n.m.b = 'a';
        n.c = 13;
        n.d = 'b';
        fp = fopen("x.dat", "wb");
        assert(0 != fp);
        if (1 != fwrite(&n, sizeof(B), 1, fp))
        {
            fprintf(stderr, "Failed to fwrite(): %s\n", strerror(errno));
            return 1;
        }
        fclose(fp);

        printf("wrote: ");
        print_B(&n);
        printf("\n");
    }

    /* Read structure. */
    {
        FILE* fp;
        B q;
        fp = fopen("x.dat", "rb");
        assert(0 != fp);
        if (1 != fread(&q, sizeof(B), 1, fp))
        {
            fprintf(stderr, "Failed to fread(): %s\n", strerror(errno));
            return 1;
        }
        fclose(fp);

        printf("read : ");
        print_B(&q);
        printf("\n");
    }

    return 0;
}

Выход:

wrote: { { 12, a }, 13, b }
read : { { 12, a }, 13, b }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...