2012-03-14 7 views
2

아래 정의 된 구조가 있습니다.파일에서 구조 내의 구조 읽기

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

파일에서 다음 구조체의 fwrite를 수행합니다. 파일은 다음과 같이 열립니다.

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

fwrite가 성공했으며 fp에 해당하는 파일의 내용을 확인했습니다. 그러나 파일을 닫은 후 다시 열 때 동일한 파일에서 fread를 할 때 하위 구조 m의 내용을 읽을 수 없습니다. 이 fread는

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

어디에서 잘못 되었습니까?

+0

"읽을 수 없음"이란 무엇을 의미합니까? –

+0

원본 파일의 내용을 깬 모드로 파일을 다시 열어 본 것 같습니다. 재생산 프로그램을 게시 할 수 있습니까? – sarnold

+0

@ Karoly ** int ** ** 및 ** char d ** 값을 올바르게 읽습니다. 하부 구조 X **의 구성원은 올바르게 읽히지 않습니다. @sarnold "wb"모드로 파일에 쓰고 구조를 읽으려면 "rb"로 다시 엽니 다. 사실 두 가지 프로그램이 있습니다. 하나는 파일에 구조체를 쓰고 다른 하나는 읽어들입니다. –

답변

1

내가 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 } 
+0

답해 주셔서 감사합니다. 그것의 일하는 ... 나는 내 문제를 알게 할 것이다. –

+0

문제는 없지만 문제가 무엇인지 알아내는 데 관심이 있습니다. – hmjd

1

이 작동 :

#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