Russian Qt Forum
Ноябрь 25, 2024, 05:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Запись структуры в файл с помощью Qt  (Прочитано 16327 раз)
JamS007
Гость
« : Октябрь 24, 2009, 21:12 »

Здравствуйте,

в QT я еще не силён, и потому столкнулся с такой проблемой: в других известных мне компиляторах я мог записывать созданную собой структуру в файл с помощью стандартной функции fwrite(). к примеру:

Код:
struct {                                               // структура для рализации
   ShortString sQuestion[MAX_COUNT_OF_ELEMENTS];       // сохранения вопросов
   ShortString sFirstVariant[MAX_COUNT_OF_ELEMENTS];
   ShortString sSecondVariant[MAX_COUNT_OF_ELEMENTS];
   ShortString sThirdVariant[MAX_COUNT_OF_ELEMENTS];
   ShortString sCorrectVariant[MAX_COUNT_OF_ELEMENTS];

   ShortString sTheme;
   ShortString sObject;
}Question;

Код:
FILE *Path = fopen("C:\file.abc","w");
fwrite(&Question,sizeof(Question),1,Path);
fclose(Path);

А теперь, собственно, вопросы:

1. Можно ли средствами Qt организовать такое взаимодействие?
2. Если можно, то нужно ли ограничивать такие типы как QString, просто в некоторых компиляторах требовалось чётко зафиксировать размер данной переменной.
3. Если такое невозможно, то подскажите, пожалуйста эквивалентный способ...

И еще...  если это возможно - покажите примерчик такой реализации. Спасибо!
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Октябрь 24, 2009, 21:20 »

QFile f("...");
f.open(QFile::WriteOnly);
f.write((const char*)StructPtr, sizeof(Struct));
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Октябрь 24, 2009, 21:32 »

Код:
FILE *Path = fopen("C:\file.abc","w");
fwrite(&Question,sizeof(Question),1,Path);
fclose(Path);
Понятно что не хочется возиться с каждым полем Улыбающийся Но все равно придется. так что лучше сразу. Объекты с virtual такому I/O не подлежат вообще - они должны создаваться конструкторами. Но это не будет работать даже с простыми struct

- разное выравнивание (alignment) на разных платформах/компиляторах
- разное Endian

А вот читать/писать каждый член (с помощью операторов << и  >>) - без проблем. Да, придется немного больше написать но это несоразмеримо меньше с очень дорогой ценой которую надо заплатить за "просто sizeof".  
Записан
JamS007
Гость
« Ответ #3 : Октябрь 24, 2009, 21:41 »

может быть примерчик?  Улыбающийся

разобрался... а теперь не могу прочитать данные записанные в структуру способом, описанном в посте №1. Помогите, пожалуйста.
« Последнее редактирование: Октябрь 24, 2009, 22:03 от JamS007 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 24, 2009, 22:05 »

может быть примерчик?  Улыбающийся
Объявите члены как QList или QVector вместо массивов. Если ShortString не очень дорога сердцу, замените ее на что-нибудь ходовое, напр. тот же QString. Тогда для I/O писать совсем немного
Код:
QDataStream & operator << ( QDataStream & out, const Question & q )
{
  out << q.sQuestion;
  out << q.sFirstVariant << q.sSecondVariant << q.sThirdVariant << q.sCorrectVariant;
  out << q.sTheme << q.sObject;
  return out;
}
« Последнее редактирование: Октябрь 25, 2009, 15:38 от Igors » Записан
JamS007
Гость
« Ответ #5 : Октябрь 24, 2009, 22:08 »

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

П.С. Сильно не пинайте... только учусь.  Строит глазки
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Октябрь 24, 2009, 22:15 »

спасибо... конструкция мудрёная, первый раз такую вижу. может быть действительно так и легче, но я что-то не пойму, как таким способом указать файл выхода, его параметры?
Код:
QFile file("myfile");
file.open(QFile::WriteOnly);
DataStrream out(&file);
out << theQuestion;
Qt очень богатый инструментарий, просто используйте его - это сэкономит массу времени по сравнению со стандартным C/C++
Записан
JamS007
Гость
« Ответ #7 : Октябрь 24, 2009, 22:22 »

Спасибо что возитесь со мной.

Цитировать
QDataStream & Question::operator << ( QDataStream & out, const Question & q )
{
  out <<  sQuestion;
  out << sFirstVariant << sSecondVariant << sThirdVariant << sCorrectVariant;
  out << sTheme << sObject;
  return out;
}
- это, как я понимаю, функция, если да, то откуда и как ее вызывать, так, чтоб потом обьект out передать в

Цитировать
QFile file("myfile");
file.open(QFile::WriteOnly);
DataStrream out(&file);
out << theQuestion;

Может это и тупо читать... я понимаю, но я очень хочу это понять.
« Последнее редактирование: Октябрь 24, 2009, 22:25 от JamS007 » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Октябрь 24, 2009, 22:34 »

это перегрузка оператора сдвига <<
использование:
DataStrream out(&file);
out << theQuestion; // вот
Записан
JamS007
Гость
« Ответ #9 : Октябрь 24, 2009, 22:53 »

Итак, почитав чуть учебник по данной теме понял, что используя Qt можно забыть о записывании структуры в файл таким легким способом... А придется всё писать по очереди с помощью потока ввода/вывода... А Структура - это так, чтоб красиво было, можно и без нее... Да? (Если не прав - поправьте)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Октябрь 24, 2009, 23:13 »

а я не понял - мой грязный хак не прокатит что ли? по идее должно
Записан
JamS007
Гость
« Ответ #11 : Октябрь 24, 2009, 23:16 »

Хак прокатил... Улыбающийся Причем с удовольствием... За что вам - огромное СПАСИБО!.

Но! Как теперь эту информацию прочитать?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Октябрь 25, 2009, 14:18 »

Итак, почитав чуть учебник по данной теме понял, что используя Qt можно забыть о записывании структуры в файл таким легким способом... А придется всё писать по очереди с помощью потока ввода/вывода...
Правильно поняли. Конечно, то что указал Авварон, работать будет. Но только без Qt объектов и только на одной платформе/компиляторе. Это вынуждает Вас иметь только "С" структуры и значит эффект применения Qt будет равен нулю.

А Структура - это так, чтоб красиво было, можно и без нее... Да? (Если не прав - поправьте)
Ну как "можно" Улыбающийся Можно бриться полотенцем или даже шилом но удобно ли это?
Записан
Dexel
Гость
« Ответ #13 : Октябрь 27, 2013, 02:04 »

Полотенцем бриться нужно когда руки сильно трусятся после пьянки, - чтобы шею не перерезать  Смеющийся
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #14 : Октябрь 28, 2013, 11:01 »

можно еще в QByteArray/QBuffer писать почти привычным вам способом.
QDataStream не подходит, если данные должны читаться не Qt приложениями.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 23.