以下代码用于查找QFile的读取字节数。对于某些文件,它提供了正确的文件大小,但是对于某些文件,它给出了一个近似为fileCSV.size()/ 2的值。我发送的两个文件中包含相同数量的字符,但文件大小不同link text。我应该使用其他一些对象来阅读QFile吗?
QFile fileCSV("someFile.txt");
if ( !fileCSV.open(QIODevice::ReadOnly | QIODevice::Text))
emit errorOccurredReadingCSV(this);
QTextStream textStreamCSV( &fileCSV ); // use a text stream
int fileCSVSize = fileCSV.size());
qint64 reconstructedCSVFileSize = 0;
while ( !textStreamCSV.atEnd() )
{
QString line = textStreamCSV.readLine(); // line of text excluding '\n'
if (!line.isEmpty())
{
reconstructedCSVFileSize += line.size(); //this doesn't work always
reconstructedCSVFileSize += 2;
}
else
reconstructedCSVFileSize += 2;
}
我知道读取QString的大小是错误的,如果可以,请给我一些其他解决方案。
谢谢。
答案 0 :(得分:3)
我想是因为QString::size()
返回了字符数。如果你的文本文件是UTF16,比如说x字节长,那么这将与x / 2个字符相对应。
编辑:如果您想知道读取线的确切大小,可以使用QFile::readLine()
。这将返回QByteArray
,其中size()
可以使用{{1}}查询字节数。
答案 1 :(得分:0)
我用QByteArray制作了一个解决方案。解决方案是:
QFile fileCSV("someFile.txt");
if ( !fileCSV.open(QIODevice::ReadOnly | QIODevice::Text))
emit errorOccurredReadingCSV(this);
while ( !fileCSV.atEnd())
{
QByteArray arrayCSV = fileCSV.readLine();
reconstructedCSVFileSize += arrayCSV.size();
QTextStream textStreamCSV(arrayCSV);
QString line = textStreamCSV.readLine();
}
但是有一个问题。仔细查看我发送的文件files2.zip。
当我使用这种方法读取greaterFile.csv时,第一行被正确读取,字符串的大小为108,字符数也是108. arrayCSV.size()返回的数字是221。 当我读第二行时,字符串的大小为50,但字符数为25. arrayCSV.size()返回的数字为51.当我用debuger打开字符串时,字符串为空,尽管它的大小是50.我猜这种行为是因为第一行是用一种编码写的,而另一种是用不同的编码写的,导致QTextStream表现不正常。
当我正在阅读tinyFile.csv时,一切正常。字符串的大小为16,字符数也是16(没有\ n字符)。 arrayCSV.size()返回的数字是18。 第二行也正确读取。字符串的大小为25,字符数也为25. arrayCSV.size()返回的数字为25。
我发布的第一个代码,从两个文件中正确读取字符串。
答案 2 :(得分:0)
有一个类似的问题:QTextStream behavior searching for a string not as expected 。你可以查看我的答案。
简单地说:要做正确的计算,你应该在用pos()读取后用pos()和行尾标记行的开头。像这样:
qint64 newFileSize = 0;
while ( !f.atEnd() )
{
const qint64 begin = f.pos();
const QString line = f.readLine();
const qint64 end = f.pos();
// TODO: some your actions
// ...
const qint64 realLengthOfLine = end - begin;
newFileSize += realLengthOfLine;
}