2011-01-16 2 views
1

내가 어떤 파일에 헤더를 저장 말할 수 있습니다 만, 헤더의 일부는 동적 길이가 보일 것 같은 뭔가가 : 구조체에 동적 데이터를 읽기위한 섬세한 방법은C++ : 동적 데이터를 구조체로 우아하게 읽는 방법?

struct HeaderTest { 
    int someparam; 
    int more; 
    int arrsize;  // how big array, read arrsize elements into arr: 
    int arr[arrsize]; // not valid 
}; 

있습니까?

+2

어떤 데이터가 있습니까? 어디서 읽으시겠습니까? * "동적 데이터"* 란 무엇입니까? – Nawaz

+1

예를 들어 더 좋지 않습니까? 'std :: vector'를 마지막 멤버로 사용합니까? 귀하의 질문에 대한 "역동적 인"데이터를 deserialization로 저장에 대한 많은 것 같다. –

+0

arrsize를 모른 채 배열 대신 int의 벡터를 사용할 수 있습니다. – DumbCoder

답변

2

글쎄, 컨테이너 클래스를 사용하고 싶지 않다면 (왜 그런지 모르겠다) arr을 int에 대한 포인터로 선언하고 클라이언트에 남겨두고 포인터를 유효한 메모리 위치로 초기화 할 수있다 arrsize를 올바르게 초기화 할 수 있습니다.

그렇다면 벡터를 사용해야합니다. 왜 필요 이상으로 어려워 지나요? 대신 당신의 구조체에 arrarrsize 변수를 갖는

6

,이처럼 구조체를 정의 할 수 있습니다 :

struct HeaderTest 
{ 
    int someparam; 
    int more; 
    std::vector<int> data; 
} 

없음 편곡, 아니 arrsize을. std::vectorstd::vector::size()을 사용하면됩니다. 그것은 우아하다!

그리고 당신은 파일에서 이진 데이터를 읽으려면, 다음과 같이 쓸 수 있습니다 :

struct HeaderTest 
{ 
    int someparam; 
    int more; 
    int size; 
    char *data; 
} 

그렇지 않으면, 최초의 구조체로 간다!


조언 :

어디서나 귀하의 의견을 읽고, 나는 당신이 좋은 책을 얻을 제안, 먼저 공부해야한다고 생각합니다. 나는 매우 우아한 방법이라고 생각하지 않습니다

The Definitive C++ Book Guide and List

+1

데이터의 길이를 모르는 경우 어떻게 구조체에 파일 데이터를 읽습니까? – Newbie

+0

-1 바이너리 데이터를 벡터로 읽을 수 없습니다. –

+0

@Newbie : 파일 데이터를 읽을 수 있고, push_back을'data.push_back (file_data_int)'처럼 벡터에 넣을 수 있습니다. – Nawaz

0

: 여기 정말 좋은 책의 목록입니다. 아마도 동적 멤버를 포인터로 만들고 다른 모든 멤버를 먼저 읽고 마지막 것에 메모리를 할당 한 다음 나머지 데이터를 읽어야합니다.

C++을 사용하기 때문에이 코드를 클래스에 멋지게 캡슐화 할 수 있으므로 더 이상 코드에서이 세부 사항을 염려 할 필요가 없습니다. 또한 다른 사람들이 말했듯이 std::vector은 간단한 포인터와 수동으로 할당 된 메모리보다 C++과 같은 방식입니다. 또한 메모리 누수에 대한 저항력도 커집니다.

+0

"당신은 멋지게 이것을 클래스에 캡슐화 할 수 있습니다."무슨 뜻인지는 모르겠지만, 1 행의 코드로 헤더를 읽으면 자동으로 arrsize 요소의 벡터를 할당하고 거기에있는 요소를 읽습니다. 그리고 이것은 다른 구조체에서도 작동 할 것입니다 (거의 없거나 전혀 작동하지 않습니다)? 이 클래스 메서드가 어떤 예제를 보여줄 수 있습니까? – Newbie

+0

"한 줄의 코드"가 필요한 이유는 무엇입니까? –

+0

한 줄에 의해 나는 모든 구조체에 대해 수동으로 독자 기능을 나누지 못하게하는 몇 가지 방법을 의미합니다. 내가 struct를 작성하고 fread()를 호출하는 방법이 있다면, 필요한 모든 할당을 할 것이고 struct는 사용할 준비가 될 것입니다. – Newbie

1

이 답변은 C++보다 C이지만, realloc()을 사용하여 버퍼 크기를 필요한만큼 크게 조정할 수 있습니다. 이 의사 코드에서 보여 주듯이.

struct HeaderTest { 
    int someparam; 
    int more; 
    int arrsize; 
    int arr[]; 
}; 

HeaderTest* pkt = (HeaderTest*)malloc(sizeof(HeaderTest)); 
read(&pkt,sizeof(pkt)); 
pkt = (HeaderTest*)realloc(pkt,sizeof(HeaderTest)+sizeof(pkt->arr[0])*pkt->arrsize); 
read(pkt->arr,sizeof(int)*pkt->arrsize); 
+0

'int arr []; 허용 되었습니까? – Nawaz

+3

예. []는 크기를 알 수없는 배열을 나타내며 모든 구조체의 마지막 요소가 될 수 있습니다. –

0

아무도 내가 원하는 해결책을 줄 수는 없었지만 나는 그것을 고안했습니다. 이 함수는 C 문자열 파일 이름을 사용하여 파일을 열고 내용을 읽습니다. t.container에 할당 할 수있는 int *를 반환합니다. 즐겨.

int* read(char* filename) 
{ 
    // open file 
    ifstream f; 
    f.open(filename, ios::binary); 
    // get file size 
    f.seekg (0, ios::end); 
    int length = f.tellg(); 
    f.seekg (0, ios::beg); 
    // allocate new int* 
    length = (length -(sizeof(int)*2))/sizeof(int); 
    int* buf = new int[length]; 
    for(int i = 0; i < length; ++i) 
    { 
     // create byte array to hold bytes 
     unsigned char* temp = new char[sizeof(int)]; 
     stream.read((char*)temp, sizeof(int)); 
     // convert byte array to int 
     for(int j = 0; j < sizeof(int); ++j) 
     { 
      buf[i] = buf[i] + (temp[j] << (j*8)); 
     } 
     delete[] temp; 
    } 
    f.close(); 
    return buf; 
} 
관련 문제