gpt4 book ai didi

c++ - 快速解析文件?

转载 作者:太空狗 更新时间:2023-10-29 21:05:36 25 4
gpt4 key购买 nike

我正在编写一个应该读取最常见图形格式的图形库。一种格式包含如下信息:

e 4 3
e 2 2
e 6 2
e 3 2
e 1 2
....

我想解析这些行。我在 stackoverflow 上环顾四周,可以找到 neat solution去做这个。我目前使用这样的方法(文件是一个 fstream):

string line;
while(getline(file, line)) {
if(!line.length()) continue; //skip empty lines
stringstream parseline = stringstream(line);
char identifier;
parseline >> identifier; //Lese das erste zeichen
if(identifier == 'e') {
int n, m;
parseline >> n;
parseline >> m;
foo(n,m) //Here i handle the input
}
}

它按预期工作得很好,但今天当我用巨大的图形文件 (50 mb+) 测试它时,我震惊地发现这个函数是迄今为止整个程序中最严重的瓶颈:

我用来解析行的字符串流几乎占总运行时间的 70%,而 getline 命令占 25%。程序的其余部分只使用了 5%。

有没有一种快速读取这些大文件的方法,可以避免缓慢的字符串流和 getline 函数?

最佳答案

您可以跳过双缓冲字符串,跳过解析单个字符,并使用 strtoll 解析整数,像这样:

string line;
while(getline(file, line)) {
if(!line.length()) continue; //skip empty lines
if (line[0] == 'e') {
char *ptr;
int n = strtoll(line.c_str()+2, &ptr, 10);
int m = strtoll(ptr+1, &ptr, 10);
foo(n,m) //Here i handle the input
}
}

在 C++ 中,strtoll应该在 <cstdlib>包含文件。

关于c++ - 快速解析文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9627278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com