نمایش نتایج 1 تا 8 از 8

نام تاپیک: ذخیره ارایه 2 بعدی در txt

  1. #1

    ذخیره ارایه 2 بعدی در txt

    دوستان من یک ارایه 2 بعدی int دارم
    من میخام اونارو در فایل txt ذخیره کنم و در form load هم مقدار ارایه رو از فایل txt بخونه
    ممنون

  2. #2
    کاربر دائمی
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    تهران
    پست
    123

    نقل قول: ذخیره ارایه 2 بعدی در txt

    من متدهايي براي binary serialize و deserialize كردن نوشتم كه از آن استفاده مي كنم:


    public static void BinaryFileSerialize(Object obj, string filePath)
    {
    FileStream fileStream = null;
    try
    {
    fileStream = new FileStream(filePath, FileMode.Create);
    BinaryFormatter b = new BinaryFormatter();
    b.Serialize(fileStream, obj);
    }
    catch
    {
    throw;
    }
    finally
    {
    if (fileStream != null)
    fileStream.Close();
    }
    }

    public static T BinaryFileDeSerialize<T>(string filePath)
    {
    FileStream fileStream = null;
    Object obj;
    try
    {
    if (File.Exists(filePath) == false)
    throw new FileNotFoundException("The file" + filePath + " was not found.", filePath);

    fileStream = new FileStream(filePath, FileMode.Open);
    BinaryFormatter b = new BinaryFormatter();
    obj = b.Deserialize(fileStream);
    }
    catch
    {
    throw;
    }
    finally
    {
    if (fileStream != null)
    fileStream.Close();
    }
    return (T)obj;
    }


    مثلا:

    int[,] myArray = new int[2,3];

    myArray[0, 0] = 1;
    myArray[0, 2] = 2;

    BinaryFileSerialize(myArray, "c:\\test.txt");
    int[,] loadedArray = BinaryFileDeSerialize<int[,]>("c:\\test.txt");

  3. #3

    Cool نقل قول: ذخیره ارایه 2 بعدی در txt

    شما مي تونيد از دو فايل متني براي ذخيره ي اعداد استفاده كنيد!
    اگر اسرار داريد كار با يك فايل انجام شود بايد كمي پردازش رشته انجام دهيد. به اين صورت كه عناصر را به صورت x,a,b ذخيره كنيد و سپس هنگام خواندن آن ها را از يك ديگر جدا كنيد و دوباره به صورت عددي در آرايه ذخيره كنيد.
    اصلا هم سخت نيست!
    اين تابع يك رشته ي ويرگول دار را از جاي ويرگول دو تكه مي كند!
            void Seperate(string source,ref string partA,ref string partB)
    {
    bool flag = false;
    partA = string.Empty;
    partB = string.Empty;
    if (!source.Contains(",")) return;
    foreach (char c in source)
    {
    if (!flag && c != ',')
    partA += c;
    if (flag && c != ',')
    partB += c;
    if (c == ',')
    flag = true;
    }
    }

  4. #4

    نقل قول: ذخیره ارایه 2 بعدی در txt

    سلام.


    • کدی که نوشتید زیاد خوانا نیست. شما Try/Catch گذاشتید، اما توی Catch دارید دوباره Throw می کنید که این کار بی مورد هستش. می تونستید از Try/Finally استفاده کنید، و Catch Block رو ننویسید. البته اونهم به نظر من چندان جالب نیست. بهترین حالت، نوشتن متود مزبور به این شکل هستش:

    public static void BinaryFileSerialize(Object obj, string filePath)
    {
    using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
    {
    BinaryFormatter b = new BinaryFormatter();
    b.Serialize(fileStream, obj);
    }
    }


    به این ترتیب با خارج شدن از using block، آبجکت مربوطه (FileStream) بطور خودکار Dispose میشه...
    • کد شما از BinaryFormatter استفاده می کنه. ایشون پرسیدن چطور میشه در یک فایل TEXT مقادیر رو نوشت، در صورتیکه فایلی که شما با BinaryFormatter ایجاد می کنید، Binary خواهد بود. ضمنا، فایل فقط شامل اطلاعات مورد نظر شما نیست و بسته به اینکه چه Object ای رو Serialize کنید، اطلاعات Assembly مربوطه هم میتونه داخل فایل قرار بگیره. این اطلاعات، هنگام Deserialize کردن Object مورد استفاده قرار خواهد گرفت.

  5. #5
    کاربر دائمی
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    تهران
    پست
    123

    نقل قول: ذخیره ارایه 2 بعدی در txt

    کدی که نوشتید زیاد خوانا نیست. شما Try/Catch گذاشتید، اما توی Catch دارید دوباره Throw می کنید
    منطقيه.
    قبل از پست كردن كد هاي داخل بلوك catch را حذف كردم، شايد بهتر بود كلا catch را حذف مي كردم.

    بهترین حالت، نوشتن متود مزبور به این شکل هستش
    استفاده از using statement كد منظم و كمتري است، كلا مشكلي كه با using statement‌ دارم اين است كه اگر در constructor مشكلي بوجد آمد نمي توان از آن در همين بلوك مطلع شد و استفاده از يك Try/Catch ديگر لازم است

    ایشون پرسیدن چطور میشه در یک فایل TEXT مقادیر رو نوشت،
    فايل متني لزوما به معني plain text نيست، در هر حال قبول دارم كه با seialize كردن اطلاعات كد شده و بسته به نوع assembly اطلاعات بيشتري هم در مورد assembly در فايل قرار مي گيرد

  6. #6
    کاربر دائمی آواتار esmaeily-hosein
    تاریخ عضویت
    مهر 1385
    محل زندگی
    شهر دودها
    پست
    227

    نقل قول: ذخیره ارایه 2 بعدی در txt

    int[][] jaggedArray = {
    new int[] {1,2,3,4,128},
    new int[] {1,2,3,128},
    new int[] {1,2,128}
    };

    XmlSerializer serializer = new XmlSerializer(jaggedArray.GetType());
    using (FileStream fStream = File.Create("C:\\jaggedArray.txt"))
    {
    serializer.Serialize(fStream, jaggedArray);
    }
    درضمن MultidimensionalArray رو به این روش نمیشه Serilize کرد .
    توصیه میکنم برای اطلاعات بیشتر به سایت JSON.org بری

  7. #7

    نقل قول: ذخیره ارایه 2 بعدی در txt

    ممنون دوستان
    ولی 2 تا مشکل هست
    من با کد پست شماره 2 نوشتم

    اولا که در فایل txt به جای عدد یه مشت چیزای نا مفهوم میاد
    دوم اینکه حالا چه طوری از فایل بخونم و در ارایه بزارم
    ممنون

  8. #8
    کاربر دائمی
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    تهران
    پست
    123

    نقل قول: ذخیره ارایه 2 بعدی در txt

    1- اگر در فايل text دقيقا اعداد يا فرمت خاصي را مي خواهيد بايد متد خاصي هم براي serialization بنويسيد، اگر صرف دسترسي به فايل به صورت خوانا كافي است از xml يا soap serialization مي توانيد استفاده كنيد.
    soap serialization:

    لازم است ابتدا System.Runtime.Serialization.Formatters.Soap را add reference كنيد

    public static void SoapFileSerialize(object obj, string filePath, Encoding encodingType)
    {
    using (Stream stream = new MemoryStream())
    {
    SoapFormatter sf = new SoapFormatter();
    sf.Serialize(stream, obj);

    stream.Position = 0;
    byte[] b = new byte[stream.Length];
    stream.Read(b, 0, (int)stream.Length);

    using (StreamWriter sw = new StreamWriter(filePath, false, encodingType))
    {
    sw.Write(encodingType.GetString(b, 0, b.Length));
    }
    }
    }

    public static T SoapFileDeSerialize<T>(string filePath)
    {
    Object obj;

    if (File.Exists(filePath) == false)
    throw new FileNotFoundException("The file" + filePath + " was not found.", filePath);

    using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
    {
    SoapFormatter sf = new SoapFormatter();
    obj = (object)sf.Deserialize(fileStream);
    }

    return (T)obj;
    }


    براي استفاده:

    int[][] jaggedArray = newint[2][];
    jaggedArray[0] = newint[2];
    jaggedArray[1] = newint[2];

    jaggedArray[0][0] = 1;
    jaggedArray[0][1] = 2;
    jaggedArray[1][0] = 3;
    jaggedArray[1][1] = 4;


    SoapFileSerialize(jaggedArray, "c:\\test.txt", Encoding.UTF8);

    int[][] loadedJaggedArray = SoapFileDeSerialize<int[][]>("c:\\test.txt");


    save و load كردن مجدد پشت سر هم نوشته شده است
    آخرین ویرایش به وسیله prankster : چهارشنبه 09 اردیبهشت 1388 در 14:41 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •