2012-04-08 19 views
2

私はリンクされたリストをファイルに保持するプログラムを書いています。だから、私はファイルを横切って、tellp()/ tellg()を使って新しい位置に行くために特定の長い整数(オフセットと見なすことができます)を追加します。tellp()、tellg()の戻り値の型を収集して格納する方法は?

簡単な例は、

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)); 
    } 

はので、ここで基本的に私がいる限りと長いほかのDNG tellp()値を保存していますでしょう、この罰金はあります?またはpos_valueが大きくなるときに私がいくつかのビットを失う可能性がありますか?

答えて

2

tellp/tellg(streampos)によって返されるこれらの値は、使用しているプラ​​ットフォームに最大ファイルサイズを格納するためのものであるため、longに収まる保証はありません。実際には、ディスク記憶領域は通常アドレス空間よりも大きなオーダーであり、基本タイプは後で考えて定義されているため、size_t、long long、または最大の基本型であるとは限りません。

IMOでは、巨大なファイル(DBMSなど)を処理する必要があるプログラムを作成する場合を除き、別の大きな型を使用することはまれです。予想される最大サイズが長い場合は、単にプログラムにセーフガードを入れて、それより大きなファイルの作成や処理を拒否してください。

一方、膨大なファイルを処理しなければならない場合は、作業がかなり複雑になり、包括的な答えが長くなるでしょう。

関連する問題