2014-03-03 53 views
-3

我需要帮助,使得在C++程序中通过文本文件搜索更高效的方法。更高效地搜索文本文件

该项目规定,我们需要创建姓名,地址和帐号的文本文件。

例如:


弗兰克

1990莫斯利大街

巴拿马市,佛罗里达州,32444

CHL10910454


这是写入文本文件的每个数据块的结构。该程序的用户需要能够搜索数据文件中的特定人员并编辑他们的信息。

我知道平时我会读每一行到一个数组,通过排序数组找到有问题的人的数据,进行更正的阵列和重写整个文本文件。但是,我想知道是否有更有效的方法呢?

主要是,我想知道是否有可能通过文本文件,而不需要将整个文本文件写入到阵列,发现有问题的信息只是块编写为编辑数组进行搜索。 编辑刚刚在考虑的模块后,您将重新插入的数据在它以前 OR 如果我能在最后插入并从文本文件中删除旧版本的数据。

任何帮助将是伟大的! 我确实希望您记住,至今我们不使用前缀std ::。我们在开始时使用“using namespace std”。但是,我的确了解std ::的大部分用法。

感谢您的帮助!

+4

到目前为止,你已经做了什么来解决这个问题?这看起来像一个家庭作业。 – tmaric

回答

1

这是很好的,你在想这件事,但:

  • 在大多数操作系统和文件系统类型

    ,你可以在文件内容覆盖特定字节,但也没有办法插入或删除数据部分方式通过文件,以便后来的数据被移动来创建或填补一个空白:这意味着如果你想用“苏珊”替换“索尼娜”,它可以在原地完成,但如果你将“索尼娅”改为“ Sue“,那么文件中的所有其他部分必须被读取和写入文件中的2个字节(除非您决定使用说空格填充2个不需要的字符,但是如果例如”Tom“更改为“Thomas”)。

  • ,如果你决定去追求这一点,首先需要知道,如果该文件是在关键的排序则需要通过搜索:

    • 如果没有,那么你就必须通读该文件至少在您找到要更改的数据之前,并且如果新数据的长度与旧数据的长度不完全匹配,则无论如何您都需要读取并写出更新后的内容

    • 如果是这样,那么你可以通过文件进行二分搜索来找到要更新的记录,但由于行的变量是len你需要一种启发式方法来识别哪一行是名字,哪个地址,哪个银行账户。如果这些账户都是由大写字母和数字组成的单个“单词”,那么这可能是可能的。对于学习者而言,这是一项相当棘手的任务 - 更容易在内存映射文件上进行二进制搜索,因此您不必担心数据会与您正在阅读的固定大小缓冲区的边缘重叠文件。

  • 许多小程序,它是完美的罚款和实用做“哑巴”的方式 - 数据加载到内存中,然后在其上运行那里,只是写出来,以避免失去工作,如果有一个崩溃和退出,如果有不成文的变化

  • 较大的程序之前,你可以移动到一个数据库

0

通过文件搜索最快的方法就是阅读整个文件进入记忆和搜索记忆。

如果文件中的记录大小固定,可以使用文件定位来标记记录的起始位置。这可以用在索引表中,如std::map<key, file_position>。您将使用该键搜索容器,获取文件位置并从文件位置读取记录。

如果您的记录数量很少,您可能需要将记录读入std::vector。使用std::map<key, vector_index>为您要搜索的每个键创建索引表。这与数据库如何创建搜索索引以加快搜索速度相似。

任何比这更复杂的东西,我建议使用数据库。