2

私はファイルにlinked_listを維持するプログラムを書いています。そこで、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));
   }

だからここでは基本的にtellp()の値を長く保存し、長い追加をdngしていますが、これは問題ありませんか?または、pos_valueが大きくなるとビットが失われる可能性がありますか?

4

1 に答える 1

2

tellp / tellg(streampos)によって返されるこれらの値は、使用しているプラ​​ットフォームの最大ファイルサイズを格納することを目的としているため、これらの値が長く収まる保証はありません。実際、ディスクストレージスペースは通常アドレススペースよりも桁違いに大きく、基本タイプは後者を念頭に置いて定義されているため、size_t、long long、または最大の基本タイプには収まらない場合があります。

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

一方、それが実際に巨大なファイルを処理しなければならない場合は、事態はさらに複雑になり、包括的な答えは長くなります。

于 2012-04-08T19:18:35.340 に答える