2009-02-27 5 views
7

C의 구조체 내용을 텍스트 파일에 쓰려면 어떻게해야할까요? 내가하고 싶은 것은, 내가 지금의 구조는 데이터 멤버 A.one, A.two과 더불어,라고, 그리고 말하고, 나는 그렇게텍스트 파일에 C++ 구조 덤프

같은 텍스트 파일로 라인별로 그들을 밖으로 쓰고 싶어

구조
A.one = 값
A.two 값 = ... =
B.one 값
B.two = 값

기본적 I 만들고 싶어

구조 B 덤프 .. 쉬운 방법이 있나요? 가장 좋은 I/O 방법은 무엇입니까? CFile? iostream? 감사합니다 .. 클래스의 구성원 데이터의 모든 값을 덤프하는 더 쉬운 방법이 있습니까?


편집 : 쓰레기, 고마워 ..

+0

관련 : * [http://stackoverflow.com/questions/234724/how-to-serialize-in-c](http://stackoverflow.com/questions/234724/how-to -serialize-in-c) * [http://stackoverflow.com/questions/523872/how-do-you-serialize-an-object-in-c](http://stackoverflow.com/questions/523872)/how-do-you-serialize-an-object-in-c) – dmckee

답변

8

++ C 없음 반사, 당신은 (simplicty를 들어, iostream을 사용하여) 예를 들어, 수동으로 할 필요가 있도록 :

dump_A(std::cout, "A", a); 

void dump_A(std::iostream& os, const char* name, A const& a) 
{ 
    os << "Structure " << name << '\n' 
     << name << ".one = " << a.one << '\n' 
     << name << ".two = " << a.two << '\n'; 
} 
5

C++은 내성적이 아니다. 즉, 구조의 내용에 대해 아무것도 모릅니다. 이 작업을 수행하려면 일종의 수동 주석 또는 반사 시스템을 사용해야합니다. 물론

, 당신은 구조에 대한 정보를 하드 코딩와 OK 있다면, 당신은 어떤 I/O 방식으로 정보를 덤프 할 수 있습니다. 예를 들어

: 그것은 구조의 친밀한 지식을 필요로하고, 구조가 변경되면 자동으로 업데이트되지 않기 때문에 당신이 지루 볼 수 있듯이

struct A 
{ 
    int member1; 
    char member2; 
}; 

void PrintA (const A& a) 
{ 
    std::printf ("member1: %d\n", a.member1); 
    std::printf ("member2: %c\n", b.member2); 
} 

. 그러나 이것을 제대로 수행하는 반사 시스템의 오버 헤드는 특히 당신이 배우는 경우 단점이 될 수 있습니다.

+0

아마도 C++ 스탠다드 I/O 클래스를 사용하는 것이 더 안전할까요? member1 W member2 유형이 변경되면 코드가 올 Y 르게 작동합니다. – okutane

+0

나는 C++ 스트림 IO를 기본 설정으로 사용하지 않습니다. 여러분은이 경우 다소 안전 할 것 같지만 요점은 struct가 lockstep을 유지하기 위해 코드를 신중하게 업데이트해야한다는 것입니다. 이는 struct의 정의와 상관없이 사실입니다. –

0

이 C++보다 C에 더 적용되지만, 곰 염두에 당신이 쓰는 경우가 직접 구조체 파일 (또는 네트워크 버퍼) 다음 결과는 기계 및 컴파일러가됩니다. 정수는 호스트 바이트 순서로 쓰여지고 구조체의 컴파일러 패딩 바이트도 포함됩니다. 다른 엔디안 또는 다른 컴파일러 지시문이있는 컴퓨터에서 버퍼를 읽으려는 시도가 작동하지 않습니다.

다음과 같은 상황이 발생합니다 (구문에서 용서하십시오) : write (f, & A, sizeof (A));

0

, NO 가상 메소드NO 포인터 :

다음은 튜토리얼에 대한 링크입니다 다음 단기 kludge 같은 은 그냥 사용할 수 :

struct Foo { int a, b; char c, d, e[50]; } f; 
write(fd, & f, sizeof(f)); 

그러나 이것이 동일한 플랫폼에서 크로스 플랫폼 또는 크로스 컴파일러 버전이 될 것으로 기대하지 마십시오.

I think I've discussed this before...

+0

write (fd, ....)에서 fd는 무엇을 의미합니까? 그것이 파일 핸들인가? 그것에는 몇 가지 포인터가 있습니다 .. =/ – krebstar

+0

fd == 파일 설명자, open(). FILE * (fopen에서)을 사용하는 경우 fwrite()를 사용할 수 있습니다. –