【问题标题】:Reading a file with variable line lengths c++读取具有可变行长的文件c ++
【发布时间】:2015-06-01 07:29:35
【问题描述】:

我正在尝试制作一个逐行读取文件的程序。 然而,这些行的长度是可变的。

这是程序的流程:

  1. 首先,我会提示用户输入他们要查看的行数
  2. 根据用户的输入,我将输出该行。

我正在考虑两种方法来实现这一点:

  1. 我将使用 getline() 加上一个计数器,一旦它到达该行,然后读取它
  2. 我将使用 seekg 立即跳转到该位置并使用 getline 读取它。(不确定这一点,因为 seekg 按位置搜索);

    我相信 seekg 非常适合使用,因为它比逐行阅读要快(如果可能的话,我想使用 seekg)。 但是,线条有不同的长度,我不确定是否可以轻松找到线条。

    想知道有人可以给我一个建议。

谢谢

【问题讨论】:

  • 如果行是可变长度的,你不能使用任何寻找方法,因为不可能事先知道位置。不幸的是,如果您想要一个简单的解决方案,您必须使用第一个版本(std::getline 和计数器)。
  • 当你打算这样做时,阅读整个文件不是更好吗?然后,您可以创建行开头的索引。或者如果文件太大而无法保存在内存中,您可以先创建索引,然后使用它进行查找。磁盘文件具有二进制性质,行只是分隔它们的特殊序列之间的字节。
  • 你想出了一个非常不可能解决的问题。这几乎就像在问:“如何在不计算字符的情况下获得字符串的长度?我不想计算字符,因为我认为不计算字符比计算字符要快。”
  • 感谢您的快速回复,是的,我只是在想是否可以使用 seekg .. 不幸的是它不是。
  • 这可能不是显着的性能/内存明智,但从概念上讲,调用.ignore(..., '\n') 是优雅的,因为它表明你对getline 之前的行不感兴趣,尽管使用它来反驳可能会使代码复杂一点......

标签: c++


【解决方案1】:

使用get line函数,读取整行(直到new line char '\n')

#include< fstream>
#include< string>
using namespace std;

int main (void)
{
    string line;
    ifstream infile("infile.txt");
    while (getline(infile,line))
    {
        //Process each line data here
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2014-12-19
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多