gpt4 book ai didi

c++ - 如何跳过 QFile 的 N 行而不临时将它们存储在 QStrings 中?

转载 作者:行者123 更新时间:2023-11-28 04:17:49 24 4
gpt4 key购买 nike

基本上,如果我调用QFile::readLineQFile 的整行将被复制并粘贴到char*QByteArray。如果我想跳过 999 行直接转到感兴趣的行(第 1,000 行),那么我将无缘无故地复制和粘贴前 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

会让您直接进入第 1,000 行,而无需浪费任何时间进行复制和粘贴。我怎样才能用 QFile 做同样的事情?

最佳答案

Qt 没有用于在不输出读取数据的情况下查找文件到下一个特定字节的 API。

不过,您可以非常接近:

QFileQIODevice::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 动态重新分配 line >为0或读取行的长度为<line->capacity()。但是,由于编码的原因,读入 QString 总是比读入 QByteArray 慢。

虽然 QByteArray 不存在像 readLineInto(...) 这样的函数。


使用 QIODevice::getChar(char *c) 的解决方案(在 OP 注释中提出)也适用,因为它使用与 readLine 相同的内部读取缓冲区>,每次调用都有一点开销,但调用者不必担心行长超过所选缓冲区大小。

关于c++ - 如何跳过 QFile 的 N 行而不临时将它们存储在 QStrings 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56207807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com