PDA

View Full Version : سوال: سوال درمورد Reverse کردن آرایه ها بدون استفاده از حافظه رم



mahdinga
چهارشنبه 03 دی 1393, 18:26 عصر
چطوري ميشه Reverse يه آرايه رو به صورت يه آرايه ديگه از يه تابعي گرفت.
با Array.reverse ميشه يه آرايه رو برعکس کرد اما من ميخوام برعکس اون آرايه رو با مقدار بدست بیارم
راستش آرایه مورد نظر من ممکنه خیلی حجم داشته باشه و Readonly ـه به خاطر همین نمیتونم به یه آرایه دیگه کپی و سپس Reverse ـش کنم چون به مقدار زیادی حافظه رم احتیاج داره
چطوری میشه مشکل رو حل کرد؟؟؟

rahnema1
چهارشنبه 03 دی 1393, 21:27 عصر
سلام
اینجور که نمیشه
شما لازمه دو تا آرایه همزمان در حافظه داشته باشید یکی همون اصلیه و دومی اونی هست که توسط تابع برگردونده میشه

mahdinga
پنج شنبه 04 دی 1393, 12:58 عصر
ینی هیچ راهی برای Revesrse کردن مثلاً آرایه بایتی که از File.ReadAllBytes خونده میشه و اون رو مستقیما با File.writeallbytes به یه فایل نوشت،وجود نداره؟؟؟

aminmousavi
پنج شنبه 04 دی 1393, 14:06 عصر
سلام دوست عزیز .چرا میشه . فقط به یک متغیر byte به عنوان swap نیاز دارین :


byte[]Character= File.ReadAllBytes(_addres);
byte swap;
for (int i = 0; i < (Character.Length/2); i++)
{
swap = Character[i];
Character[i] = Character[(Character.Length - 1) - i];
Character[(Character.Length - 1) - i] = swap;
}
string res = Encoding.UTF8.GetString(Character);

mahdinga
پنج شنبه 04 دی 1393, 14:33 عصر
سلام دوست عزیز .چرا میشه . فقط به یک متغیر byte به عنوان swap نیاز دارین :


byte[]Character= File.ReadAllBytes(_addres);
byte swap;
for (int i = 0; i < (Character.Length/2); i++)
{
swap = Character[i];
Character[i] = Character[(Character.Length - 1) - i];
Character[(Character.Length - 1) - i] = swap;
}
string res = Encoding.UTF8.GetString(Character);


درسته اما بازم از حافظه رم استفاده زیادی میکنه.تو فایل هایی با حجم بسیار بالا مثلاً 1 یا 2 GB کار نمیکنه

rahnema1
پنج شنبه 04 دی 1393, 14:38 عصر
این تابع می تونه این کار را انجام بده فقط لازمه سایز بافر را تعیین کنید یعنی حافظه موقتی که برای خواندن و نوشتن در اختیار دارید

void ReadWrite1(int BufferSize, string inpuFile, string ouputFile)
{
byte[] buffer = new byte[BufferSize];
Stream fin = File.OpenRead(inpuFile);
Stream fout = File.OpenWrite(ouputFile);
int rdsiz = (int)fin.Length - ((int)fin.Length / BufferSize) * BufferSize;
for (int i = (int)fin.Length/BufferSize; i >= 0 ; i--)
{
fin.Seek(i * BufferSize,0);
fin.Read(buffer, 0, rdsiz);
Array.Reverse(buffer, 0 , rdsiz);
fout.Write(buffer, 0, rdsiz);
rdsiz = BufferSize;
}
fin.Close();
fout.Close();
}

mahdinga
جمعه 05 دی 1393, 11:35 صبح
این تابع می تونه این کار را انجام بده فقط لازمه سایز بافر را تعیین کنید یعنی حافظه موقتی که برای خواندن و نوشتن در اختیار دارید

خیلی ممنون.کد شما خیلی به دردم خورد.اما بازم یه مشکل داره اونم اینه که آرایه ای که میسازه بعد از استفاده از بین نمیبره و یه آرایه جدید میسازه.(تو تسک منیجر مقدار حافظه رم دائماً افزایش میافت و بعد از اینکه فایل درست شد و تموم شد رم خالی میشه)هر کاری کردم نتونستم جوری دستکاری کنم که تو همون متغییر ها ذخیره کنه.
ولی بازم ممنون.خیلی کمکم کرد

rahnema1
جمعه 05 دی 1393, 18:27 عصر
اینجور فکر نکنم مشکلی پیش بیاد

void Reverse1(byte[] buffer, int index, int length)
{
int nesf = index + (length - 1) / 2;
int j = index + length - 1;
byte temp;
for (int i = 0; i < nesf; i++)
{
temp = buffer[i];
buffer[i] = buffer[j];
buffer[j--] = temp;
}
}
void ReadWrite1(int BufferSize)
{
byte[] buffer = new byte[BufferSize];
Stream fin = File.OpenRead("myfile.txt");
Stream fout = File.OpenWrite("myfile2.txt");
int rdsiz = (int)fin.Length - ((int)fin.Length / BufferSize) * BufferSize;
for (int i = (int)fin.Length/BufferSize; i >= 0 ; i--) {
fin.Seek(i * BufferSize,0);
fin.Read(buffer, 0, rdsiz);
Reverse1(buffer, 0 , rdsiz);
fout.Write(buffer, 0, rdsiz);
rdsiz = BufferSize;
}
fin.Close();
fout.Close();

}