PDA

View Full Version : حرفه ای: خواندن فایل متنی بدون بازکردن آن در #c



reza9025
شنبه 24 آبان 1393, 14:27 عصر
سلام دوستان.

به نظر شما آیا راهی هست که با استفاده از C#‎‎‎ بتنوانم بدون آن که فایل را در حافظه بارگذاری کنم(باز کردن فایل) در آن بدنبال یک متن خاص بگردم.

*. اگه امکانش هست راهنماییم کنید. اگر هم نه به سوال دیگه پیش می آید. ایا می توان از یک فایل متنی که 400 MB حجم دارد فقط قسمتی از آن را خواند(100 MB) و یا مثلا داده های خط 1000 را فقط بیرون کشید. چون بارگذاری این حجم داده در حافظه زمان می خواد و لازمه کار سریع انجام بشه.



ممنون میشم کمک کنید یا یا مثال برام بزنید...

reza9025
شنبه 24 آبان 1393, 15:28 عصر
کسی نبود جواب بده. خیلی کارم گیر کرده...

rambod18
شنبه 24 آبان 1393, 15:36 عصر
در مورد اینکه بدون باز کردنش بشه ازش خوند اطلاعی ندارم
در مورد اینکه میشه اطلاعات مثلا خط 100 رو خوند باید اطلاعات به صورت رکورد ذخیره بشن و فایل هم از نوع باینری باشه

reza9025
شنبه 24 آبان 1393, 15:40 عصر
میشه یه مثالی برام بزنید. یا سورس کدی بهم بدید. چون زیاد نفهمیدم.؟؟؟

rambod18
شنبه 24 آبان 1393, 15:48 عصر
#include<stdio.h>


/* Our structure */
struct rec
{
int x,y,z;
};


int main()
{
int counter;
FILE *ptr_myfile;
struct rec my_record;


ptr_myfile=fopen("test.bin","wb");
if (!ptr_myfile)
{
printf("Unable to open file!");
return 1;
}
for ( counter=1; counter <= 10; counter++)
{
my_record.x= counter;
fwrite(&my_record, sizeof(struct rec), 1, ptr_myfile);
}
fclose(ptr_myfile);
return 0;
}

plus
شنبه 24 آبان 1393, 16:03 عصر
باز کردن فایل به معنی لود کردن کل اون در حافظه نیست.وقتی فایل باز میشه شرایطی توسط سیستم عامل فراهم میشه که شما بتونید از فایل بخونید یا در اون بنویسید بدون اینکه لزوما محتوی فایل توی حافظه آورده بشه.بنابراین، شما میتونید فایل رو باز کنید و بعد از باز کردن، در هر لحظه فقط بخشی از فایل رو که لازم دارین بخونید و در حافظه قرار بدین.
برای مثالی که گفتین، مثلا خوندن خط 1000، باید ابتدا فایل رو باز کنید و چون نمیدونید خط 1000 در کجای فایل هست (از نظر شماره بایت)، باید اول فایل رو پیمایش کنید تا به خط 1000 برسید.برای این کار، باید تک تک بایت ها تا پیدا کردن خط 1000 خونده بشه ولی این معنیش این نیست که کل این بایت ها در حافظه قرار میگیره.شما در هر لحظه 1 یا 2 بایت میخونید و کلا همین مقدار حافظه مصرف میکنید تا محل خط 1000 رو پیدا کنید.
برای مثال خط 1000 در بایت اندیس 12000 تا 12050 هست (50 بایت).بنابراین شما 50 بایت لازم دارین.بافری به اندازه 50 بایت ایجاد میکنید و از محل 12000 تا 12050 میخونید.
---
البته برای اینکه کمتر درگیر مسائله خوندن بایت به بایت داده ها، Encoding و NewLineChar بیشن، میتونید از StreamReader و متد ReadLine استفاده کنید. این متد با هر بار اجرا فقط 1 خط رو میخونه و به حافظه میاره.بنابراین حداکثر حافظه مصرفی -فارغ از در نظر گرفتن مسائل مربوط به Garbage Collector- به اندازه بزرگترین خط درون فایل (قبل از خط مورد نظر) هست.

string GetLine(string fileName, int line)
{
using (var sr = new StreamReader(fileName)) {
for (int i = 1; i < line; i++)
sr.ReadLine();
return sr.ReadLine();
}
}