2011-02-25 6 views
0

구조체 포인터를 파일에 쓰려고합니다. 내가 뭘 하려는지, 문자 버퍼에 구조 포인터를 작성한 다음 버퍼에서 포인터를 검색하고 마지막으로 전체 구조를 파일에 쓰는 것입니다.fwrite를 사용하여 구조체 포인터를 파일에 쓰기

전체 구조를 쓰는 대신 파일에 정크 데이터가 나타납니다.

코드에 내용이 누락되었거나 실수를했습니다.

전체 테스트 코드 붙여 넣기.

#include <stdio.h> 
# include<stdlib.h> 
#include <string.h> 
typedef struct dummy_s { 

    int a; 
} dummy_t; 

void main(int argc, char* argv) 
{ 


    char *s1; 
    s1 = malloc(sizeof(dummy_t)*1000); 
    dummy_t * tmp1; 
    tmp1 = (dummy_t *)s1; 
    tmp1 -> a = 100; 
    FILE *f; 
    f = fopen("dummyfile.txt","w"); 
    dummy_t * tmp = NULL; 
    tmp = malloc(sizeof(dummy_t)); 
    memcpy(tmp, s1, sizeof(dummy_t)); 
    fwrite(tmp,sizeof(struct dummy_s),1,f); 
    fclose(f); 
} 

[편집 오류에 대한 편집 - 죄송합니다] 건배! 나렌

+0

fwrite()를 호출해도 컴파일 ...합니까? (나는 C 컴파일러를 편리하게 가지고 있지 않다.) –

+4

어떤 미친 작업들 ... – pmod

+1

memcpy (tmp, d, sizeof (dummy_t));에서 "d"는 무엇인가? – pmod

답변

0

구조체를 텍스트 또는 이진 파일로 파일에 쓰고 싶습니까?

텍스트로 쓰려면 먼저 sprintf를 사용하여 숫자를 텍스트 표현으로 변환하십시오.

char buf[100]; 
sprintf (s, "%d", tmp->a); 

그런 다음 fputs를 사용하여 파일에 buf를 작성하십시오.

이진 파일을 만들려면 "w"가 아닌 "wb"로 파일을여십시오. 그렇지 않으면 런타임이 특정 문자를 다른 문자로 변환 할 수 있습니다 (예 : 개행 문자가 캐리지 리턴 + 줄 바꿈). "wb"의 'b'는 파일 변환을 전혀 수행하지 않고 바이너리 방식으로 파일을 쓰고 싶다는 것을 fopen에게 알려줍니다.

1

미안하지만, 약간 무례 할 것입니다. 코드 스 니펫을 게시하는 경우 올바르게 컴파일되었는지 확인하십시오. 귀하의 코드는 정의되지 않은 변수 "d"를 사용하고 있으며, "sizeof dummy"를 취합니다. (적어도 코드에는 없지만 여기에 더미가 표시되지 않습니다.) #include가 누락되었습니다. 에스.

(d 대신 tmp1을 사용하여) 컴파일 오류를 수정하면 올바르게 작동하는 것 같습니다. 생성하는 "텍스트 파일"에는 텍스트 형식이 아닌 구조의 이진 표현이 포함됩니다. (32 비트 리틀 엔디 언 머신을 가정하면 100의 값을 갖는 바이트와 4의 값을 갖는 0이 그물이됩니다).

마지막으로 malloc과 memcpy가 필요하지는 않지만 fwrite는 원래 배열의 내용을 직접 작성할 수 있어야합니다.

+0

@Partick 및 @Lindydancer 안녕하세요, 컴파일 문제로 죄송합니다. 내 실수. 그것이 작동하는 방법은 먼저 구조체가 버퍼에 기록 된 다음 버퍼에서 추출되어 파일에 기록됩니다. 따라서 버퍼 "s1". 앞서 언급 한 시나리오는 구조체를 한 번 작성하는 것과 관련이 있습니다. 그러나, 나는 여러 번 구조를 쓰려고합니다. 나는 이것이 "tmp1", "malloc"및 "memcpy"에 대한 필요성을 설명해야한다고 생각합니다. – tracemein

관련 문제