C++ 如何跳过QFile的N行而不临时存储在qString中?
基本上,如果我调用C++ 如何跳过QFile的N行而不临时存储在qString中?,c++,qt,qfile,C++,Qt,Qfile,基本上,如果我调用QFile::readLine,则QFile的整行将被复制并粘贴到char*或QByteArray中。如果我想跳过999行直接转到感兴趣的行(第1000行),那么我将毫无理由地复制和粘贴前999行,而我只想跳过它们 我知道,istream::ignore允许用户跳过任意数量的字符,直到找到分隔符,所以 std::ifstream file("file.txt"); for (auto i = 0u; i < 999u; ++i) file.ignore(std:
QFile::readLine
,则QFile
的整行将被复制并粘贴到char*
或QByteArray
中。如果我想跳过999行直接转到感兴趣的行(第1000行),那么我将毫无理由地复制和粘贴前999行,而我只想跳过它们
我知道,istream::ignore
允许用户跳过任意数量的字符,直到找到分隔符,所以
std::ifstream file("file.txt");
for (auto i = 0u; i < 999u; ++i)
file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::string str;
getline(file, str); // The 1,000th line is copied & pasted into str
std::ifstream文件(“file.txt”);
用于(自动i=0u;i<999u;++i)
ignore(std::numeric_limits::max(),'\n');
std::字符串str;
getline(文件,str);//第1000行被复制并粘贴到str中
将使您直接进入第1000行,而不会浪费任何时间进行复制和粘贴。如何使用
QFile
执行相同的操作?Qt没有API,用于在不输出读取数据的情况下查找下一个特定字节的文件
不过,你可以靠得很近:
QFile
具有QIODevice::readLine(char*data,qint64 maxSize)
,它读入预分配的缓冲区,可以像这样使用:
QFile f("..."); f.open(...);
int maxSize = 1024; // guess that 1kb will be enough per line
QByteArray lineData(maxSize, '\0');
int skipLines = 100;
while(f.readLine(lineData.data(), maxSize) > 0 && skipLines > 0) {
--skipLines;
}
调用readLine()
将重用预分配的缓冲区
您可以看到,这里的关键部分是猜测哪个预分配大小最好。如果您的行比猜测的长度长,则跳过的行数将少于100行,因为每条较长的行需要多次读取
QTextStream
使用16kb的内部缓冲区大小:
从qtextstream.cpp:
static const int QTEXTSTREAM_BUFFERSIZE = 16384;
QIODevice
使用相同的缓冲区大小:
来自qiodevice_p.h:
#define QIODEVICE_BUFFERSIZE Q_INT64_C(16384)
旁注:
QTextStream
还具有readLineInto(QString*line,qint64 maxlen=0)
,如果maxlen
为0或读取行的长度为line->capacity()
,则动态重新分配line
。但是,由于编码的原因,读入QString
总是比读入QByteArray
慢
但是对于QByteArray
,像readLineInto(…)
这样的函数并不存在
使用
QIODevice::getChar(char*c)
(在OP评论中提出)的解决方案也是合适的,因为它使用与readLine
相同的内部读取缓冲区,每个调用都有一点开销,但是调用者不必担心超过所选缓冲区大小的行。您可以在循环中调用getChar
,直到看到999个换行符。