如何从大文本文件读取到数组c ++

时间:2013-11-21 13:12:47

标签: c++ arrays file

我正在尝试从一个非常大的文本文件中读取两列,它是一个Web图形,如下所示:(除了它有4000万行)。

1 2

1 3

2 1 ...

所以我想从txt文件中读取myArray [mysize] [2],我使用了代码:

ifstream file("web-graph.txt");
if(file.is_open())
{
    for(int i = 0; i < mysize; i++)
    {
        file >> myArray[i][0];          
        file >> myArray[i][1];
    }
}

问题是读取这么大的文件需要很长时间。那么有没有其他方法从文件中读取不花费这么多时间?

2 个答案:

答案 0 :(得分:0)

是的,可能会受到分析,但你不会喜欢这个答案。 如果使文件变小,可能会更快阅读。怎么样?将其保存为二进制,而不是文本。请注意,这将阻止您使用漂亮的高级流媒体运营商。 你将不得不使用较低级别的东西,这可能会给你更多的加速。
如果你问自己为什么要将整个文件读入内存可能会更好。同样,如果你创建文件二进制文件,你可以seek到你想要的特定行。
如果您正在对文件执行计算,也许您可​​以随时或以块的形式处理它。

答案 1 :(得分:0)

是的,你肯定是以缓慢(但很漂亮)的方式做到这一点。你有两个选择更快:

如果(你有足够的记忆力) {     将整个文件读入内存,然后然后解析文件 }

否则 {    一次将大块文件读入内存,然后解析文件 }

无论哪种方式,加载看起来像这样......

std::ifstream is(filename);
is.seekg(0, std::ios::end);
auto length = is.tellg();

std::string buffer;

if(length > 0)
{
    buffer.resize(static_cast<std::string::size_type>(length));
    is.seekg(0);
    is.read(&buffer.front(), length);
}

然后你会把它放在一个字符串流......

std::stringstream ss(buffer);

并解析它,可能正是你之前的做法......

for(int i = 0; i < mysize; i++)
{
    ss >> myArray[i][0];          
    ss >> myArray[i][1];
}