2017-09-14 7 views
0

원하는 유형의 모든 유형을 가져올 수있는 배열을 시뮬레이트하는 고전적인 연결 목록을 만들었습니다. 물론 장기를 삭제하고 추가 할 수 있으며 모든 방법이 올바르게 작동합니다.링크 된 목록의 데이터를 저장하고 바이너리 파일로로드 C++

이제 바이너리 파일을 쓰고 읽는 방법을 써야하고 무엇을해야할지 모르겠다. 파일에 쓰기 위해 여러 가지 방법을 시도했으며 지금까지는 할 수 없었다. 어디서든 얻을 수 및 심지어 코드를 잘못 모르는, 내 연결리스트 코드

template <class T> 
class LinkedList 
{ 
private: 
    struct node 
    { 
     T data; 
     node * next; 
    }; 
    node* head; 

public: 
    LinkedList(); 
    ~LinkedList(); 

    void add(T value); 
    int find(T value); 
    bool remove(T value); 
    void clear(); 
    bool ifEmpty() const; 
    int size() const; 
    void display() const; 
    T getData(int index) const; 

    T &operator[](int index); 


    void save(ofstream& out); 
}; 

그게 전부 부분을 작업

template <class T> 
void LinkedList<T>::save(ofstream& out) 
{ 
    node* temp = head; 
    T temp2 = temp->data; 

    for (int i = 0; i < size(); i++) 
    { 
     out.write((const char*)(temp2), sizeof(temp2)); 
     temp = temp->next; 
     temp2 = temp->data; 
    } 
} 
012 dosent 저장 방법의 코드를 먹으 렴

당신 중 일부는 내게 올바른 방법을 지시 줄 수 있는지 제발 ...

+3

"직렬화"를 찾으십시오. 'T'가 포인터를 읽으면 포인터를 돌려주는 것이 유용하지 않습니다. – nwp

+1

네, 내가 무슨 말을하는지 이해하지만 포인터 나 무언가를 사용하지 않도록 예외를 던질 수 있습니까? – user8093201

+0

'T '에 포인터가 포함되어 있는지 알아내는 것은 쉽지 않습니다. 그것이 '사적인'회원이라면? 일반적으로 다양한'T'에 대해'std :: string to_string (const T & t)'와'T from_string (const std :: string & s)'함수를 씁니다. 'int'와 같은 일부 유형의 경우 사용자가 직접 정의해야하는 유형을 위해 직접 구현할 수 있습니다. [시리얼] (https://uscilab.github.io/cereal/)과 같은 도서관도보십시오. – nwp

답변

0

먼저 목록의 크기를 써야합니다. 이렇게하면 목록을 읽을 수 있습니다. 크기를 읽지 않아도 파일 읽기를 중단 할시기를 결정할 방법이 없습니다.

또한 오류가 발생했습니다. 라인

 out.write((const char*)(temp2), sizeof(temp2)); 

 out.write((const char*)(&temp2), sizeof(temp2)); 
           ^^ Missing 

template <class T> 
void LinkedList<T>::save(ofstream& out) 
{ 
    size_t sz = size(); 
    out.write((const char*)(&sz), sizeof(sz)); 

    node* temp = head; 
    T temp2 = temp->data; 

    for (int i = 0; i < size(); i++) 
    { 
     out.write((const char*)(&temp2), sizeof(temp2)); 
     temp = temp->next; 
     temp2 = temp->data; 
    } 
} 

잠재적 인 읽기 구현해야합니다.

template <class T> 
void LinkedList<T>:read(ifstream& in) 
{ 
    size_t sz = 0; 
    in.read((char*)(&sz), sizeof(sz)); 

    // Make sure that list is empty 

    for (size_t i = 0; i < sz; ++i) 
    { 
     T temp; 
     in.read((char*)(&temp), sizeof(temp)); 

     // Add temp to the list. 
     add(temp); 
    } 
} 

size()가 올바른 값을 반환하는 경우 널 포인터 액세스 문제를 해결해야 save의 업데이트 된 버전.

template <class T> 
void LinkedList<T>::save(ofstream& out) 
{ 
    size_t sz = size(); 
    out.write((const char*)(&sz), sizeof(sz)); 

    node* temp = head; 
    for (int i = 0; i < size(); i++) 
    { 
     // Pull the data out of the pointer here. 
     // At this point, temp should not be NULL. 
     T temp2 = temp->data; 
     out.write((const char*)(&temp2), sizeof(temp2)); 
     temp = temp->next; 
    } 
} 
+0

도움을 주셔서 고맙다, 나는 당신의 길을 시험해 보았다. 그러나 그 계속 깔아 뭉갠다. 그리고 나는 이유를 알고있다, 내가 당신이 그것을 틀리게 쓰는 주류에서 그것을 사용하는 방법 thats를 알고있다? 'ofstream outFile ("test.txt", ios :: binary); \t \t iList.save (outFile); \t \t outFile.close(); ' – user8093201

+0

@ user8093201, 디버거를 사용해보십시오.'ofstream'과'save()'함수를 사용하면 나에게 잘 어울린다. 문제는 다른 곳에서 발생할 가능성이 큽니다. –

+0

디버거는 temp가 null ptr이므로 예외를 던져서 지금은 파기하지 않는다고했지만 문제는 내가 검사를 위해 txt 파일을 작성하려고해도 gibrish에서 만든 파일을 열면 알고있는 방법이 있다는 것입니다. 확실히 그 데이터를 복사하는 경우 올바른 데이터입니까? – user8093201