LINUX.ORG.RU

Qt, считать данные из файла

 ,


0

1
QByteArray myByteArray;
QFile file("mydata");
QFileInfo fileinfo(file);
if (file.open(QIODevice::ReadOnly)) {
   qint64 filesize = fileinfo.size();
   char* pData = new char[filesize]
   file.read(pData, filesize);
   myByteArray = QByteArray::fromRawData(pData, filesize);
}

Нормальный подход, или можно как-то по-другому? Смущает, что bytearray не отвечает за память, т.е. самому потом нужно будет об этом заботиться...

★★★★★
Ответ на: комментарий от Stil

Не пойдёт. Нужет созданный с помощью fromRawData().

UVV ★★★★★
() автор топика
Ответ на: комментарий от CrazyAlex25

Нужно pData. Объясняю:

QByteArray ba("test");
QByteArray bb("test\0");
int as = ba.size(); // 4
int bs = bb.size(); // 4

QByteArray bc = QByteArray::fromRawData("test", 4);
QByteArray bd = QByteArray::fromRawData("test\0", 5);
int cs = bc.size(); // 4
int ds = bd.size(); // 5

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

И что. Ну да, QByteArray не обязан заканчиваться нулем, так как это не сишная «строка».

А тебе-то чем это мешает использовать readAll?

grondek
()
Ответ на: комментарий от grondek

QByteArray не обязан

Я тоже так думал.

The last byte in the byte array is at position size() - 1. In addition, QByteArray ensures that the byte at position size() is always '\0', so that you can use the return value of data() and constData() as arguments to functions that expect '\0'-terminated strings. If the QByteArray object was created from a raw data that didn't include the trailing null-termination character then QByteArray doesn't add it automaticall unless the deep copy is created.

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Вот где в твоем примере выше съелся \0? Ты ему сколько скормил данных, столько QByteArray и запомнил.

Написал бы

QByteArray bc = QByteArray::fromRawData("test", 5);

У тебя бы и bc.size() == 5 и bc.toHex() == «7465737400»

grondek
()
Последнее исправление: grondek (всего исправлений: 1)
Ответ на: комментарий от UVV

Но ты же тут длину не указал, а при чтени из файла указываешь, укажешь вместе с \0 они тебе в QByteArray и запихнет \0.

Вот в таком примере читается все, включая заключительный \0:

    QFile tmp( "/tmp/f1" );
    tmp.open( QIODevice::WriteOnly );
    tmp.write( QByteArray( "test", 5 ) );
    tmp.close();

    tmp.open( QIODevice::ReadOnly );
    QByteArray r = tmp.readAll();
    tmp.close();

    qDebug() << r.size() << r.toHex();

Возвращает:

5 "7465737400"

Разве тебе не это надо?

grondek
()
Ответ на: комментарий от UVV

QByteArray bb(«test\0»);

Конструктор ожидает получить заканчивающуюся на \0 последовательность, находит твой ноль раньше «обычного» и останавливается, в чем проблема? Так то QByteArray нормально хранит любые данные.

staseg ★★★★★
()
Ответ на: комментарий от UVV

ReadAll читает всё, и даже небо, и даже нули.

#include <QByteArray>
#include <QDebug>
#include <QFile>

int main(int argc, char *argv[])
{
    QByteArray arr;
    QFile file("test.bin");
    qDebug() << "Open result:" << file.open(QIODevice::ReadOnly);
    qDebug() << "Byte array size:" << (arr = file.readAll()).size();
    QString str = arr.toHex();
    str.truncate(20);
    qDebug() << str;
}

Open result: true
Byte array size: 1048576
"00000000000000000000"
anonymous
()
Ответ на: комментарий от grondek

Разве тебе не это надо?

Да, точно. Значит где-то в другом месте у меня ломается... буду разбираться.

UVV ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Понял уже, буду смотреть, кто ноль съедает у меня.

UVV ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.