我的数据在磁盘上的一个大文件中。现在我想在不将此数据转储到单独的文件中的情况下查找此数据的某些部分的大小(以字节为单位)。有没有可能这样做。
例如,假设我的文件有 10000000000 行。现在我想找到 1000000 行的大小。我知道我可以将这 100 行存储在一个单独的文件中并找到它的大小,但我不想这样做。有没有其他的出路,或者这是唯一的出路。
是和不是。您可以读取(但不能存储)您关心的数据,并使用ftell
/tellg
来查找您当前的文件位置。所以,从你关心的开始,得到位置,读到你关心的结尾,再次得到位置,然后减去得到大小。
“是与否”的原因是 C 和 C++ 标准不保证您获得的结果将与磁盘上的数据大小完全匹配。例如,如果你在 Windows 上,换行符会在外部的 "\r\n" 和内部的 "\n" 之间转换——标准并没有说明这将被计为一个字符还是两个字符。
如果这还不足以满足您的目的,您可以一次读取一个字符并计算字符数。有了这个,您可以在您认为合适的时候考虑平台的变幻莫测(例如,\n
在 Windows 下为计数添加一个额外的字符)。
如果您知道如何找到您关心的部分的开头和结尾,那么您可以使用fstream::tellg()
(或在 C 中使用ftell(file)
)作为起点并从终点减去fstream::tellg()
。但是,如果您没有简单的方法来找到起点和终点,则只能通读文件直到找到您关心的位,然后计算内容的大小直到找到终点。
您可以在感兴趣的部分的开头使用ftell
()/ (),而不是扫描到该部分的末尾,再次调用相同的函数,并计算差值,这将是该部分的大小。fgetpos
但是请记住,ftell
在文本文件与二进制文件不同的系统(例如 Windows)上处理文本文件时, () 可能会混淆。