В общем есть функция считывания таблицы из бинарного файла, ячейка со строкой содержит смещение в строковом блоке. Все работает, но только в дебаге. В релизе некоторые строки непонятным образом пропадают, и всегда разные. В дебаге все полностью читается.
Функция
void DTObject::Load()
{
ThreadSet(THREAD_OPENFILE);
// Timer
QTime m_time;
m_time.start();
QFile m_file(m_fileName);
if (!m_file.open(QIODevice::ReadOnly))
{
ThreadUnset(THREAD_OPENFILE);
return;
}
// Head bytes
QByteArray head;
head = m_file.read(20);
quint32 m_header;
m_header = *reinterpret_cast<quint32*>(head.mid(0, 4).data());
m_recordCount = *reinterpret_cast<quint32*>(head.mid(4, 4).data());
m_fieldCount = *reinterpret_cast<quint32*>(head.mid(8, 4).data());
m_recordSize = *reinterpret_cast<quint32*>(head.mid(12, 4).data());
m_stringSize = *reinterpret_cast<quint32*>(head.mid(16, 4).data());
// Check 'WDBC'
if (m_header != 0x43424457)
{
ThreadUnset(THREAD_OPENFILE);
return;
}
QByteArray dataBytes;
QByteArray stringBytes;
QStringList recordList;
quint32 offset = 0;
// Data bytes
m_file.seek(20);
dataBytes = m_file.read(m_recordSize * m_recordCount);
// String bytes
m_file.seek(20 + m_recordSize * m_recordCount);
stringBytes = m_file.read(m_stringSize);
DBCTableModel* model = new DBCTableModel(m_form, this);
model->clear();
model->setFieldNames(m_fieldNames);
QApplication::postEvent(m_form, new ProgressBar(m_recordCount - 1, BAR_SIZE));
for (quint32 i = 0; i < m_recordCount; i++)
{
recordList.clear();
for (quint32 j = 0; j < m_fieldCount; j++)
{
switch (GetFieldType(j).toAscii())
{
case 'u':
{
quint32 value = *reinterpret_cast<quint32*>(dataBytes.mid(offset, 4).data());
recordList.append(QString("%0").arg(value));
offset += 4;
}
break;
case 'i':
{
qint32 value = *reinterpret_cast<qint32*>(dataBytes.mid(offset, 4).data());
recordList.append(QString("%0").arg(value));
offset += 4;
}
break;
case 'f':
{
float value = *reinterpret_cast<float*>(dataBytes.mid(offset, 4).data());
recordList.append(QString("%0").arg(value));
offset += 4;
}
break;
case 's':
{
quint32 value = *reinterpret_cast<quint32*>(dataBytes.mid(offset, 4).data());
if (value)
{
char* ch = new char[1];
quint32 length = 0;
while (ch[0] != 0)
{
ch[0] = stringBytes.at(value+length);
if (ch[0] != 0)
length++;
}
QString str("");
while (str.isEmpty())
{
str = QString("%0").arg(stringBytes.mid(value, length).data());
}
recordList.append(str);
}
else
recordList.append(QString(""));
offset += 4;
}
break;
default:
{
quint32 value = *reinterpret_cast<quint32*>(dataBytes.mid(offset, 4).data());
recordList.append(QString("%0").arg(value));
offset += 4;
}
break;
}
}
model->appendRecord(recordList);
QApplication::postEvent(m_form, new ProgressBar(i, BAR_STEP));
}
QApplication::postEvent(m_form, new SendModel(m_form, model));
m_file.close();
QString stime(QString("Load time (ms): %0").arg(m_time.elapsed()));
QApplication::postEvent(m_form, new SendText(m_form, 1, stime));
ThreadUnset(THREAD_OPENFILE);
}
Код для проверки вставлен в кейз строки, и даже с ним str всегда пустая, хотя смещение есть и там совершенно точно содержится строка, так как в дебаге с проверочным циклом тоже все отлично работает.
QString str("");
while (str.isEmpty())
{
str = QString("%0").arg(stringBytes.mid(value, length).data());
}