Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何跳过QFile的N行而不临时存储在qString中?_C++_Qt_Qfile - Fatal编程技术网

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个换行符。