【问题标题】:Reading a text file without using getline() in C++在 C++ 中不使用 getline() 读取文本文件
【发布时间】:2016-07-15 06:10:31
【问题描述】:

据我所知,要分析一个文本文件,首选方法是逐行分析,既简单又高效。

但是,当我们处理一个包含所有文本的大文件时,getline() 函数肯定根本没有效率。我想知道是否有任何其他有效的方法来分析这个巨大的文件?

我唯一想到的就是将这条大行存储到一个字符串变量中,然后将其剪切为单字。但这听起来仍然根本没有效率。

请帮忙。谢谢!

【问题讨论】:

  • "getline() 函数绝对不会有效率。"你怎么知道?您必须对其进行分析,并确定它是否足以满足您的目的。 C++ 标准库经过高度优化,您可能会感到惊喜。
  • 您实际上想解决什么具体问题?
  • Das:我收回那句话。我想我只是在寻找比 getline() 更好的方法。这是最直接和最标准的方法,但我认为应该有比它更好的方法。
  • Barry:这个问题涉及一个大小超过600MB的txt文件。我被要求在文件中找到特定的模式(例如,所有大写字母的单词)并将它们打印出来。这么大的文件,getline() 函数似乎真的很慢,所以我试图找到一种更好的方法来遍历文件并找到我想要的模式。
  • 魔鬼在细节中,这就是为什么显示文件的前几百个字符可以帮助人们提供有用的建议。例如,适合的单词是空格分隔的,您可以简单地使用while (file_stream >> next_word_string) ...。如果有逗号或其他分隔符,或者您认为包含空格的“单词”(例如“冰淇淋”),那么您也需要更高级的处理。

标签: c++ performance file-io getline


【解决方案1】:

您可以使用std::istream::get(char *, std::streamsize) 将文件的大块读取到适当大的缓冲区中,然后以大块的形式逐个处理文件。

或者,也可以使用特定于操作系统的方法。在 Linux 上,可以使用文件的只读mmap() 来翻阅它,而无需大惊小怪。

【讨论】:

  • while(stream >> next_word) 方法解决了我上面托尼所说的问题。还是谢谢你!
【解决方案2】:

getline 基本上只是处理换行符或其他字符的快捷方式!因此,如果您的文件有一些分隔符(例如分号),您可以使用

std::getline(fileStream, stringToSave, ';');

至于性能 - 你只需要尝试适合你的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多