Russian Qt Forum

Qt => Общие вопросы => Тема начата: JamS007 от Октябрь 24, 2009, 21:12



Название: Запись структуры в файл с помощью Qt
Отправлено: 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. Если такое невозможно, то подскажите, пожалуйста эквивалентный способ...

И еще...  если это возможно - покажите примерчик такой реализации. Спасибо!


Название: Re: Запись структуры в файл с помощью Qt
Отправлено: Авварон от Октябрь 24, 2009, 21:20
QFile f("...");
f.open(QFile::WriteOnly);
f.write((const char*)StructPtr, sizeof(Struct));


Название: Re: Запись структуры в файл с помощью Qt
Отправлено: Igors от Октябрь 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".  


Название: Re: Запись структуры в файл с помощью Qt
Отправлено: JamS007 от Октябрь 24, 2009, 21:41
может быть примерчик?  :)

разобрался... а теперь не могу прочитать данные записанные в структуру способом, описанном в посте №1. Помогите, пожалуйста.


Название: Re: Запись структуры в файл с помощью Qt
Отправлено: Igors от Октябрь 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;
}


Название: Re: Запись структуры в файл с помощью Qt
Отправлено: JamS007 от Октябрь 24, 2009, 22:08
спасибо... конструкция мудрёная, первый раз такую вижу. может быть действительно так и легче, но я что-то не пойму, как таким способом указать файл выхода, его параметры?

П.С. Сильно не пинайте... только учусь.  ::)


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


Название: Re: Запись структуры в файл с помощью Qt
Отправлено: JamS007 от Октябрь 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;

Может это и тупо читать... я понимаю, но я очень хочу это понять.


Название: Re: Запись структуры в файл с помощью Qt
Отправлено: Авварон от Октябрь 24, 2009, 22:34
это перегрузка оператора сдвига <<
использование:
DataStrream out(&file);
out << theQuestion; // вот


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


Название: Re: Запись структуры в файл с помощью Qt
Отправлено: Авварон от Октябрь 24, 2009, 23:13
а я не понял - мой грязный хак не прокатит что ли? по идее должно


Название: Re: Запись структуры в файл с помощью Qt
Отправлено: JamS007 от Октябрь 24, 2009, 23:16
Хак прокатил... :) Причем с удовольствием... За что вам - огромное СПАСИБО!.

Но! Как теперь эту информацию прочитать?


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

А Структура - это так, чтоб красиво было, можно и без нее... Да? (Если не прав - поправьте)
Ну как "можно" :) Можно бриться полотенцем или даже шилом но удобно ли это?


Название: Re: Запись структуры в файл с помощью Qt
Отправлено: Dexel от Октябрь 27, 2013, 02:04
Полотенцем бриться нужно когда руки сильно трусятся после пьянки, - чтобы шею не перерезать  ;D


Название: Re: Запись структуры в файл с помощью Qt
Отправлено: Fregloin от Октябрь 28, 2013, 11:01
можно еще в QByteArray/QBuffer писать почти привычным вам способом.
QDataStream не подходит, если данные должны читаться не Qt приложениями.