134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
1

QFile | Читает, но не читает или "Что я делаю не так?"

17.09.2013, 01:27. Показов 1346. Ответов 3

Студворк — интернет-сервис помощи студентам
Собственно, такая проблема: читаю bmp файл. Сначала решил проверить файл на bmp-шность, проверив магическое число (простая проверка, но всё же). Стал вылетать. Постоянно. На любом файле. Начал копать. Ради интереса вывел первые 14 байт файла (размер структуры). И тут началась магия: они каждый раз были разными, причём ни каких намёков на то, что это как-то связано с bmp. Немного посидев, начало сильно надоедать это мир, поэтому я здесь.

Безобразие
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
QString biteToHEX ( char byte ) {
    QString res = QString::number ( byte, 16 );
    if ( res.size() == 1 ) res.prepend ( '0' );
    return res;
}
 
QPixmap readBMP ( QString filename ) {
    QFile f ( filename );
    if ( f.exists() ) {
        QByteArray arr = f.readAll();
        for ( int i = 0; i < 14; i++ ) {
            std::cout << biteToHEX( arr.data()[i] ).toStdString ();
        } std::cout << std::endl;
//        BITMAPFILEHEADER h;
//        f.read( (char*)&h, sizeof ( BITMAPFILEHEADER ) );
//        if ( h.bfType != BF_TYPE ) {
//            FileIsNotBMP ().raise();
//        }
    }
    f.close();
    return QPixmap();
}


Скриншот продублирован в аттаче, архив с проектом так же там. Использую ресурсы, но с другими файлами вроде то же самое.

P.S. Нет, с ним определённо творить грёбанная магия. Посчитав длину выводимой строки можно легко обнаружить маленькое несоответствие с тем, что должно быть. Да и к тому же, она меняется, хотя не должна...
Миниатюры
QFile | Читает, но не читает или "Что я делаю не так?"  
Вложения
Тип файла: 7z myshaders.7z (543.7 Кб, 1 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2013, 01:27
Ответы с готовыми решениями:

Не читает из INI-файла, что я делаю не так?
Ребята, приет! Такой вопрос: есть INI-файл со такой структурой раздела (там из 5): 1='Прага'...

Visual Studio не читает операторы, что начинаются на "glu" ("gluBuild2DMipmaps", "gluPerspective")
Данный код должен выводить на экран кубик который должен вращаться, но возникла проблема. Для...

Visual Studio не читает операторы, что начинаются на "glu" ("gluBuild2DMipmaps", "gluPerspective")
Этот код должен выводить на экран кубик, который по идее должен вращаться, но возникла проблема:...

Что быстрей читает текст и бинарные данные QFile или std::istream?
Что быстрей читает текст и бинарные данные QFile или std::istream? есть у кого опыт в тестировании?

3
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
17.09.2013, 02:11  [ТС] 2
Срочный UPD:
Пока летело к Вам на сервер случайно заметил, что char может быть и меньше нуля. Соответственно
C++ (Qt)
1
QString biteToHEX ( uchar byte ) {
полностью решает проблему.

Добавлено через 42 минуты
Цитата Сообщение от AnyOne697 Посмотреть сообщение
полностью решает проблему.
Тьфу. Полность = проблему вывода строк разного размера.

Добавлено через 55 секунд
Проблема стохастического чтения из файла всё ещё осталась.
0
Эксперт С++
5038 / 2617 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
17.09.2013, 07:22 3
А что-то не видно, где QFile::open вызывается.
И, кстати:
QPixmap::QPixmap ( const QString & fileName, const char * format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor )
Constructs a pixmap from the file with the given fileName.
1
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
17.09.2013, 09:15  [ТС] 4
QFile::open в примерах не вызывался. У меня уже есть filename внутри, зачем ему ещё handle? Тем более, что он просто даёт какой-то странный рандом, а не кидает исключения или ещё что...
А про QPixmap ( const QString, ... ) я знаю. Самое забавное в этой истории это то, что он работает.

Добавлено через 22 минуты
Впрочем, очень похоже на то, что надо больше спать.
Подзабыл немного Qt, сто раз файлы открывал. Сначала была неуверенность, и пытался вызывать QFile::open, но он не подходил, как мне казалось...
Работающая магия
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
QPixmap readBMP ( QString filename ) {
    QFile f ( filename );
    f.open( QFile::ReadOnly );
    if ( f.exists() ) {
        QByteArray arr = f.readAll();
        for ( int i = 0; i < 14; i++ ) {
            std::cout << biteToHEX( arr.data()[i] ).toStdString ();
        } std::cout << std::endl;
        BITMAPFILEHEADER h;
        memcpy( &h, arr.data(), sizeof ( BITMAPFILEHEADER ) );
        if ( h.bfType != BF_TYPE ) {
            FileIsNotBMP ().raise();
        }
    }
    f.close();
    return QPixmap();
}


Что примечательно, смотрел сюда и ничего не видел:
F1
C++ (Qt)
1
2
3
4
5
6
7
8
QFile file("in.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;
 
    while (!file.atEnd()) {
        QByteArray line = file.readLine();
        process_line(line);
    }


В общем, хватит оправдываться, большое спасибо. Не знаю, сколько бы ещё времени просидел с этой магией.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2013, 09:15
Помогаю со студенческими работами здесь

Что я делаю не так? "Некоректное объявление".
#include &lt;vcl.h&gt; #pragma hdrstop #include &lt;iostream.h&gt; #include &lt;conio.h&gt; #pragma argsused ...

Что не так с функцией InStr() или "2x2" не всегда "=4" ?!
Ребята! Я привык к тому, что код либо работает &quot;правильно&quot; - так, как планировалось, либо не...

DVD-привод не читает диски. В событиях "Устройство не перенесено"
Доброго времени суток! Понимаю, что тема избитая, но интересует момент, которого нет на просторах...

Ошибка установки Windows "не читает жёсткий диск"
Всем доброго времени суток. Думал, куда опубликовать свой вопрос, в раздел железа или же сюда, -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru