Мне необходимо считать из файла данные в двоичном виде - сначала несколько 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);
?
Можно написать обёртку:
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);
}
Конечно так, можно, или ещё проще:
quint32 newNameLength;
qint64 rCode = file.read((char*)&newNameLength, sizeof(quint32));
так как понятно, что нужен просто адрес, разработчикам надо было бы сразу сделать первый аргумент, как void *. Qt вообще частенько адреса, как char * передаёт, что плохо в отличии от memcpy.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости