我正在创建.txt文件,其中包含许多不同长度的行。
编辑:我需要构建某种数据库,不必是.txt文件 第一阶段是建立数据库 - O(n)
数据库需要包含(line_number,line_content)
在第二阶段 - 我的目标是在O(1)或O(log n)中搜索特定行。找到该行后,返回O(1)之后的每一行并处理它。
search line() -> O(1) or O(log n)
while (!End_Of_Lines)
{
bring next line() -> 0(1)
process_line()
}
有没有办法在O(1)或O(log n)而不是O(n)中返回指向特定行的指针?
如果.txt文件不是很好主意,还有其他方法来维护这样的行结构吗?
感谢。
答案 0 :(得分:2)
你必须问自己一个问题: c ++中文本文件中的行是什么?
答案是:这是一系列以\n
或\r\n
结尾的字符。
因此,为了说明有多少行,您需要扫描整个文件,并在执行此操作时,可能存储行开始/结束位置。
你的问题很模糊,所以我假设你想要阅读文件并立即开始搜索。如果是这种情况,则无法在不扫描整个文件(或文件的一部分直到您的线路)的情况下找到一条线。
但是,如果您的意思是读取文件,解析它并搜索一行,那么可以使用不同的搜索算法缩短搜索时间。但是,你真的不是在搜索文件而是搜索其他结构了。
修改强>
要进一步编辑,假设特定行表示特定行号,则需要先解析文件,对于找到的每个eol
,您必须将行存储在容器中,可能{{1} }。如果那时你想处理从行std::vector <std::string>
开始的所有行,那么你做(假设x
是你的容器):
vec
答案 1 :(得分:0)
如果您需要在同一输入文件上重复执行此操作,则可以构建每行开始位置的索引,并使用该索引查找每一行。
因为线条不是已知的&#34;对于文件系统,C ++ std::stream
等,除了&#34;文件中的一个文本块由换行符&#34;分隔,没有简单的方法来确定下一行开始的位置从给定行的开头。因此,无论如何,您必须将文件读取到N行的点,以了解N行的起始位置。