الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الإدخال والإخراج لبيانات الفئات

بدأه مصفوفة في 26 يونيو 2009 · 11 رد · 2,279 مشاهدة · في قسم Cross Platform GUI Libraries العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لسلام عليكم ورحمة الله وبركاته

الإدخال والإخراج لبيانات الفئات

ملاحظة : هذا الموضوع من مدونتي http://www.msfofah.wordpress.com والذي عدد زواره صفر ومشاكله التقنية كثيرة باب المساعدة مفتوح :D

عندما تريد حفظ متغيرات من نوع "أ" في ملف ومن ثم تقرأها في وقت آخر أو حين تريد

تبادل بيانات من نوع "أ" عبر الشبكة فإنك بحاجة الى نقل البيانات الثنائية بطريقة

تسهل عليك التعامل معها وتوفر لك الوقت...

فمثلا في الفئات QFont و QColor و ...... الخ تم توفير المعاملين

QDataStream & operator<< ( QDataStream & s, const QFont & font )

(QDataStream & operator>> ( QDataStream & s+, QFont & font

الأول للكتابة من الفئة الى ملف او الى QByteArray او QIODevice او .... الخ

والثاني للقراءة من ملف أو من QByteArrayاو QIODevice او .... الخ .

مثال

QFont font1,font2;

QByteArray ba;

QDataStream ds(&ba,QIODevice::WriteOnly);

QDataStream ds2(&ba,QIODevice::ReadOnly);

ds<<font1;


ds2>>font2;

وبالتأكيد البيانات التي يتم حفظها بيانات ثنائية أي لو أنك حفظتها على ملف فإنه

ملف ثنائي ...

والهدف الآن هو كيف تقوم أنت ببناء أسلوب أكثر ديناميكية في الإدخال والإخراج

للفئات التي قمت أنت بتصميمها ...

خطوات العمل

1- بناء الفئة

2- التصريح عن الفئة ضمن metaType

3- بناء معاملات الإدخال والإخراج

4- تسجيل الفئة ضمن meta type stream operators

أولا بناء الفئة:-

class A{

public:

A(){}

QString name;

qint32 age;


};

ثانيا التصريح عن الفئة ضمن metaType :-

Q_DECLARE_METATYPE(A);

ثالثا بناء معاملات الإدخال والإخراج :-

QDataStream &operator<<(QDataStream &out, const A &a){

out<<a.name<<(qint32)a.age;

return out;

}

QDataStream &operator>>(QDataStream &in, A &a){

in>>a.name>>a.age;

return in;


}

رابعا تسجيل الفئة ضمن meta type stream operators :-

qRegisterMetaTypeStreamOperators<A>("A");

والآن أصبح بإمكانك القراءة والكتابة مع الفئة A بكل يسر وسهولة سواء مع الملفات او

القراءة والكتابة عبر الشبكة أو حتى كمتغير .QByteArray

مثال شامل:-

#include <QtCore>

class A{

public:

A(){}

QString name;

qint32 age;

};

Q_DECLARE_METATYPE(A);

QDataStream &operator<<(QDataStream &out, const A &a){

out<<a.name<<(qint32)a.age;

return out;

}

QDataStream &operator>>(QDataStream &in, A &a){

in>>a.name>>a.age;

return in;

}

int main(int argc, char *argv[])

{

QCoreApplication app(argc, argv);

qRegisterMetaTypeStreamOperators<A>("A");

A from,to;

from.name="mohammed alabdaly";

from.age=20;

QByteArray ba;

QDataStream ds(&ba,QIODevice::WriteOnly);

QDataStream ds2(&ba,QIODevice::ReadOnly);

QMetaType::save(ds,qMetaTypeId<A>(),&from);//كتابة بيانات المتغير

QMetaType::load(ds2,qMetaTypeId<A>(),&to);//قراءة بيانات المتغير

qDebug()<<QObject::tr("%1,%2").arg(to.name).arg(to.age);


return app.exec();

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#2

جميل......مشكور اخي

سأكون بإذن الله من المتابعين لمدونتك :)

SAFETY TIP : Always delete what you new, and free what you malloc, never mix new with free or malloc with delete.

#3

شكرا لك ..

MoHammaD_93 كتب:
جميل......مشكور اخي

سأكون بإذن الله من المتابعين لمدونتك :)

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#4

يعطيك العافية , نفذت برنامجك , وتمت الترجمة على خير , ولكن لم يظهر الناتج النهائي .. الى الان يقوم بعملية تهيئة وتجهيز ما !!!

أعمل الان على Visual C++ 2008 , وعلى QT Creator وهذه المرة الاولى التي استخدم فيها هذه الميزة ( Serialization ) , هل الأمر في المرة الأولى يتأخر الى هذا الحد !!

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5

حياك الله أخي الشمري ...

ما فهمتك تمام في موضوع الserialization

لكن جرب الشيفرة على QtCreator في console applicationالمفروض انها تظهر بمجرد ينتهي الترجمة ...

وأعذرني على التقصير في الرد ...

تم تعديل هذه المشاركة بواسطة مصفوفة في 28 يونيو 2009 في 10:53

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#6

شكراً

متل العادة (موضوع ممتاز)

:happy:

موفق يارب

Bye...

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#7

الموضوع اللي تتكلم عنه يسمّونه Serialization , أعتذر عن عدم التوضيح .

تعديل : البرنامج عمل بدون مشاكل مع QT Creator .. لم أكن استخدم الـ Console :D ) المشكلة فقط تظهر مع Visual C .

=======================================================================

عموما البرنامج عمل ولكن لا ينتهي الا اذا أرجعت القيمة صفر وليس return app.exec

لو حاولت ترجمة البرنامج مرة أخرى سيرفض .. لأن الملف التطبيقي يعمل في الذاكرة , حتى أقوم انهائه بنفسي ( ادارة المهام ) .. عموماً الحل الذي وجدته هو باعادة القيمة صفر :

#include <QtGui/QApplication>

#include <QtCore>

class A{

public:

A(){}

QString name;

qint32 age;

};

Q_DECLARE_METATYPE(A);

QDataStream &operator<<(QDataStream &out, const A &a){

out<<a.name<<(qint32)a.age;

return out;

}

QDataStream &operator>>(QDataStream &in, A &a){

in>>a.name>>a.age;

return in;

} 

int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv); 
qRegisterMetaTypeStreamOperators<A>("A");
A from,to; 
from.name="mohammed alabdaly";
from.age=20;
QByteArray ba;
QDataStream ds(&ba,QIODevice::WriteOnly);
QDataStream ds2(&ba,QIODevice::ReadOnly);
QMetaType::save(ds,qMetaTypeId<A>(),&from);//كتابة بيانات المتغير
QMetaType::load(ds2,qMetaTypeId<A>(),&to);//قراءة بيانات المتغير
qDebug()<<QObject::tr("%1,%2").arg(to.name).arg(to.age);




return 0;
}

تم تعديل هذه المشاركة بواسطة الشمري في 28 يونيو 2009 في 11:27

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#8

موضوع جميل اخي محمد ، بارك الله فيك.

وبالنسبة لـ

[color= #0000ff;]return app.[color= #808000;]exec[color= #000000;]([color= #000000;])

فهي تجعل البرنامج يدخل في حقلة Event loop ، لكي يستجيب لاحداث المستخدم .

وفي هذا البرنامج لا يوجد احداث يستقبلها البرنامج حتى ينفذها "مثلا الضغط على زر close لكي يغلق البرنامج" .

لذلك يكفي return 0 .

بالتوفيق.

#9

شكرا لكم

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#10

شكرا لك وبارك الله فيك على الدرس الرائع والمفيد

عندي بعض الاستفسارات

لقد قمت انت بتحويل البيانات المخزنة في الفئة الى بيانات ثنائية، ونلاحظ في التحويل انك وضعت الاسم name ثم يليه العمر age ، واعتمدت على ذلك في عملية الارجاع.

لا يوجد عندي كيو تي حاليا على الجهاز، فهل من الممكن ان تضع لنا البيانات الثنائية التي تم حفظها في stream للنظر فقط .

هل حجم (طول) الـ stream يساوي مجموع احجام البيانات الاصلية التي خزنت فيه؟

لو وجد في فئة معينة الحقلين name1,name2 ، وعند التحويل تم ارفاقهما متتاليين name1>>name2 فهل يوجد مشكلة؟؟ لأنه في هذه الحالة قد يصبح name1,name2 عبارة عن سلسلة حروف متصلة لا يمكن فصلها فيما بعد !!!

عذرا على الاسئلة الكثيرة ولكن في النهاية الفائدة للجميع

#11

اضف الشيفرة التالية

for(int i=0;i<ba.count();i++){
    qDebug()<<(unsigned int)ba.at(i);
    qDebug()<<" ";
}

وستجد هذا الحل

0 

0 

0 

34 

0 

109 

0 

111 

0 

104 

0 

97 

0 

109 

0 

109 

0 

101 

0 

100 

0 

32 

0 

97 

0 

108 

0 

97 

0 

98 

0 

100 

0 

97 

0 

108 

0 

121 

0 

0 

0 

20

السؤال الثاني هل سوف يتغير حجمه الإجابة لا حجمه = حجم البيانات المدخلة

السؤال الثالث كلا لا توجد مشاكل Qt تتكفل بهذا العمل لإراحتنا :lol:

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#12

شكرا على التوضيح :)

مواضيع مشابهة