相关疑难解决方法(0)

用c ++快速读取文本文件

我目前正在用c ++编写一个程序,其中包括阅读大量的大文本文件.每行有~400.000行,极端情况下每行有4000或更多字符.仅供测试,我使用ifstream和cplusplus.com提供的实现读取其中一个文件.花了大约60秒,这太长了.现在我想知道,有没有一种直接的方法来提高阅读速度?

编辑:我使用的代码或多或少是这样的:

string tmpString;
ifstream txtFile(path);
if(txtFile.is_open())
{
    while(txtFile.good())
    {
        m_numLines++;
        getline(txtFile, tmpString);
    }
    txtFile.close();
}
Run Code Online (Sandbox Code Playgroud)

编辑2:我读的文件只有82 MB大.我主要说它可以达到4000,因为我认为可能有必要知道为了做缓冲.

编辑3:谢谢大家的答案,但考虑到我的问题似乎没有太大的改进空间.我必须使用readline,因为我想计算行数.将ifstream实例化为二进制文件也不会使读取速度更快.我将尝试尽可能地并行化它,至少应该起作用.

编辑4:显然我可以做一些事情.非常感谢你花了这么多时间,我非常感激!=)

c++ io performance ifstream

58
推荐指数
4
解决办法
6万
查看次数

如何快速解析C++中以空格分隔的浮点数?

我有一个包含数百万行的文件,每行有3个以空格分隔的浮点数.读取文件需要花费大量时间,因此我尝试使用内存映射文件读取它们,但发现问题不在于IO的速度,而在于解析速度.

我当前的解析是获取流(称为文件)并执行以下操作

float x,y,z;
file >> x >> y >> z;
Run Code Online (Sandbox Code Playgroud)

Stack Overflow中的某些人建议使用Boost.Spirit,但我找不到任何简单的教程来解释如何使用它.

我正在尝试找到一种简单有效的方法来解析看起来像这样的行:

"134.32 3545.87 3425"
Run Code Online (Sandbox Code Playgroud)

我真的很感激一些帮助.我想用strtok来分割它,但我不知道如何将字符串转换为浮点数,我不太确定它是最好的方法.

我不介意解决方案是否会提升.我不介意它是不是有史以来最有效的解决方案,但我确信它可以加倍速度.

提前致谢.

c++ parsing boost-spirit

34
推荐指数
3
解决办法
2万
查看次数

strstream可以直接使用标准字符串的缓冲区吗

鉴于strstream有以下构造函数:

strstream( char* s, int n, std::ios_base::openmode mode);
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以直接在“只读”模式下使用标准字符串底层的缓冲区,以避免缓冲区重新分配产生奇怪的副作用:

std::string buffer("Dummy Data");
std::strstream ss(
  const_cast<char *>(buffer.data()), buffer.length(), std::ios_base::in);

std::string other;
ss >> other;
std::cout << other << std::endl;
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,上面的代码最终生成了other一个空字符串。在文档中有一个示例,其中C 数组用作 的静态缓冲区strstream,所以我想知道它不能使用缓冲区内容的原因是什么std::string

注意:我无法使用,std::stringstream因为相关平台的 VS 实现仅限于 4GB 大小,如此处所述


更新:

我发现使用std::ios_base::app(如示例中所示)几乎可以使我的代码正常工作。现在最大的问题(根据我收到的评论)是它strstream已被长期弃用。也许boost iostreams中有一些东西可以提供帮助,但我不太了解该库。

c++ stringstream c++11

8
推荐指数
1
解决办法
189
查看次数

标签 统计

c++ ×3

boost-spirit ×1

c++11 ×1

ifstream ×1

io ×1

parsing ×1

performance ×1

stringstream ×1