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

file in c++

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

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

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

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

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

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

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

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

  1. نوع داده های ابتدایی مانند : int , float , char , ….
  2. نوع داد های که خودمان تعریف کرده ایم مانند : class , struct

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

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

  1. یک فایل جدید ایجاد می شود ,به طور پیش فرض این حالت رخ می دهد . اگر فایل با آن اسم وجود نداشته باشد یکی ایجاد می کند اگر چنین فایلی موجود باشد آن را از اول می نویسد و همه ی اطلاعات قبلی در آن را پاک می کند.
  2. می توان در ادامه یک فایل نوشت , اگر فایل موجود نباشد یکی ایجاد می کند و اگر فایل موجود باشد می رود در ادامه ی فایل می نویسد که برای این کار می توان از 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  است , به شکل زیر :

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

 

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

input 1

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

make file in c++

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

content of file

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

input 2

 

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

content of file 2

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

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

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

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

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

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

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

 

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

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

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

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

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

 

باقیمانده ی نوشته را در روزهای آینده کامل می کنم.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

۲۹ comments

  • با سلام
    مقالتون خیلی خوب بود
    فقط یک سوال دارم من اگه یه متنی را در یگ فایل متنی بنویسم و سیو کنم بعد فردا بخوام یه چیز دیگه به اون فایل اضافه کنم باید چیکار کنم ؟ مشکلی که من دارم اینه که دوباره روی همون متن گذشته over write میشه.

    • سلام

      فایل را با فرمت زیر برای نوشتن باز کن مثال:

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

  • سلام …
    تشکر بابت توضیح مفیدتون ….

  • محمد شفیعی

    سلام.
    ممنون. عالی بود.

  • باسلام وخسته نباشید
    میخواستم بپرسم چطوری ما یک فایل رو اپدیت کنیم؟؟
    اگه میشه یه توضیح کامل بفرمایید

    • فرهاد دلیرانی

      بستگی داره فایلت رو چطور ساخته باشی ! با دسترسی تصادفی یا ترتیبی.

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

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

  • kheili khub bud tozihatun.mamnoon

  • سلام به همگی…
    سوال داشتم؟ چه طور میشه اسم فایل رو تو برنامه وارد کرد و یا آدرسش رو؟؟؟؟
    تو c++

    • فرهاد دلیرانی

      به جای اون رشته که هنگام ساخت فایل می نویسی یه رشته بذار!

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

  • عاللللللییییییییییییییی خسته نباشید

  • فوق العاده بود.سپاس فراوان

  • زینب محمدتبار

    سلام
    واقعا ممنونم. من هیچ اطلاعاتی در مورد فایلهای سی پلاس پلاس نداشتم و برای پروژه ای احتیاج پیدا کردم و با خواندن مطالب سایت شما کاملا یاد گرفتم.
    😀

  • سلام ، برای برنامه نویسی به زبان سی یا سی پلاس ، چه نرم افزاری رو پیشنهاد میکنید ؟ و اینکه در مسابقات برنامه نویسی مثلا : ای سی ام بیشتر از چه نرم افزار هایی برای این زبان استفاده میکنند ؟
    و من میخواستم ببینم نرم افزار turbo برای اینکار مناسب هست ؟
    با تشکر

  • آیا حقیقت داره که زبان سی نسبت به سی پلاس پلاس قویتره وسرعت اجرای بالاتری
    داره؟بخاطر همینه که برای نوشتن سیستم عاملها و برنامه های سیستمی و سطح پایین از سی استفاده میشه وسی پلاس به ندرت استفاده میشه؟

    • فرهاد دلیرانی

      هر دوشون جز سریع ترین و قوی ترین زبان های برنامه نویسی دونیا هستند، از نظر قدرت کاملا بستگی به زمینه ی مورد استفاده دارد ولی اگر کلی بگیم به نظر من سی قوی تره چون دست برنامه نویس توش بیشتر بازه ولی یادگیری و کار باهاش سخت تره در حالی که سی پلاس تقریبا از نظر سرعت و قدرت نزدیک سی است و کلی کتابخانه و …. دارد و برنامه نویسی شی گرا را به خوبی پشتیبانی می کند.
      ولی سی به سخت افزار نزدیک تر است و سرعت بیشتری دارد، به همین دلیل است در توسعه ی سیستم عامل ها مورد استفاده قرار می گیرد

  • سلام
    با تشکر از راهنماییتان.

  • سلام
    ممنون از این همه اطلاعات جامع و مفید ، تمام اطلاعاتی که لازم داشتم در این پست دریافت کردم.

  • سلام
    برای مقایسه محتوای ۲ فایل (مثلا تکست ) هم میشه توضیح بدین ؟!

    • محمد جمالی

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

Leave a Reply

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