2012-04-08 7 views
2

Ich schreibe ein Programm, das eine Linked_list in einer Datei verwaltet. Also traversiere ich quer durch die Datei, indem ich tellp()/tellg() benutze und zu einer bestimmten langen Ganzzahl hinzufüge (kann als Offset betrachtet werden), um an den neuen Ort zu kommen.Wie sammeln und speichern Sie tellp(), tellg() Rückgabetypen?

Ein einfaches Beispiel

long next_offset = sizeof(long) + sizeof(int) .... 
    //like size of all the elements in the record, etc 

    curr_node = out.seekg(); 
    while(curr_node != -1) { 
      out.read(...); 
      **curr_node.seekg(curr_node.tellp() + next_offset);** 
      out.read((char *)&curr_node,sizeof(long)); 
    } 

so hier im Grunde Ich spare tellp() Wert, so lange und DNG-eine lange hinaus wäre, ist dies in Ordnung ?? oder besteht die chance, dass ich ein paar bits verlieren kann, wenn der pos_value groß wird ???

Antwort

2

Diese von tell/tellg (streampos) zurückgegebenen Werte sollen die maximale Dateigröße auf der von Ihnen verwendeten Plattform speichern, daher gibt es keine Garantie, dass sie lange zusammenpassen. Tatsächlich passen sie möglicherweise nicht in size_t, long long oder was auch immer der größte grundlegende Typ ist, da der Speicherplatz auf der Festplatte normalerweise um Größenordnungen größer ist als der Adressraum, und die grundlegenden Typen wurden später definiert.

Aber IMO die praktische Sache zu tun ist, nicht einen anderen, größeren Typ zu verwenden, es sei denn, Sie schreiben ein Programm, das wirklich große Dateien (wie ein DBMS oder so) behandeln muss, was ein seltener Fall ist. Wenn die maximal zu erwartende Größe zu lange passt, setzen Sie einfach Sicherheitsmaßnahmen in Ihr Programm, um zu verhindern, dass größere Dateien erstellt oder bearbeitet werden.

Auf der anderen Seite, wenn das in der Tat der Fall ist, dass Sie möglicherweise mit riesigen Dateien umgehen müssen, dann wurde die Dinge viel komplizierter, und eine umfassende Antwort wäre länger.