ورود

View Full Version : مبتدی: MFC - روش های خواندن از یک فایل Text



AAtoZZ
سه شنبه 02 آذر 1389, 16:17 عصر
برای خوندن از یک فایل Text چند روش وجود داره؟ (مثلا فایل Unicode)
اگر میشه نمونه کد هم بذارید کافیه کل فایل رو درون یک آرایه WCHAR قرار بده.
ممنون

________________________
من خودم دنبال گشتم، شیوه های مختلفی دیدم که دقیقا متوجه نشدم کدوم مربوط به MFC میشه.

mehdi.mousavi
چهارشنبه 03 آذر 1389, 15:59 عصر
برای خوندن از یک فایل Text چند روش وجود داره؟ (مثلا فایل Unicode) اگر میشه نمونه کد هم بذارید کافیه کل فایل رو درون یک آرایه WCHAR قرار بده. ممنون من خودم دنبال گشتم، شیوه های مختلفی دیدم که دقیقا متوجه نشدم کدوم مربوط به MFC میشه.

سلام.
با فرض به اینکه فایل temp.txt یه فایل Unicode باشه، می تونید به این شکل عمل کنید:


CFile file(_T("d:\\temp.txt"), CFile::modeRead | CFile::shareDenyWrite);
size_t cbLength = (size_t)file.GetLength();

WCHAR *pData = new WCHAR[cbLength / sizeof(WCHAR) + 1];
if(pData)
{
UINT read = file.Read(pData, cbLength);
if(read)
pData[read / sizeof(WCHAR)] = NULL;

delete pData;
}


دقت کنید که GetLength اندازه فایل رو بر اساس Byte بر میگردونه. در نتیجه، کافیه تا حافظه ای که میگیرم، نصف اون مقدار از نوع WCHAR باشه، چون sizeof(WCHAR) == 2 هستش. در نهایت به نحوه استفاده از مقدار بازگشتی Read نیز دقت کنید. متاسفانه بسیاری از افراد فکر میکنن همواره مقدار داده شده در پارامتر دوم Read توسط این متود برمیگرده، که خوب، این صحت نداره...

در نهایت به این مساله دقت کنید که اگر حجم فایل مورد نظر زیاد باشه، بهتر اینه که داده رو بصورت Chunk/Chunk بخونید، بطور نمونه بسته های 8 کیلوبایتی و سپس اونها رو در یک Buffer دیگه Concatenate کنید تا Performance برنامه نیز قابل قبول باشه.

موفق باشید.

Mehrdad-p70
یک شنبه 24 بهمن 1389, 07:41 صبح
سلام
اگه میشه بیشتر توضیح بدید به خصوص در مورد قسمت آخر مطلبتون ... اگه حجم فایل زیاد بشه چی میشه؟

mehdi.mousavi
یک شنبه 24 بهمن 1389, 17:19 عصر
سلام اگه میشه بیشتر توضیح بدید به خصوص در مورد قسمت آخر مطلبتون ... اگه حجم فایل زیاد بشه چی میشه؟

سلام.
وقتی حجم فایل زیاد باشه، خوندن به یکباره اون و آوردنش در حافظه کار درستی نیست و سیستم رو به زانو در میاره. به همین دلیل، عموما تنها بخشهایی از فایل Load میشه که مورد نیازه... منظورم از خوندن Chunk/Chunk اطلاعات در واقع خوندن محتوای فایل در بسته های کوچک (مثلا 32KB) بود، بدین ترتیب که پس از خوندن هر بسته، عملیات مورد نظر رو روی داده های خونده شده انجام بدیم، سپس اونها رو کنار بذاریم و از همون Buffer برای خوندن 32KB بعدی استفاده کنیم. اینطوری دیگه مجبور نیستیم تا کل فایل رو به یکباره در حافظه Load کنیم... یا فرضا اگر قصد Compress کردن داده ها رو داریم (و در صورتیکه الگوریتم مربوطه بتونه Forward Only عمل کنه) میتونیم داده ها رو در دو Chunk مختلف بصورت موازی Compress کنیم بدون اینکه کل فایل رو در حافظه Load کنیم...

موفق باشید.

Mehrdad-p70
سه شنبه 26 بهمن 1389, 17:35 عصر
ممنون

2تا سوال دیگه:
اول اینکه این فایل text را کجا کپی کنیم تا برنامه بتونه اون را بخونه؟
دوم ایتکه وقتی محتویات را خوند میشه از داده های داخل فایل در برنامه استفاده کرد؟