PDA

View Full Version : نحوه حذف اطلاعات از فایل های باینری یا txt



RF.Ariyapoor
سه شنبه 08 مرداد 1387, 10:51 صبح
دوستان اگه ما یه فایل باینری داشته باشیم که توش یه سری اطلاعات داریم و میخوایم مثلا یه سری از اطلاعات رو که وسط فایل قرار داره پاک کنیم چه کار باید بکنیم

مثلا 10 تا رکورد تو یه فایل باینری ذخیره کردیم حالا میخوایم رکورد 6 امی رو حذف کنیم باید چه طور این کارو بکنیم ؟

Nima_NF
سه شنبه 08 مرداد 1387, 15:13 عصر
در یک فایل باینری به این شکل می توانید عمل کنید که یک لیست پیوندی داشته باشید (با استفاده از vector در ++C) که در آن رکوردهای شما قرار دارد، با استفاده از دستور erase می توانید بگویید رکورد 6 حذف شود و سپس در پایان محتویات لیست جدید را مجددا در فایل ذخیره کنید.

RF.Ariyapoor
سه شنبه 08 مرداد 1387, 21:58 عصر
من زیاد با stl آشنایی ندارم ایشالا از برنامه هامه که بخونمشون

یعنی شما میگید که ما در هر بار اجرا کل فایل رو بخونیم و همه رو در یک لینک لیست در طول برنامه ذخیره کنیم و همه تغییراتی که ایجاد میشه تو لینک لیست اعمال کنیم بعد که خواستیم از برنامه خارج بشیم کل لینک لیست رو روی کل فایل (روی اطلاعات قبلی) بنویسیم ؟

emad_67
سه شنبه 08 مرداد 1387, 23:43 عصر
روشی که آقا نیما گفت روش خوبیه. وکتور در c++ کلاسی مبتنی بر template هست که میتونی هر نوع داده ای رو در اون قرار بدی. به طور ساده وکتور مثل آرایه ای هست که طول اون ثابت نیست و بر اساس تعداد متغیر ها یا اشیایی که در اون قرار میدی تغییر میکنه. حالا بعد از اینکه کل رکورد هاتو ریختی توی وکتور خیلی راحت میتونی اونو در یک فایل ذخیره کنی. برای حذف رکورد هم باید مجددا کل اونو بخونی و اون رکوردی رو که میخوای حذف کنی و دوباره اونو توی فایل رایت کنی.

در مورد وکتور ها یه مثال ساده رو اینجا ببین:
http://barnamenevis.org/forum/showthread.php?t=72963&highlight=vector

یه روش دیگه اینه که که مثلا بیای یه struct یا کلاس تعریف کنی و یک شی از اون کلاس بسازی و بعد از دریافت داده ها اون رکورد رو در فایل ذخیره کنی. تفاوت این روش با قبلی اینه که در این روش تک تک، رکورد ها رو در فایل ذخیره می کنی و همچنین برای بازیابی اون مستقیما میتونی همون رکورد رو بخونی. ولی در روش قبل تمام رکورد ها در شی ایی از کلاس وکتور ذخیره شده و برای خوندن یک رکورد نیاز داری که اون شی رو که حاوی همه رکورد هاست از فایل بخونی.
برای حذف رکورد ها با روش دوم هم اینجا رو ببین:
http://barnamenevis.org/forum/showthread.php?t=113010

RF.Ariyapoor
چهارشنبه 09 مرداد 1387, 00:02 صبح
ممنون خیلی مفید بود

Nima_NF
چهارشنبه 09 مرداد 1387, 00:47 صبح
تفاوت این روش با قبلی اینه که در این روش تک تک، رکورد ها رو در فایل ذخیره می کنی و همچنین برای بازیابی اون مستقیما میتونی همون رکورد رو بخونی. ولی در روش قبل تمام رکورد ها در شی ایی از کلاس وکتور ذخیره شده و برای خوندن یک رکورد نیاز داری که اون شی رو که حاوی همه رکورد هاست از فایل بخونی.

نه، کار با vector ها دقیقا همان ذخیره کردن رکوردها به صورت تک تک هست.

به این شکل که از vector فقط برای راحت کردن کار استفاده می کنیم و در هنگام نوشتن در فایل کل vector را ذخیره نمی کنیم، بلکه تک تک از ابتدا با شمارنده آن رکورد ها را در فایل ذخیره می کنیم و برای اینکه اطلاعات کافی در هنگام خواندن داشته باشیم در ابتدای فایل تعداد رکوردها (یا همان طول vector) را نیز ذخیره می کنیم.

پس اگر مثلا فقط بخواهید رکورد 4 را تغییر دهید، نیازی نیست که کل فایل را در vector بریزید، بلکه می توانید مستقیم ابتدا طول فایل را (مثلا یک int) از فایل بخوانید و سپس به اندازه 3 تا رکورد به جلو بروید (sizeof) و در آنجا رکورد جدید را جایگزین کنید (بر روی قبلی بنویسید).

می بینید که دقیقا به همان شکل هست، فقط vector ها (یا موارد STL مشابه) کارها را دقیق تر و راحت تر می کند (از مرتب سازی گرفته تا سرعت در حذف رکوردها، افزودن و ...)
پس اگر کل فایل را در vector بریزید، همزمان امکان حذف، ویرایش، مرتب سازی و .... به راحتی وجود دارد و در پایان (در صورت نیاز) می توانید بخشی از رکوردها یا کل آنها را ذخیره کنید.