如何收集和存储tellp(),tellg()返回类型?

时间:2012-04-08 18:37:36

标签: c++ file type-conversion long-integer fstream

我正在编写一个在文件中维护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()值为long和dng长期添加,这很好吗?或者当pos_value变大时我是否有可能失去一些位?

1 个答案:

答案 0 :(得分:2)

tellp / tellg(streampos)返回的这些值用于存储您正在使用的平台中的最大文件大小,因此无法保证它们适合长时间。事实上,它们可能不适合size_t,long long或任何最大的基本类型,因为磁盘存储空间通常比地址空间大几个数量级,并且基本类型是在考虑到后者时定义的。

但IMO要做的事情就是不要使用另一个更大的类型,除非你正在编写一个真正需要处理大文件的程序(比如DBMS左右),这是一种罕见的情况。如果最大预期大小适合长期,只需在程序中放置保护措施,拒绝创建或处理大于此的文件。

另一方面,如果您确实需要处理大量文件,那么事情会变得复杂得多,而且全面的答案会更长。