2009-06-19 6 views
2

데이터를 파일에 쓰고 다시 읽을 수있는 파일 형식을 작성해야합니다.빨리 읽을 수 있도록 파일에 이진 데이터를 쓰는 방법은 무엇입니까?

상당히 큰 데이터 블록을 다시 읽을 수 있어야합니다. (대개의 경우 저장소가 항상 연속적으로 구현되므로) 큰 블록의 데이터를 std::vector에 블리팅해야합니다.

그러나 파일을 작성할 때 int 및 다른 유형의 정렬 및 크기에 제약 조건을 적용하는 방법을 모릅니다.

어떻게해야합니까? Q6600 (x86)에서 gcc를 buntu linux에 사용하고 있습니다. 그냥 예를 들어

:

struct Vertex 
{ 
    float point [3]; 
    float normal [3]; 
    float texcoord [2]; 
} 

은 나중에, 데이터는 std::vector<Vertex>에 저장됩니다. 나는 __attribute__을 사용하는 것에 대해 생각해 봤고 포장/정렬함으로써 다른 플랫폼에서 더 이식성이 높아질 것이라고 생각했습니다.

편집 : 이미 사양을 만들었으며 사용하려고합니다. 데이터의 가장 큰 비트는 꼭지점과 지표이므로 큰 블록으로 읽습니다. 예를 들어 큰 사양의 한 부분 : VertexGroup은 특성을 공유하는 정점 그룹입니다. 한 번에 하나의 자료 만 저장할 수 있으므로 메쉬에 포함 된 자료가 많아야합니다.

<uint> thisid # Of this VertexGroup 
<string> name 
<uint> materialId # A material 
<uint> vertexCount 
for (vetexCount): 
    <3xfloat> point 
    <3xfloat> normal 
    <2xfloat> texcoord 
<uint> triangleCount 
for (triangleCount): 
    <3xuint> indices 

답변

2

이것은 컴파일러와 플랫폼에 따라 다릅니다. 지금까지 내가 아는 한, 많은 컴파일러와 크로스 플랫폼 방식으로 자신의 매크로를 많이 정의하지 않고이를 적용 할 수있는 방법이 없습니다.

그러나 VC++ 및 GCC (큰 두 가지)는 #pragma pack 지시문을 지원하므로 구조체에 대한 정렬 및 패킹을 정의 할 수 있습니다. http://msdn.microsoft.com/en-us/library/2e70t5y1.aspx 또는 http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html을 참조하십시오.

염두에두고 #pragma pack을 사용하여 구조가 정렬되는 방식을 정의한 다음 fread() 또는 이와 유사한 형식으로 바이트를 파일에서 메모리로 블리팅 할 수 있습니다. 목록 전체에 대한 메모리를 한 번에 할당 한 다음 단일 I/O 호출을 사용하여 전체 파일을로드 할 수 있도록 목록 길이에 목록의 접두사를 지정할 수 있습니다.

1

그냥 POD (일반 오래된 데이터), 포인터가없는 경우 다음 fwrite 및 fread 수 있습니다. 물론 이것은 이전과 똑같은 형식을 동일한 아키텍처에서 다시 읽으려고한다는 것을 전제로합니다.

boost serialization을 고려하십시오.

+0

부스트 직렬화는 얼마나 빠릅니까? 이것은 많은 번거 로움을 덜어 줄 수 있으며 어떻게 작동하는지 보는 것이 흥미로울 것입니다. 나는 그것이 배열을 처리하는 방법, 그리고 그것이 얼마나 빠릅니까 (파일에 1000000 버텍스가 있기 때문에 전체 데이터 블럭을 메모리에 blit하지 않는 것이 더 느릴 것입니다). – solinent

+0

여기에 비슷한 질문이 있습니다. http://stackoverflow.com/questions/321619/c-serialization-performance –

관련 문제