Как прочитать большой файл в QByteArray

325
02 апреля 2017, 05:01

Не читается большой файл в QByteArray (182111787 byte):

QByteArray arrfile = file.readAll();

Размер QByteArray получается 0. Пробовал так:

QFile file(puth);
    if(!file.open(QIODevice::ReadWrite)) { qDebug() <<"Error open file";}
    int len = file.size();
    char buf[len]; //тут выскакивает ошибка возмжно лимит массива
    QByteArray arr;
    if(file.size()>8012) {
        while (!file.atEnd()) {
            int bl = file.read(buf, 8012);
            //QByteArray qb= QByteArray::fromRawData(buf, sizeof(buf));
            //arr.append(qb);
        }
    } else {
        arr = file.readAll();
    }
    arr= QByteArray::fromRawData(buf, sizeof(buf));
    qDebug() <<"prostofile=" <<file.size() <<"qb=" <<arr.size();
    file.close();

При присвоении массива (char buf[len]) выскакивает ошибка, наверное есть какой нибудь лимит массива, видимо с QByteArray похожая проблема. Что можно с этим сделать? Мне этот файл надо передать через QTcpSocket вот так

pClientSocket->write(arrBlock);

Но походу такое не катит. Что теперь сделать, неужели передавать куски QByteArray этого файла, вызывая pClientSocket->flush(). Может я что то упустил.

Answer 1

вот такой конструкцией

char buf[len];

Вы выделяете память на стеке (о том, что это VLA, и будет работать только с gcc, я умолчу). Выделить на стеке больше 1 мегабайта задача еще та, обычно так просто нельзя (под линуксом это точно). Но потом все равно туда больше 8012 байт не читаете. (кстати, 0 и 9 попутали?).

Если этот файл нужно передать через сокет, то так и сделайте - читайте по 4-8 кб и отправляйте в сокет - не нужно пытаться вычитать весь файл, где то так:

while (1) {
   QByteArray b = file.read(8*1024);
   if (b.isEmpty()) break;
   socket.write(b);
}
READ ALSO
Инициализация вектора в конструкторе

Инициализация вектора в конструкторе

Почему вектор инициализируется рандомным значением? Константа ещё не успевает стать -1? Как тогда сделать правильно?

260
Необработанные исключения Stack Overflow

Необработанные исключения Stack Overflow

Необработанные исключения по адресу 0x00821CC9 в пexe: 0xC00000FD: Stack overflow (параметры: 0x00000000, 0x006E2000)

304
Странный синтаксис С++ кода в библиотеке LuaBind

Странный синтаксис С++ кода в библиотеке LuaBind

Заинтересовался либой LuaBindЧитаю доку, разбираю примеры

218
как закрыть окно браузера по его названию и запустить ярлык

как закрыть окно браузера по его названию и запустить ярлык

как закрыть окно браузера по его названию, а потом (если закрытие было) открыть ссылку/ярлык/батник?

195