PDA

View Full Version : سوال: مشکل مفهومی مربوط به فایل و ذخیره سازی در آن



rezabnm
یک شنبه 11 بهمن 1388, 09:47 صبح
مشکل من اساسا در مفهوم دستورات و نحوه عملکرد آن است نه در اجرای برنامه برنامه به نحوه خوبی عمل میکند و هیچ مشکلی در روند برنامه وجود ندارد
************************************************** ***************
سلام به مهندسان عزیز یه راس میرم سر اصل مطلب من برای ذخیره اطلاعاتم از فایل استفاده میکنم و در ذخیره سازی آن هم به روش ترتیبی و هم به روش تصادفی می تونم انجام بدم اما مشکل اصلی در(مفهوم چگونگی انجام پذیرفتن این عمل هست وگرنه که خود ذخیره سازی هیچ مشکلی نیست و به درستی عمل میکند) ذخیره سازی بصورت تصادفی من به روش ذیل این ذخیره سازی را انجام میدهم:

struct info_factor{
int code_factor;
char date[8];
int code_client;
int code_filme;
char name_filme[20];
char type_filme[20];
int count;
int price;
}info;
ساختاری که بر اساس آن ذخیره سازی صورت میگیرد//
ofstream fp("factorclient.text",ios::out|ios::in|ios::binary);
if(!fp){
fp.open("factorclient.text");
{

.
دستورات
.

.


fp.seekp(sizeof(struct info_factor) * info.code_client ,ios::beg);
fp.write((char*)&info,sizeof(struct info_factor));

حالا اون قسمت های رو که مفهومش رو متوجه نمیشم توضیح میدم که شاید شما تونستید در فهمیدن مفهوم این عمل به من کمک کنید:
1.من میدونم که ما از {افپی دات اسکیپ} برای مرتب ساز فایل بر اساس فیلد ی که بعنوان کلید(شاخص)در نظر گرفتیم استفاده میکنیم تا زمانی که میخواهیم به فایل دستیابی داشته باشیم بتوانیم بر اساس آن فیلد به بخش مورد نظر از فایل دستیابی داشته باشیم اما من درست مفهوم دستورات داخل پرانتز را نمیفهمم((اگر که در مفهوم کلی هم ایرادی وارد هست بگید تا متوجه بشم)).
2.در خط بعدی مفهوم عملکرد دستورات داخل پرانتز را کلا متوجه نمیشم
لازم به ذکر است که بگم من این روش را از کتاب سی پلاس پلاس آقا مهندس عین الله جعفر نژاد قمی خوانده ام و یاد گرفتم ولی در آن کتاب هم توذیحات بیشتری داده نشده است و فقط بیان شده همین.

clover
یک شنبه 11 بهمن 1388, 10:15 صبح
.من میدونم که ما از {افپی دات اسکیپ} برای مرتب ساز فایل بر اساس فیلد ی که بعنوان کلید(شاخص)در نظر گرفتیم استفاده میکنی
نه دوست عزیز
seekp برای تنظیم اشاره گر فایل در یک مکان مشخص از فایل مورد استفاده قرار می گیره.
پارامتر اول این تابع نشان دهنده تعداد بایت هایی هست که ما می خواهیم در فایل حرکت کنیم و پارامتر دوم مکان شروع حرکت هست.

در این مورد ما می خواهیم که هر آبجکت از این ساختار با توجه به code_client در فایل قرار بگیره. مثلا اگر code_client برابر با 2 بود، آبجکت مورد نظر در مکان دوم و اگر 3 بود در مکان سوم قرار بگیره، اما یادآوری می کنم که seekp بر اساس بایت عمل می کنه، پس اگر ما بخواهیم آبجکتی را در مکان دوم قرار بدیم باید از روی آبجکت اول رد بشیم که تعداد (sizeof(struct info_factor بایت فضا اشغال کرده. و برای قرار دادن آبجکتی در مکان 4 باید از روی 3 آبجکت قبلی رد بشیم و اشاره گر فایل را در انتهای آبجکت سوم قرار بدیم که برای این کار باید sizeof(struct info_factor) x 3 بایت از ابتدای فایل حرکت کنیم.
و به طور کلی هر آبجکت باید در مکانی به طول sizeof(struct info_factor) * info.code_client بایت از ابتدای فایل (ios::beg) قرار بگیره.

amin1softco
یک شنبه 11 بهمن 1388, 10:35 صبح
به نظر من مشکل از ریشه است!!!!!!؟:لبخند:
seekp کارش پرش به نقاط مختلف فایل است در زمان نوشتن و
seekg کارش پرش به نقاط مختلف فایل در هنگام خواندن است

و
tellp , tellg هم موقعیت کنونی را بر می گردونند
شما برای درک بهتر موضوع می تونی این کار را شبیه علامت چشمک زن در هنگام تایپ در نظر بگیری وقتی می خواهی یک کلمه خاص را ویرایش کنی با ماوس روی محل مورد نظر کلیک می کنی که این معادل هست با جابجایی pointer

حالا
ios::beg یعنی می خواهیم فایل را باز کنیم و اولش چیزی بنویسیم
sizeof(struct info_factor) * info.code_client یعنی به اندازه متغییر کد کلاینت در کلاس اینفو پرش کن

خط بعدی یعنی به اندازه کلاس فاکتور کل کلاس رو در فایل بنویس

amin1softco
یک شنبه 11 بهمن 1388, 10:50 صبح
آقا من داشتم جواب می دادم کسی نبوددددددددددددد!!!!!!!! اینم احتمالا به خاطر سرعت تایپ منه شما ببخشید!×!×!×!
clover