Qt, аналог fread()

137
02 декабря 2018, 20:40

Мне необходимо считать из файла данные в двоичном виде - сначала несколько int, потом uint8_t, затем еще кое-что.

Я пытаюсь использовать QFile::read() вместо fread(), но получается как-то страшно:

quint32 newNameLength;
qint64 rCode = file.read(reinterpret_cast<char*>(&newNameLength), 
                         sizeof(quint32));

Так вообще можно делать? Если нет, то каков в Qt самый удобный аналог для:

uint32_t newNameLength;
size_t rCode = fread(&newNameLength, sizeof(uint32_t), 1, f);

?

Answer 1

Можно написать обёртку:

size_t qread(void *ptr, size_t size, size_t count, QIODevice &file)
{
    // QIODevice::read не может вернуть число большее, чем мы передали ему в maxSize
    return file.read(reinterpret_cast<char*>(&ptr), size * count);
}

Но лучше воспользоваться типобезопасностью C++ и поместить всё в шаблоны:

// Вариант для массива
template<typename T>
size_t qread(T *out, size_t count, QIODevice &file)
{
    return file.read(reinterpret_cast<char*>(&out), sizeof(T) * count);
}
// Вариант для одиночного элемента
template<typename T>
size_t qread(T &out, QIODevice &file)
{
    return qread(&T, 1, file);
}
Answer 2

Конечно так, можно, или ещё проще:

quint32 newNameLength;
qint64 rCode = file.read((char*)&newNameLength, sizeof(quint32));

так как понятно, что нужен просто адрес, разработчикам надо было бы сразу сделать первый аргумент, как void *. Qt вообще частенько адреса, как char * передаёт, что плохо в отличии от memcpy.

READ ALSO
ошибка при открытии терминала в netbeans: unable to start pty process

ошибка при открытии терминала в netbeans: unable to start pty process

Раньше в netbeans терминал Cygwin работал даже без открытия java проекта, но теперь после обновления пишет сообщение "unable to start pty process": Прошу тока не предлагать...

237
Xalan Java и русские буквы в имени файла

Xalan Java и русские буквы в имени файла

Хочу использовать Xalan-J для XSLT-преобразования (Java 8)Скачал библиотеку Xalan-J 2

163
Android выбор реализации Date format

Android выбор реализации Date format

У меня recyclerView с кучей элементов, каждый элемент должен отформатировать и отобразить Date, паттерн для всех одинаковый

174
Адская многопоточность

Адская многопоточность

Ситуация такая: в пэкедже создается 6 энтити, которые в свою очередь являются потокамиВо время выполнения они заходят в saveTelegram (для того чтобы...

153