PDA

View Full Version : ذخیره ارایه 2 بعدی در txt



djscsi
سه شنبه 08 اردیبهشت 1388, 14:15 عصر
دوستان من یک ارایه 2 بعدی int دارم
من میخام اونارو در فایل txt ذخیره کنم و در form load هم مقدار ارایه رو از فایل txt بخونه
ممنون

prankster
سه شنبه 08 اردیبهشت 1388, 14:25 عصر
من متدهايي براي 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");

jalalx
سه شنبه 08 اردیبهشت 1388, 14:41 عصر
شما مي تونيد از دو فايل متني براي ذخيره ي اعداد استفاده كنيد!
اگر اسرار داريد كار با يك فايل انجام شود بايد كمي پردازش رشته انجام دهيد. به اين صورت كه عناصر را به صورت 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;
}
}

mehdi.mousavi
سه شنبه 08 اردیبهشت 1388, 15:02 عصر
سلام.



کدی که نوشتید زیاد خوانا نیست. شما 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 مورد استفاده قرار خواهد گرفت.

prankster
سه شنبه 08 اردیبهشت 1388, 15:46 عصر
کدی که نوشتید زیاد خوانا نیست. شما Try/Catch گذاشتید، اما توی Catch دارید دوباره Throw می کنید
منطقيه.
قبل از پست كردن كد هاي داخل بلوك catch را حذف كردم، شايد بهتر بود كلا catch را حذف مي كردم.


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


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

esmaeily-hosein
سه شنبه 08 اردیبهشت 1388, 16:16 عصر
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 بری

djscsi
چهارشنبه 09 اردیبهشت 1388, 12:36 عصر
ممنون دوستان
ولی 2 تا مشکل هست
من با کد پست شماره 2 نوشتم

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

prankster
چهارشنبه 09 اردیبهشت 1388, 14:27 عصر
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 كردن مجدد پشت سر هم نوشته شده است