2010-09-21 130 views
0

说我在一个文件简单的问题

Mesh: 1 
    Vertices: 345 
    Indices: 123 
    V: 1,3,4 1,4,5 .. 
Mesh: 2 
    Vertices: 456 
    Indices: 42 
etc. 

我如何去在任何位置寻求写?例如。我想去网格2或网格3的顶点:网格3等。

什么是正确的方式去做这些事情?

+0

嗯......数据库有人吗? sqlite(http://www.sqlite.org/)也许? – pmg 2010-09-21 23:41:29

回答

3

您通常会使用二进制格式。一种方法是在文件中分配一定量的空间作为头文件。在这里,您将网格编号,顶点和索引计数以及偏移量放入顶点数据开始处的文件中。加载文件时读取头文件,然后找到合适的位置来读取所需的数据。

+0

这个。如果你不知道在哪里找到那个点,那么就没有办法直接找到点,而C只知道字节偏移量,而不知道数据的结构。如果你想保留文本格式,并且你实际上需要在文件中寻找,而不是简单地将它加载到内存中并在那里工作,那么你必须首先解析文件并计算偏移量。 – Porculus 2010-09-21 23:39:43

+0

一般来说,文字是首选。例如参见例如The importance of being textual这个问题似乎很适合纯文本格式。那么,为什么二进制格式? – Arun 2010-09-22 00:39:54

+1

@ArunSaha - 来自你的链接:“二进制协议的唯一正当理由是,如果你要操纵足够大的数据集......大图像和多媒体的格式有时是一个例子......”我不'不同意我自己的许多关于这个链接的内容 - XML是文本的,本质上支持一种向后兼容性,但对人类来说并不健康。 – sje397 2010-09-22 02:15:14

0

打开文件进行读取,然后读取一行,直到读取文件结束(EOF)。对于每个读取行,请检查该行是否与您的查询匹配。如果匹配,报告和返回。否则,转到下一行。

主要的认知工作是检查匹配。有一个明确的格式和容易分析的线路格式,使您的工作变得轻松。

1

在文本文件格式中没有有效的随机查找方式。这是因为在不读取所有内容之前,您无法知道文件中的正确偏移量。处理这些文件的唯一方法是连续的 - 从头到尾。

因此,读取整个文件并将其解析为内存中的某些数据结构。然后根据需要使用此结构而不是文件。

如果文件太大而无法将所有内容都保存在内存中(现在很不可能),请读取文件而不将所有内容都存储在内存中 - 而只是将文件偏移量存储到阵列中每个Mesh的开头。然后,您可以轻松找到正确的地方。

+0

这些天,我不认为一个多TB的数据库是不可能的。怜悯那些面对以这种格式处理纯文本数据集的可怜的傻瓜...... – SingleNegationElimination 2010-09-22 00:00:12

+0

@TokenMacGuy:那么,任何人都必须转储/恢复多TB的SQL数据库。不是每个数据库,但许多默认情况下以文本格式转储。 – 2010-09-22 03:29:59

+0

啊..是的。真正。幸运的是,这些转储并不是在线数据库。但即使在数百兆的情况下,玩起来也不是很有趣。 – SingleNegationElimination 2010-09-22 03:52:06

0

正如其他答案指出的,C只能寻求文件内的字节偏移量。但是,如果您的“网格”对象始终以数字顺序存储在文件中,则不必按顺序读取整个文件即可找到您之后的网格。您可以对该文件执行二进制搜索 - 只要您寻找文件中的某个位置,就可以向前扫描以查找下一个Mesh