ذخیره اطلاعات در یک فایل به صورت تصادفی

m_mx2009

Member
سلام به همه دوستان.
لطفا اگه میشه نحوه ذخیره متغیرها رو یک فایل به صورت تصادفی در #C توضیح بدین.
میخوام که برنامه یک سری اطلاعات رو بتونه به فایل اضافه کنه یا حذف کنه و یا ویرایش کنه.
تصادفی بودن مهمه چون سرعت مطرحه.همونطور که میدونید اگه به صورت ترتیبی باشه باید برای دسترسی به یک متغیر تمام متغیرهای قبل از اون خونده بشه که کار وقتگیری هستش.
ممنون میشم که راهنمایی کنید:rose:
 

S.I.A

New Member
جواب سوال

سلام شرمنده من هیچی از برنامه نویسی بلد نیستم ولی می توانی اطلاعات را به صورت آرایه [] در بیاری و برای تصادف از Rondom استفاده کنی
بازم می گم من هیچی بلد هستم (هستم )
بای
 

ARAsoftware

Member
تا جایی که من اطلاع دارم نمیشه از داخل یه فایل اطلاعات رو به صورت تصادفی خوند
چرا با دیتا بیس کار نمیکنی؟‍!

برای تصادف از Rondom استفاده کنی
بازم می گم من هیچی بلد هستم (هستم )

شما اول یه تحقیقی درباره دستیابی تصادفی ( random access ) انجام بده واسه آینده ت خوبه!
 

S.I.A

New Member
سوال

random access یعنی چی ؟؟من یک برنامه نویس !!! فکر نکنم برنامه نویسی بلدباشمولی از شما می پرسم این کلمه چیه ؟این را جواب بده تا به بقیه چیزها رو بهت بگم ؟؟؟
ممنون مطالعه کردم ؟؟؟
 

S.I.A

New Member
سوال دوم

دوست ما ازتون چی خواست و من از شما می پرسم Random چیست ؟؟؟ و آرایه چیست.؟؟؟
 

the_king

مدیرکل انجمن
منظورشون از تصادفی دسترسی به شیوه Random Access است، با اعداد تصادفی Random اشتباه گرفته نشود.
در شیوه دسترسی تصادفی به فایل، موقعیت داده ای که قصد خواندن یا نوشتن اش را داریم کاملا مشخص است،
مثلا در یک فایل 500 بایتی، 5 رکورد ذخیره شده که طول هر رکورد 100 بایت است. اگر بخواهیم رکورد چهارم را از
این فایل بخوانیم نیازی نیست که رکورد های قبل یا بعد از آن پردازش شوند، کافی است از ابتدای فایل 3 * 100 بایت
به جلو حرکت کرده و سپس 100 بایت را بخوانیم. این 100 بایتی که می خوانیم داده های رکورد چهارم خواهند بود.
سرعت خواندن و نوشتن در شیوه دسترسی تصادفی بالا است چون خواندن و نوشتن یک رکورد ارتباطی با موقعیت
آن رکورد در فایل ندارد و نیازی به پردازش سایر رکورد های داخل فایل نیست.

ابتدا یک کلاس بسازید که فیلد هایی که باید در هر رکورد ذخیره شوند را مشخص کنید. مثلا :
کد:
    public class FileRecord
    {
        public int RecordID;
        public string FirstName;
        public string LastName;
        public double Weight;
        public DateTime Birthday;
    }

اما این کافی نیست، چون باید برای خواندن و نوشتن رکورد در فایل بتوانیم داده های داخلش را به آرایه ای
از بایت ها تبدیل کنیم. پس به کلاس ویژگی Serializable را اضافه کرده و دو تابع برای تبدیل بین رکورد و آرایه ای
از بایت ها می نویسیم :
کد:
    [Serializable()]
    public class FileRecord
    {
        public int RecordID;
        public string FirstName;
        public string LastName;
        public double Weight;
        public DateTime Birthday;

        public static FileRecord FromBytes(byte[] bytes)
        {
            try
            {
                System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter;
                formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                System.IO.MemoryStream buffer = new System.IO.MemoryStream(bytes);
                return (FileRecord)formatter.Deserialize(buffer);
            }
            catch
            {
                return null;
            }
        }

        public byte[] Bytes()
        {
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter;
            formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            System.IO.MemoryStream buffer = new System.IO.MemoryStream();
            formatter.Serialize(buffer, this);
            return buffer.ToArray();
        }
    };
تابع FromBytes می تواند یک آرایه ای از بایت ها را به رکورد تبدیل کند.
تابع Bytes می تواند رکورد را به آرایه ای از بایت ها تبدیل کند.
توجه داشته باشید که طول این آرایه بایت ها ثابت نیست، هر چه مقادیر فیلد ها بزرگتر باشند آرایه نیز بزرگتر خواهد شد.

حالا باید کلاسی بسازیم که این رکورد را در فایل مدیریت کند :
کد:
    public class FileManager
    {
        public int RecordSize = 1024;

        public FileManager(string path)

        public void Clear()

        public int Count

        public FileRecord GetRecord(int index)

        public void SetRecord(int index, FileRecord record)

        public void Insert(FileRecord record)

        public void Delete(int index)

        public void Close()
    };
طول رکورد ها باید ثابت باشند، پس توسط متغیر RecordSize طول آنها را بر حسب بایت مشخص می کنیم. از تغییر دادن
طول رکورد در میان عملیات ها خودداری کنید چون ساختار فایل را بهم خواهد ریخت. فقط زمانی مجاز به
تغییر دادن RecordSize هستید که فایل هیچ رکوردی نداشته باشد.

سازنده کلاس FileManager از شما مسیر فایل را خواهد خواست، مثلا C:\file.dat و اگر این فایل ایجاد نشده باشد
آنرا خواهد ساخت.
روتین Clear تمامی رکورد ها را حذف خواهد کرد.
GetRecord رکورد شماره فلان را از فایل می خواند، اندیس رکورد ها از 0 شروع می شوند.
SetRecord رکورد شماره فلان را در فایل می نویسد.
Insert یک رکورد به انتهای فایل اضافه می کند.
Delete رکورد شماره فلان را از فایل حذف می کند. اگر رکورد مذکور آخرین رکورد فایل نباشد، رکورد آخر فایل جای
آن قرار خواهد گرفت تا نیازی به جابجا کردن همه رکورد های بعدی نباشد و سرعت حذف کردن افزایش یابد.
Close فایل را خواهد بست. اصولا زمانی که دیگر کاری با فایل ندارید این روتین را اجرا خواهید کرد.

به پروژه پیوستی مراجعه کنید. ReadWriteBinaryRecord.zip
 

پیوست ها

  • ReadWriteBinaryRecord.zip
    63.9 کیلوبایت · بازدیدها: 9

S.I.A

New Member
بخشش

ببخشید که من این چند روزه کمی شلوغ کردم من همه ی این چیزها را آنقدر مطالعه کردم که همه را فول هستم فقط می خواستم با دادن سوالات به دوستان درست و غلط آنها را به سمت و سویی راهنمایی کنم که به جایی که من هستم دست بیابند .ولی از نظر خودم زیاد شلوغ کردم فکر کنم باید برم ....به امید دیدار
 

جدیدترین ارسال ها

بالا