【发布时间】:2018-01-03 16:56:21
【问题描述】:
我有一个需要读入的文件。文件的每一行都非常长,所以我宁愿不要将每一行读入一个临时字符串然后操作这些字符串(除非这实际上不是低效的 -我可能是错的)。文件的每一行都包含一串三元组 - 两个数字和一个复数,用冒号分隔(与复数中使用的逗号相反)。我当前的代码是这样的:
while (states.eof() == 0)
{
std::istringstream complexString;
getline(states, tmp_str, ':');
tmp_triplet.row() = stoi(tmp_str);
getline(states, tmp_str, ':');
tmp_triplet.col() = stoi(tmp_str);
getline(states, tmp_str, ':');
complexString.str (tmp_str);
complexString >> tmp_triplet.value();
// Then something useful done with the triplet before moving onto the next one
}
tmp_triplet 是存储这三个数字的变量。我想要某种方法来每行运行一个函数(具体来说,每行中的三元组被推入一个向量,文件中的每一行表示一个不同的向量)。我确信有一个简单的方法可以解决这个问题,但我只是想要一种方法来检查是否已到达行尾,并在这种情况下运行一个函数。
【问题讨论】:
-
您不必阅读整行。你可以读取一个块,比如 4kb 然后解析它,即搜索
:。完成该块后,您保留该块的其余部分并将下一个附加到剩余部分的末尾。如果遇到 EOL,则对向量进行处理。此外,读取整行是否效率低下实际上取决于您拥有多少 RAM 以及行有多长。如果每行最多说 10Mb,那么我就不会为分块算法而烦恼,我会立即阅读整个内容。那么这些线有多大? -
@freakish,每行大约 1Mb。所以听起来把整个东西读成一个字符串就可以了?
-
@wayward_vagabound 好吧,我假设我们正在谈论可用的 Gbs RAM?如果是这样的话,是的,没关系。 1Mb 对现代计算机来说毫无意义。
-
还有一个更一般的建议:首先要确保正确性。然后简单。最后是性能。过早的优化是万恶之源。