【发布时间】:2015-06-01 07:29:35
【问题描述】:
我正在尝试制作一个逐行读取文件的程序。 然而,这些行的长度是可变的。
这是程序的流程:
- 首先,我会提示用户输入他们要查看的行数
- 根据用户的输入,我将输出该行。
我正在考虑两种方法来实现这一点:
- 我将使用 getline() 加上一个计数器,一旦它到达该行,然后读取它
-
我将使用 seekg 立即跳转到该位置并使用 getline 读取它。(不确定这一点,因为 seekg 按位置搜索);
我相信 seekg 非常适合使用,因为它比逐行阅读要快(如果可能的话,我想使用 seekg)。 但是,线条有不同的长度,我不确定是否可以轻松找到线条。
想知道有人可以给我一个建议。
谢谢
【问题讨论】:
-
如果行是可变长度的,你不能使用任何寻找方法,因为不可能事先知道位置。不幸的是,如果您想要一个简单的解决方案,您必须使用第一个版本(
std::getline和计数器)。 -
当你打算这样做时,阅读整个文件不是更好吗?然后,您可以创建行开头的索引。或者如果文件太大而无法保存在内存中,您可以先创建索引,然后使用它进行查找。磁盘文件具有二进制性质,行只是分隔它们的特殊序列之间的字节。
-
你想出了一个非常不可能解决的问题。这几乎就像在问:“如何在不计算字符的情况下获得字符串的长度?我不想计算字符,因为我认为不计算字符比计算字符要快。”
-
感谢您的快速回复,是的,我只是在想是否可以使用 seekg .. 不幸的是它不是。
-
这可能不是显着的性能/内存明智,但从概念上讲,调用
.ignore(..., '\n')是优雅的,因为它表明你对getline之前的行不感兴趣,尽管使用它来反驳可能会使代码复杂一点......
标签: c++