我需要帮助制作一种更有效的方法来搜索C ++程序中的文本文件。
该项目指定我们需要创建名称,地址和帐号的文本文件。
例如:
谢
1990 Mosley Avenue
巴拿马城,佛罗里达州,32444
CHL10910454
这将是写入文本文件的每个数据块的结构。程序的用户需要能够搜索数据文件中的特定人员并对其信息进行编辑。
我知道通常我会将每一行读入一个数组,对数组进行排序以查找有问题的人员数据,对数组进行更正并重写整个文本文件。但是,我想知道是否有更有效的方法呢?
主要是,我想知道是否可以在不将整个文本文件写入数组的情况下搜索文本文件,找到有问题的信息块并将其写入数组进行编辑。 仅编辑相关块后,您将重新插入之前的数据 要么 如果我可以在最后插入它并从文本文件中删除旧版本的数据。
任何帮助都会很棒! 我确实希望你记住,到目前为止我们还没有使用前缀std ::。我们在一开始就使用“using namespace std”。但是,我确实理解大多数情况下使用std ::。
感谢您的帮助!
答案 0 :(得分:1)
你想到这个很好,但是:
在大多数操作系统和文件系统类型中,您可以覆盖文件内容中的特定字节,但是无法在文件中部分插入或删除数据,以便以后的数据被移动以创建或填补空白:这意味着如果你想用“Susan”替换“Sonya”,它可以就地完成,但如果你将“Sonya”改为“Sue”,那么所有文件的其余部分必须再读取和写入2个字节在文件中转发(除非您决定用空格填写2个不需要的字符,但是如果“Tom”改为“Thomas”,那么你仍然会被卡住。)
如果您决定继续这样做,首先需要知道文件是否按照您需要搜索的密钥进行排序:
如果没有那么你至少要读完文件,直到找到要更改的数据,如果新数据的长度与旧数据的长度不完全匹配那么你此后,无论如何都需要阅读和写出更新的内容
如果是这样,那么你可以通过文件进行二进制搜索以找到要更新的记录,但由于这些行的长度可变,你需要一种启发式方法来识别哪一行是名称,地址,哪个银行账号。如果帐户都是由大写字母和数字组成的单个“单词”,那么这可能是可能的。对于学习者来说这是一项相当棘手的任务 - 更容易在内存映射文件上进行二进制搜索,这样您就不必担心数据重叠在固定大小的缓冲区边缘,您正在读取部分内容文件。
对于许多小程序来说,完全没问题,实用以“哑”的方式做到 - 将数据加载到内存然后在那里进行操作,只需将其写出来以避免如果发生崩溃,在退出之前,如果有不成文的变化,则会失去工作
对于较大的程序,您可以移动到数据库
答案 1 :(得分:0)
搜索文件的最快方法是将整个文件读入内存和搜索内存。
如果文件中的记录具有固定大小,则可以使用文件定位来标记记录的开始位置。这可以在索引表中使用,例如std::map<key, file_position>
。您将使用键搜索容器,获取文件位置并从文件位置读取记录。
如果您的记录数量很少,您可能希望将记录读入std::vector
。使用std::map<key, vector_index>
为要搜索的每个键创建索引表。这类似于数据库创建搜索索引以加速搜索的方式。
比这更复杂,我建议使用数据库。