crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Чтение бинарного файла (в дебаге нормально, в релизе нет)
sidsukana
  опции профиля:
сообщение 27.5.2011, 16:01
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

Спасибо сказали: 10 раз(а)




Репутация:   2  


В общем есть функция считывания таблицы из бинарного файла, ячейка со строкой содержит смещение в строковом блоке. Все работает, но только в дебаге. В релизе некоторые строки непонятным образом пропадают, и всегда разные. В дебаге все полностью читается.

Функция
Раскрывающийся текст
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());
                        }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 29.5.2011, 10:50
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

Спасибо сказали: 10 раз(а)




Репутация:   2  


Нет никаких идей? Может какие флаги компиляции? Но все равно это было бы странно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 29.5.2011, 12:56
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


Основная идея - где-то что-то не инициализировано.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 29.5.2011, 15:50
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

Спасибо сказали: 10 раз(а)




Репутация:   2  


Разобрался, была утечка в
char* ch = new char[1];

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.11.2024, 7:13