آقای گروه

اردیبهشت, 1397 بدون نظر آموزش

یکی از بیشترین سوال هایی که توی نظرات سایت مطرح می شود کار با فایل در سی پلاس پلاس است به همین دلیل در این پست از وبسایت آقای گروه به فایل ها در سی پلاس پلاس می پردازیم.

فایل چیست:

فایل غالبا به مجموعه ای از اطلاعات گفته می شود که بر روی یک حافظه ذخیره می شود. با ذخیره کردن این اطلاعات می توان در دفعات بعدی از آن استفاده نمود. به طور کلی کار کردن با یک فایل دارای ۳ مرحله است :

فایل باید باز / ساخته شود.
اطلاعات خوانده / نوشته شود.
فایل بسته شود. 

در سی پلاس پلاس دو نوع فایل می توان ساخت:

فایل متنی : در این فایل تمام اطلاعات به صورت کاراکتر و ذخیره می شود.
فایل باینری (bin): اطلاعات به همان شکلی که در حافظه هستند در فایل ذخیره می شوند.

همین طور برای کار با فایل سه حالت داریم:

in : در این حالت اطلاعات از فایل خوانده می شود.
out : در این حالت اطلاعات به فایل فرستاده می شود و در آن دخیره می شود.
out & in : هم زمان در فایل هم می نویسیم و هم می از آن می خوانیم.

دسترسی به اطلاعات در فایل ها به دو صورت است

ترتیبی : یعنی اطلاعات پشت سره هم در فایل نوشته می شود یا اطلاعات پشت سر هم از فایل خوانده می شود.
تصادفی : در این روش با استفاده از کلید خاصی مستقیم به سراغ رکورد مورد نظر در فایل می رویم.

دو نوع اطلاعات رو هم می شود در فایل ریخت:

نوع داده های ابتدایی مانند : int , float , char , ….
نوع داد های که خودمان تعریف کرده ایم مانند : class , struct
نکته: در سی پلاس پلاس می توان همه ی نوع داده ها را در فایل ذخیره کرد ولی بعضی ها نوع داده را با ساختمان داده هایی همچون map و غیره اشتباه می گیرند. یک ساختمان داده را نمی توان یک جا در فایل ریخت بلکه باید تک تک اجزایش را در فایل ریخت یا از فایل خواند.

هر بار که یک فایل برای نوشتن باز می کنیم دو حالت رخ می دهد:

یک فایل جدید ایجاد می شود ,به طور پیش فرض این حالت رخ می دهد . اگر فایل با آن اسم وجود نداشته باشد یکی ایجاد می کند اگر چنین فایلی موجود باشد آن را از اول می نویسد و همه ی اطلاعات قبلی در آن را پاک می کند.
می توان در ادامه یک فایل نوشت , اگر فایل موجود نباشد یکی ایجاد می کند و اگر فایل موجود باشد می رود در ادامه ی فایل می نویسد که برای این کار می توان از ios::app استفاده کرد.

آموزش کامل کار با فایل در سی پلاس پلاس

ایجاد یک شی برای فایل ها:
برای کار کردن با فایل ها باید شی از کلاس ifstream (برای خواندن اطلاعات) و یا ofstream (برای نوشتن اطلاعات) به شکل زیر بسازیم.

برای ساخت یک شی از کلاس ifstream (برای خواندن اطلاعات) به شکل رو به رو عمل می کنیم:

 
myObjectName : اسم شی از کلاس ifstream است که می خواهید بسازید.

nameOfFile : اسم فایل است , که یک رشته است یا متغییر رشته ای مانند:

یا

 
flag : نوع فایل و طریقه خواندن را مشخص می کند.

مثلا در فایل بالا دو flag زیر که با “|” از هم جدا شده اند قرار دارد.

ios::in : می گوید شی جهت خواندن از فایل ایجاد شده است.

ios::binary : می گوید فایل از نوع باینری است.

شی ها از کلاس ofstream را هم به همین ترتیب ایجاد می کنیم.

نوشتن در فایل متنی :

برای کار کردن با فایل ها باید هدرشان را به برنامه بیافزاییم.

تو این قسمت می خواهیم یک برنامه ساده بنویسیم که سه بار یک اسم و نمره ی اون فرد را بخواند و در فایل بریزد.ابتدا باید یک فایل را ایجاد کنیم. در کد زیر یک شی از جریان خروجی فایل باز کرده ام:

 
outputFile : اسم شی ای از کلاس جریان خروجی فایل است.

“output.dat” : اسم فایلی است که ایجاد کرده ام.

نکته : از آن جایی که در قسمت اول “output.dat” را نوشته ام به طور پیشفرض فایل در محلی که برنامه قرار دارد ایجاد می شود . برای این که فایلی در مسیر دلخواه داشته باشیم به جای “output.dat” باید مثلا بنویسیم

“D:\My programming code\output.dat”

با این کار مسیر پیشفرض ایجاد فایل تغییر می کند.

ios::out : نشان می دهد شی که ساخته شده جهت نوشتن در فایل است.

همیشه بعد از ساخت یک شی از کلاس ifstream و ofstream باید چک کنیم و ببینیم که فایل درست باز شده است یا نه در غیر این صورت ممکن است برنامه ادامه پیدا کند و در عملکرد برنامه مشکل رخ دهد بدون اینکه خطای کامپایلری و یا زمان اجرا گرفته شود.برای چک کردن ساده ترین کار شکل زیر است :

فرض کنید متغییر رشته ای name و متغییر اعشاری score را داریم برای چاپ آن در خروجی تصویری یا صفحه نمایش چه می کنیم ؟ مثلا از cout به شکل زیر استفاده می کنیم :

حالا می خواهید name و score را در فایل متنی outputFile که ایجاد کرده اید بنویسید , تنها کاری که لازم است بکنید جای گذاری cout با شی از جریان خروجی فایل (ofstream) است که آن شی در این مثال outputFile است , به شکل زیر :

خوب قسمت اصلی همین ها بود ، کد زیر هم سه اسم همراه نمرهاشون رو می گیرد و در فایلی که محل اجرای برنامه است ذخیره می کند:

ورودی که من به برنامه دادم :

فایل در سی پلاس پلاس /www.mosiogroup.com

فایلی که در محل اجرای پروژه ایجاد شده :

فایل در سی پلاس پلاس /www.mosiogroup.com
محتویات درون فایل وقتی آن را با Nodepad باز کردم:

محتویات درون فایل وقتی آن را با Nodepad باز کردم:

خواندن از فایل متنی :

در این قسمت می خواهیم از فایل متنی اطلاعات را بخوانیم . برنامه ی می نویسیم که اطلاعاتی را که در قسمت قبل در یک فایل متنی نوشتیم را بخوانیم.

برای خواندن از یک باید یک فایل داشته باشیم ! به همین خاطر فایلی را که در مرحله ی قبل ایجاد کردیم ، در محل اجرای برنامه جدیدمان می ریزم تا دستی یک فایل درست نکنم.

برای خواندن فایل نیاز به یک شی از کلاس جریان ورودی فایل ( ifstream ) داریم که به شکل زیر تعریف می کنیم.

inputFile : نام شی ای است که از جریان ورودی فایل ساخته ایم.

“output.dat” : اسم فایلی است که می خواهیم محتویاتش را بخوانیم.

ios::in : نشان می دهد که فایل را جهت خواندن اطلاعات باز کرده ایم.

بعد از ایجاد شی جریان ورودی فایل مانند قسمت قبل باید چک کنیم ببینیم که فایل باز شده است یا نه بعد برنامه را ادامه دهیم ، با کد زیر این کار را انجام می دهیم:

برای خواندن یک نام و یک نمره از صفحه کلید چه می کنیم ؟ مشخصا از cin به شکل زیر استفاده می کنیم:

برای خواندن یک فایل باید cin را با یک شی از کلاس ورودی فایل جایگزین کنیم ، که این شی ما در این جا inputFile نام دارد. پس برای خواندن یک اسم و نمره اش باید این کار را کنیم :

چیز های ضروری همین ها بودند . در زیر برنامه ای را می بینید که فایل مورد نظر را باز می کند و سه نام را همرا نمرشان می خواند و چاپ می کند.

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

فایل در سی پلاس پلاس /www.mosiogroup.com

نوشتن در فایل باینری :

فایل با فرمت باینری با فرمت متنی فرق دارد و اشیا آن گونه که در حافظه قرار دارند در فایل نوشته می شوند. مثل نوشتن در فایل متنی باید یک شی از کلاس خروجی فایل ایجاد کنیم البته با کمی تفاوت :

ios::binary : نشان می دهد که فایلمان از نوع باینری است . حالا می خواهیم یک عدد اعشاری را در یک فایل باینری بنویسیم ، برای نوشتن در فایل باینری از تابع عضو write استفاده می کنیم:

reinterpret_cast : آدرس متغییری را که به آن پاس می کنیم را به صورت char * در می آورد.

sizeof(float : تعداد بایت های یک نوع داده را مشخص می کند ، متغییر num از نوع float است ، با (sizeof(float می گوییم که متغییری که داریم باهاش کار می کنیم به این اندازه حافظه اشغال می کند .

در برنامه ی زیر یک فایل باینری را باز می کنیم و سه عدد اشاری در آن می ریزیم :

ورودی که من داده ام :

فایل در سی پلاس پلاس /www.mosiogroup.com

محتوای فایل باینری را در اسکرین شات زیر می بینید ، از آنجایی که فایل باینری است بیشتر اوقات مقادیر موجود آن واضح نیستند:

فایل در سی پلاس پلاس /www.mosiogroup.com

خواندن از فایل باینری :

در قسمت قبل یک فایل باینری را نوشتیم حالا می خواهیم اطلاعات آن را بخوانیم ، برای راحتی ابتدا فایل باینری ایجاد شده را به محل برنامه ی جدید منتقل می کنم.

برای خواندن یک فایل باینری باید یک شی از کلاس ورودی فایل ایجاد کنم :

ios::binary : نشان می دهد فایل از نوع باینری است .

فرض کنید یک عدد اعشاری را می خواهم از فایل بخوانم ، برای خواندن از فایل باینری از از دستور read به شکل زیر استفاده می کنیم :

(sizeof(float : می گوید به اندازه ی یک متغییر اعشاری از فایل بخوان و مقدار خوانده شده را در num قرار بده.

در برنامه ی زیر سه عدد باینری نوشته شده در فایل باینری سری قبل را از فایل می خوانیم و چاپ می کنیم :

آشنایی با نام پرچم ها:

کار کردن با فایل ها روش های مختلفی دارد به همین دلیل تعدادی پرچم (flag) طراحی شده است تا کار آسان تر شود. در جدول زیر تعدادی از پرکاربردترین پرچم ها به همراه توضیحات آنها دیده می شود : 

فایل در سی پلاس پلاس /www.mosiogroup.com

نوشتن و خواندن اطلاعات اشیای کلاس :

برای نوشتن یک شی از یک کلاس دو کار می توانیم بکنیم:

۱ – تک تک اجزای کلاس را در فایل بریزیم مثلا اگر کلاسمان از یک عدد صحیح و یک عدد اعشاری تشکیل شده ، اول عدد صحیح را در فایل بریزیم بعد عدد اعشاری را و برای خواندن هم همین طور عمل کنیم.

۲ – کل شی را یکجا در یک فایل باینری بریزیم ، دقیقا مانند کاری که با عدد اعشاری در بالا کردیم.

نوشتن و خواندن رشته ها در فایل باینری :

در کد زیر سه رشته را در یک فایل باینری ریخته ام و سپس آن ها را از فایل باینری خوانده ام:

نمونه سوال:

مسئله اول: آرایه ای متشکل از ۱۰ عدد اعشاری که بیانگر شعاع دایره های مختلف است به شما داده شده است. برنامه ای بنویسید که مساحت دایره های حاصل از این شعاع ها را محاسبه کرده و در یک فایل تحت عنوان result.txt ذخیره کند.

ابتدا یک شی از روی fstream به نام fileObj ساخته شده است. در خط بعدی فایلی تحت نام result.txt باز شده است. لازم به ذکر است اگر این فایل وجود نداشته باشد با این دستور به صورت خودکار ایجاد می شود. سپس از فلگ ios::out استفاده کردیم که بدین معناست می خواهیم اطلاعات را بر روی فایل بنویسیم. در خطوط ۱۱ الی ۱۵ بررسی می شود که عملیات ایجاد stream به درستی انجام شده است یا خیر. در خطوط ۱۷ و ۱۸ در متغیر ابتدایی تحت نام های info و pi تعریف گردیده است. متغیر info شامل اطلاعات مربوط به شعاع دایره ها می باشد که توسط سوال به ما داده شده است. همچنین pi حاوی مقداری تقریبی برای عدد پی است. در خطوط بعدی مشاهده می شود که چگونه با insertion operator عملیات نوشتن در فایل انجام می شود. در نهایت نیز با دستور close، جریان بسته می شود.

خروجی حاصل از این برنامه را در تصویر زیر مشاهده می کنید:

فایل در سی پلاس پلاس /www.mosiogroup.com

مسئله دوم: یک فایل متنی به نام names.txt موجود است. هر خط از این فایل حاوی نام و نام خانوادگی یک دانشجو است. برنامه ای بنویسید که اطلاعات موجود در این فایل متنی را خوانده و در خروجی چاپ کند.

در اینجا از دو عضو تابعی کتابخانه fstream استفاده کردیم. تابع eof که سرواژه End Of File می باشد و با استفاده از آن می توان مشخص کرد که آیا برنامه به انتهای فایل رسیده است یا خیر. دستور دیگر getline است که برای خواندن خط به خط از فایل مورد استفاده قرار می گیرد. تابع getline دارای دو ورودی است، پارامتر اول یک اشاره گر از نوع کاراکتر با طول مشخص است و پارامتر دوم تعداد کاراکتری که از فایل خوانده می شود. شاید این سوال برایتان پیش بیاید که چرا مستقیما از extraction operator استفاده نکردیم ؟ چون در این روش هنگامی که اشاره گر درون فایل به whitespace می رسد آن را نادیده می گیرد و به جای آن از کاراکتر newline استفاده می کند. همین موضوع باعث می شود که یک خط که دارای فاصله میان کلمات است به درستی نمایش داده نشود. خروجی این برنامه را در شکل زیر می بینیم :

فایل در سی پلاس پلاس /www.mosiogroup.com

امید وارم کار با فایل در این مقاله برای شما کامل گفته باشم و اگر مشکلی هست در خدمت هستم و با دادن نظر مارا همراهی کنید.

لطفا برای اطلاع از خدمات دیجیتال مارکتینگ بر روی تصویر ذیل کلیک کنید.

طراحی سایت و اپلیکیشن٬آقای گروه ٫سئو سایت ٫خدمات دیچیتال مارکتینگ/www.mosiogroup.com
آقای گروه

برچسب ها
درباره نویسنده

ارسال نظر شما

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *