我需要读取在进行一些计算时正在增长的最后一行文件。一开始没有问题,因为文件很小,但是当文件变大时,阅读过程会变慢。
while(!file.eof()){
if ((std::getline(file,line))){
std::istringstream iss(line);
std::istream_iterator<double> it(iss), end;
std::vector<double> v(it, end);
std::copy(v.begin(), v.end(), arr);
v.clear();
line.clear();
}
}
什么是更有效的方式来读取文件的最后一行而不读取所有文件直到结束?
答案 0 :(得分:0)
使用seekg()
跳转到文件末尾,然后向后阅读 - 就像这样
if(fs.is_open())
{
fs.seekg(-1, std::ios_base::end);
if(fs.peek() == '\n')
{
fs.seekg(-1, std::ios_base::cur);
int i = fs.tellg();
for(i;i > 0; i--)
{
if(fs.peek() == '\n')
{
//Found
fs.get();
break;
}
fs.seekg(i, std::ios_base::beg);
}
}
std::string lastline;
getline(fs, lastline);
答案 1 :(得分:0)
使用此算法:
您可以反向搜索换行符并向前复制,或者只是反转反向行,或者您可以复制到双端队列的前面,以便在复制时反转该行,但也许最快可能是保持颠倒并使用反向迭代器处理它,具体取决于你打算用线做什么。