Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с чтением из файла 
V
    Опции темы
Ober
Дата 28.2.2012, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 11.3.2011

Репутация: нет
Всего: нет



Доброго времени суток, укажите пожалуйста на ошибку в коде. Проблема состоит в том, что программа аварийно завершается при вызове функции чтения из файла. Вот собственно функции.
И есть ли в qt функция типа seekg(), для установки указателя в файле ?

Функция записи в файл.
Код

void MList::outputFile()
 {

     QFile file1("DataBase.dat");
     file1.open(QIODevice::WriteOnly );
     currentPtr = firstPtr;

     while( currentPtr != 0 )
     {
         file1.write( reinterpret_cast< const char*>( currentPtr ),
                      sizeof( MGroups ));
         currentPtr = currentPtr->nextPtr;
     }
 }


Функция чтения

Код

void MList::loadFromFile()
 {
     QFile file2("DataBase.dat");
     file2.open( QIODevice::ReadOnly );

     file2.read( reinterpret_cast< char*>( tempPtr ),
                 sizeof( MGroups ));  //функция завершается на этой строке

     this->insertAtList( tempPtr->getName(), tempPtr->getStyle(),
     QString("%1").arg( tempPtr->getAlbumAmount()),
     QString("%1").arg( tempPtr->getYear()),
     QString("%1").arg( tempPtr->getPeopleAmount())
                                    );
 }


currentPtr  и tempPtr это указатели на объект класса MGroups

Это сообщение отредактировал(а) Ober - 28.2.2012, 23:39
PM MAIL   Вверх
Sahab
Дата 29.2.2012, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 1.9.2009

Репутация: 2
Всего: 3



для tempPtr память выделена?

Цитата(Ober @  28.2.2012,  23:14 Найти цитируемый пост)
file2.open( QIODevice::ReadOnly );

нужно проверять открылся ли файл: 
Код

if(file2.open( QIODevice::ReadOnly )) {
   /// read from file
}



Цитата(Ober @  28.2.2012,  23:14 Найти цитируемый пост)
И есть ли в qt функция типа seekg()

bool QIODevice::seek ( qint64 pos ) [virtual]

Это сообщение отредактировал(а) Sahab - 29.2.2012, 02:16
PM MAIL   Вверх
math64
Дата 29.2.2012, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Структура, на которую указывает currentPtr, не показана, но у неё есть поле nextPtr, указывющее на следующую структуру.
Смысла писать указатели в файл - никакого, при загрузке адреса поменяются.
Если это класс, в нём есть ещё указатель на таблицу виртуальных методов - сохранять его так ещё более бессмысленно.
PM   Вверх
Sahab
Дата 29.2.2012, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 1.9.2009

Репутация: 2
Всего: 3



Цитата(math64 @  29.2.2012,  07:23 Найти цитируемый пост)
Смысла писать указатели в файл - никакого, при загрузке адреса поменяются.

это к чему?

Добавлено через 47 секунд
Цитата(math64 @  29.2.2012,  07:23 Найти цитируемый пост)
Структура, на которую указывает currentPtr, не показана, но у неё есть поле nextPtr, указывющее на следующую структуру.

это и так ясно из кода.
PM MAIL   Вверх
math64
Дата 29.2.2012, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Цитата(Sahab @  29.2.2012,  11:58 Найти цитируемый пост)
это и так ясно из кода. 

В этом то и дело. Есть по крайней мере один указатель. А если класс MGroups имеет виртуальные функции, то и указатель на таблицу виртуальных методов. После чтения они будут указывать не туда, даже если память под tempPtr будет выделена.
PM   Вверх
Ober
Дата 29.2.2012, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 11.3.2011

Репутация: нет
Всего: нет



Теперь ясно, что в файл записываются адреса на которые указывают указатели, а как записать в файл данные которые находятся по этим адресам?

Это сообщение отредактировал(а) Ober - 29.2.2012, 16:43
PM MAIL   Вверх
math64
Дата 29.2.2012, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Код

     class MGroups {
        QString name;
        QString style;
        int amount;
        int peopleAmount; 
     };

     QFile file("DataBase.dat");
     file.open( QIODevice::WriteOnly );
     QDataStream out(infile);
     QList<MGroups> groups;
     out << groups.size();
     foreach(MGroup group, groups) {
        out << group.name << group.style << group.amount << group.peopleAmount;
     }
     file.close();

     QFile file("DataBase.dat");
     file.open( QIODevice::ReadOnly );
     QDataStream in(&file);
     QList<MGroups> groups;
     int size;
     in >> size;
     for(int i=0; i < size; i++) {
       MGroup group;
       groups << group;
       in >> group.name >> group.style >> group.amount >> group.peopleAmount;
     }
     file.close();


PM   Вверх
borisbn
Дата 29.2.2012, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



math64, ИМХО 26-ю и 27- строчку нужно местами поменять  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
math64
Дата 29.2.2012, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Цитата(borisbn @  29.2.2012,  18:56 Найти цитируемый пост)
math64, ИМХО 26-ю и 27- строчку нужно местами поменять

правильно, но есть ещё опечатки - набирал с экрана.
PM   Вверх
Ober
Дата 1.3.2012, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 11.3.2011

Репутация: нет
Всего: нет



Цитата(math64 @ 29.2.2012,  18:52)
Код

     class MGroups {
        QString name;
        QString style;
        int amount;
        int peopleAmount; 
     };

     QFile file("DataBase.dat");
     file.open( QIODevice::WriteOnly );
     QDataStream out(infile);
     QList<MGroups> groups;
     out << groups.size();
     foreach(MGroup group, groups) {
        out << group.name << group.style << group.amount << group.peopleAmount;
     }
     file.close();

     QFile file("DataBase.dat");
     file.open( QIODevice::ReadOnly );
     QDataStream in(&file);
     QList<MGroups> groups;
     int size;
     in >> size;
     for(int i=0; i < size; i++) {
       MGroup group;
       groups << group;
       in >> group.name >> group.style >> group.amount >> group.peopleAmount;
     }
     file.close();

Спасибо Math, все получилось. Все эти указатели ( currentPtr, nextPtr, temPtr ) сделаны потому-что по условию задания нужно было реализовать динамическую структуру. 
Появилась проблема с утечкой памяти, у меня в функции вывода данных на экран создается таблица в которую записываются актуальные данные .

Код

void MList::print()
 {
   if( this->firstPtr != 0 )
   {
       int count = 0;
       [color=red]tbl = new QTableWidget( QuantityOfElem(), 5 );[/color]
       QTableWidgetItem *pTName = 0;
       QTableWidgetItem *pTStyle = 0;
       QTableWidgetItem *pTAlb = 0;
       QTableWidgetItem *pTYear = 0;
       QTableWidgetItem *pTPeople = 0;
       QStringList lst;
       lst << "Name" << "Style" << "Quantity of aslbums" << "Basis Year"
           << "Quantity of people";
       tbl->setHorizontalHeaderLabels( lst );

       currentPtr = firstPtr;
       while( currentPtr != 0 )
       {
         pTName   = new QTableWidgetItem( currentPtr->getName() );
         pTStyle  = new QTableWidgetItem( currentPtr->getStyle() );
         pTAlb    = new QTableWidgetItem( QString( "%1" ).arg(currentPtr->getAlbumAmount()));
         pTYear   = new QTableWidgetItem( QString( "%1" ).arg(currentPtr->getYear()) );
         pTPeople = new QTableWidgetItem( QString( "%1" ).arg(currentPtr->getPeopleAmount()) );

         pTName->setTextAlignment( Qt::AlignCenter );
         pTStyle->setTextAlignment( Qt::AlignCenter );
         pTAlb->setTextAlignment( Qt::AlignCenter );
         pTYear->setTextAlignment( Qt::AlignCenter );
         pTPeople->setTextAlignment( Qt::AlignCenter );

         tbl->setItem( count, 0, pTName );
         tbl->setItem( count, 1, pTStyle );
         tbl->setItem( count, 2, pTAlb );
         tbl->setItem( count, 3, pTYear );
         tbl->setItem( count, 4, pTPeople );

         this->currentPtr = this->currentPtr->nextPtr;
         count++;
       }
       tbl->resize( 600, 200);
       tbl->show();
   }
   else
       QMessageBox::information( this, "", "There are no elements in the data base");
 }


как сделать, чтобы при закрытии этого окна каждый раз освобождалась выделенная под него память
Заранее спасибо.
PM MAIL   Вверх
math64
Дата 1.3.2012, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



При создании виджетов указывай у них parent. При удалении родителя автоматически удаляются все дочерние виджеты.
В особых случаях чтобы отследить удаление нужно вешать слот на удаление виджета.
Вместо QTableWidget можно использовать QTableView + свою модель, при этом проблем с выделенем будет памяти меньше.
 при использовании QList<MGroups> это сделать достаточно просто, см. пример создания модели из документации по Qt,
при самодельном списке firstPtr - nextPtr это сложнее.
PM   Вверх
Ober
Дата 1.3.2012, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 11.3.2011

Репутация: нет
Всего: нет



Подскажите что делать, не могу запустить через .exe файл ни одну программу, закинул в папку все библиотеки которые требовалось и в конце оно выбивает ошибку

Точка входа в процедуру _Z17qt_message_output9QtMsgTypePKc не найдена в библиотеке DLL QtCore4.dll
И после того как закидываю в папку нужные библиотеки программа перестает запускаться в режиме релиза

Это сообщение отредактировал(а) Ober - 1.3.2012, 22:29
PM MAIL   Вверх
math64
Дата 2.3.2012, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Вероятно, в системе есть приложение, использующее Qt другой версии. Вместо твоей DLL загружается его. Попробуй загрузить через bat файл
Код

PATH <пути только туда куда нужно>
<твоя программа>.exe

В QtCore4.dll прописаны пути к плагинам по умолчанию, поэтому если испоьзуются плагины, нужно вызывать addLibraryPath()
PM   Вверх
Ober
Дата 2.3.2012, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 11.3.2011

Репутация: нет
Всего: нет



Цитата(math64 @ 2.3.2012,  07:21)
Вероятно, в системе есть приложение, использующее Qt другой версии. Вместо твоей DLL загружается его. Попробуй загрузить через bat файл
Код

PATH <пути только туда куда нужно>
<твоя программа>.exe

В QtCore4.dll прописаны пути к плагинам по умолчанию, поэтому если испоьзуются плагины, нужно вызывать addLibraryPath()

Сделал bat файл, правда не знаю на сколько правильно так как до этого никогда не делал.
Но теперь при ошибке пишет, что не может найти точку входа в процедуру в QtGui4.dll, указываю путь на нее но ничего не меняется.
Вот содержимое bat файла

PATH D:\Study\Polyteh\1course\2semester\1.Programming_bases\OP_2obr_2sem\Kurs1\KURS1-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_______\release\QtGui4.dll

KURS1.exe



создавал bat файл в папке с библиотеками и exe файлом так
PATH QtGui4.dll
KURS1.exe


Путь оно находит но все равно не запускается

Это сообщение отредактировал(а) Ober - 2.3.2012, 22:27
PM MAIL   Вверх
math64
Дата 3.3.2012, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



В Path указываются каталоги, а файлы.
если все dll в текущем каталоге - path .
(хотя текущий каталог можно не указывать, но path без агрументов выдает текущие пути поиска на экран)

Добавлено через 2 минуты и 16 секунд
хотя проблема может быть в другом. Не ползуешься чужими dll ? Всё должно быть откомпилировано в одной и той же версии SDK и компилятора.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0522 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.