# Native Code > برنامه نویسی با C > برنامه نویسی با زبان C و ++C > آموزش: نحوه استفاده از فایلها در C و ++C

## baran_mehr

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

----------


## baran_mehr

*جريان ها و فايل* 
++C کليه عمليات ورودی و خروجی و فايل را به صورت جريانی از بایت ها انجام می دهد. یک جریان (stream) یک دنباله از بایت ها است که هر بایت نشان دهنده یک کاراکتر است. جریان ورودی بایت هایی را از دستگاه ورودی، معمولا صفحه کلید یا یک فایل روی دیسک دریافت می کند. جريان خروجی بايت هائی را به صفحه نمايش، چاپگر يا فايل می فرستد. 

برنامه بايد ارتباطی بين جريان و يک فايل معين روی ديسک برقرار کند. به عبارت ديگر يک جريان مربوط به فايل بايد قبل از استفاده باز شود. بعد از باز کردن فايل می توان اطلاعات را از فايل خواند يا درون فايل نوشت. هر فايل باز شده يک اشاره گر فايل دارد که بر اساس تعداد بايت هائی که از ابتدای فايل خوانده يا نوشته شده است موقعيت درون فايل را مشخص می کند. دسترسی به فايل باعث می شود اين اشاره گر بهنگام شود. 

دو نوع دسترسی به فايل وجود دارد: ترتيبی و تصادفی. در دسترسی ترتيبی (sequential access) داده ها از فايل به ترتيب از ابتدا تا انتها خوانده می شوند. فايل با دسترسی مستقيم يا تصادفی (random access) اجازه می دهد اشاره گر فايل به هر نقطه مورد نظر در فايل پرش کند.

يک جريان فايل می تواند در دو مد متن (text) يا باينری (binary) باز شود. يک فايل متن شامل مجموعه ای از خطوط است. هر خط شامل مجموعه ای از کاراکترهاست که به کاراکتر انتهای خط (newline) ختم می شود (کاراکترهای با کد اسکی 10 و 13). ماکزيمم طول هر خط 255 کاراکتر است. 

نکته. بخاطر داشته باشيد هر خط يک رشته منتهی به کاراکتر NULL نيست بلکه به کاراکتر انتهای خط ختم می شود. 

فایل های مسطح متنی نوعی فایل ترتیبی هستند. ++C با این فایل ها به صورت دنباله ای از بایت ها برخورد می کند، فایل های ترتیبی ساختار اضافی ندارند هرساختار اضافی باید توسط برنامه تحمیل شود. راهی برای گردش در فایل های ترتيبی وجود ندارد، فايل هميشه بايد از ابتدا شروع شود.

فايل باينری داده ها را به همان فرمتی که در حافظه اصلی نمايش داده می شوند روی ديسک ذخيره می کند. بنابراين مانند فايل های متن اعداد به کاراکتر تبديل نمی شوند. اگر فايل باينری در يک اديتور متن باز شود اعداد به صورت کاراکترهای نامفهوم نمايش داده می شوند. فايل های باينری از هيچ نشانه ای برای جدا کردن خطوط داده ای استفاده نمی کنند. 


*اشيای ifstream و ofstream*
در ++C برای کار کردن با فايل از کلاس های ifstream، ofstream و fstream استفاده می شود که در کتابخانه fstream.h تعريف شده اند. اشيای ifstream و ofstream مشابه cin و cout هستند. این اشیا می تواند در برنامه برای نمایش فایل های مسطح و دستکاری آنها بکار رود.

کلاس ifstream برای فايل های ورودی استفاده می شود. اگر می خواهيد فايلی را به منظور خواندن از آن باز کنيد یک نمونه از این کلاس را مانند زرر ایجاد کنید. 
ifstream fin(); 

برای باز کردن فايلی به منظور نوشتن در آن بايد يک شیء ofstream ايجاد کرد. 
ofstream fout(); 

کلاس ifstream شامل گروهی از توابع مورد استفاده روی فايل های ورودی است و کلاس ofstream توابع خروجی در فایل را دارد. عملکرد هردو در fsream ترکیب می شود. متدهای اصلی در جدول زیر نشان داده شده اند. 

*عملکرد تابع* 
attach : به stream جاری فایل موجود می چسباند 
  clear :  محتوای بافر را پاک می کند 
 close : فایل باز متنی يا باينری را می بندد 
eof : آیا در انتهای فایل باز شده می باشد یا خیر 
get : یک کاراکتر از فایل می گیرد 
getline  : یک خط کامل از فایل می گیرد 
is_open : اگر فایل باز متنی يا باينری شده باشد true بر می گرداند  
open : یک فایل متنی يا باينری را باز می کند 
read  : از فايل باينری می خواند  
seekg: در مد باینری می تواند به مکان مشخصی از فایل برود 
seekp: ممحل اشاره گر فایل متن را تنظیم می کند 
tellg  : موقعیت جاری اشاره گر فایل باينری را می دهد 
 tellp : اشاره گر جاری فایل متن را بازیابی می کند 
write : یک دنباله از بايت ها را در فایل باينری می نویسد

----------


## baran_mehr

*نام فايل*
هر فايل روی ديسک دارای نامی است که هنگام کار کردن با آن مورد استفاده قرار می گيرد. نام فايل به صورت يک رشته کاراکتری است. قواعد نامگذاری فايل بسته به سيستم عامل دارد. در C++‎ نام فايل می تواند شامل اطلاعات مسير هم باشد. منظور از مسير دراويو و فولدری است که فايل در آنجا قرار دارد. اگر نام فايل بدون مسير مشخص شود محل فايل در موقعيت جاری درنظر گرفته می شود. 

مثال. فايل test.txt از مسير جاری را به منظور خواندن باز می کند. 

ifstream myfile("test.txt");

مثال. اگر فايل در فهرست دیگری باشد باید مسیر فایل کامل ذکر شود. 

ifstream myfile ("c:\\myfolder\\test.txt");

در رشته ها کاراکتر \ بیان کننده کاراکتر escape است و دارای معنی خاص است به همين دليل برای جداکردن فولدر ها به جای \ باید از \\ استفاده شود. اگر نام فايل از ورودی دريافت می شود يک علامت \ کافی است. 

*بازکردن فايل*
فرآيند ارتباط بين جريان با فايل را باز کردن فايل می نامند. هنگامی که فايلی باز می شود برای خواندن و نوشتن آماده است. متد open يک فايل متن يا باينری را باز می کند. بايد یک متغیر از نوع 
بسته به احتیاج تعریف شود.
ofstream/ifstream 
ifstream infile;
ofstream outfile;
fstream myfile; 

سپس فایل را با استفاده از open باز شود. اسم/مسير فایل و مد مورد نظر را تعيين کنید. مد مشخص می کند فايل ورودی، خروجی یا هردو است.فرم کلی متد به صورت زير است:

myfile.open(filename, mode)

filename رشته ای است که نام خارجی فايل، يعنی نامی که توسط ديسک شناخته شده است، را مشخص می کند. mode مقداری است که توسط ios تعريف می شود و مشخص می کند فايل با چه مدی (متن/باينری) و به چه منظوری (خواندن/نوشتن/ايجاد) باز شود. با استفاده از عملگر | می توان چند مقدار را با هم تلفيق کرد. پيش فرض فايل در مد متن باز می شود. 

مثال. فايل متن myfile.txt را به منظور خواندن باز می کند.
infile.open("myfile.txt",ios::in);

مثال. فايل باينری myfile.txt را به منظور خواندن باز می کند. 
infile.open("myfile.txt",ios::in|ios::binary);

مثال. فايل متن myfile.txt را به منظور نوشتن باز می کند.
outfile.open("myfile.txt",ios::out);

مثال. فايل متن myfile.txt را به منظور خواندن باز می کند. 
myfile.open("myfile.txt",ios::in|ios::out);

مثال. فايل متن myfile.txt را به منظور اضافه کردن به انتهای آن خواندن باز می کند. 
outfile.open("myfile.txt",ios::app);

مثال. فايل متن myfile.txt را پاک می کند و برای نوشتن باز می کند. 
outfile.open("myfile.txt",ios::trunc); 



تحت شرايطی ممکن است باز کردن فايل با عدم موفقيت روبرو شود نظير: استفاده از نام فايل غير مجاز، موجود نبودن فايل روی ديسک يا مسير ذکر شده، نداشتن اجازه دسترسی و .... اگر بازکردن فايل موفق نباشد تابع مقدار NULL را برمی گرداند که توسط متدهای is_open يا fail بررسی می شود و برنامه بايد پيغام خطای مناسب را با cerr نمايش دهد. 


مثال. 

if (!outfile.is_open()) {
   cerr << "Could not create file." << endl;
   exit(1);
   }

----------


## baran_mehr

*خواندن و نوشتن فايل*
بعد از بازکردن فايل برنامه می تواند داده را از فايل بخواند يا مقداری را در فايل بنويسد. برای فايل های متن عملگرهای << و >> مشابه cin و cout‌ عمل می کنند و می توانند برای خواندن و نوشتن استفاده شوند. 

تابع getline تابع خوبی است که اجازه می دهد يک خط از فايل متن (که به کاراکتر انتهای خط ختم شده است) را بخوانيد و در يک متغير رشته ای ذخيره کنيد. getline از فايل متن کاراکترها را تا رسيدن به کاراکتر انتهای خط می خواند. اما خود کاراکتر انتهای خط را در رشته ذخيره نمی کند. 

در فايل های باينری متدهای read و write برای خواندن و نوشتن بکار می روند. 

مثال. کپی کردن يک فايل در ديگری.

#include <string.h>
#include <fstream.h>
int main() {
   ifstream in("Scopy.cpp"); // Open for reading
   ofstream out("Scopy2.cpp"); // Open for writing
   string s;
   while(getline(in, s)) // Discards newline char
      out << s << "\n"; // ... must add it back
}

----------


## baran_mehr

*تشخيص انتهای فايل*
گاهی دقيقا می دانيد طول فايل چند بايت است بنابراين نيازی به تشخيص انتهای فايل نيست. ولی در اکثر مواقع از طول فايل اطلاعاتی نداريد. متد eof() زمانی که به انتهای فايل برسيد مقدار true را بر می گرداند. 

*بستن فايل*
با ايجاد پيوند بين يک جريان و فايل ديسک اتوماتيک يک بافر ايجاد و به جريان مرتبط می شود. بافر بلاکی از حافظه است که به عنوان واسطه ای بين جريان و سخت افزار ديسک عمل می کند و برای ذخيره موقت داده هائی که از فايل خوانده يا نوشته می شوند بکار می رود. چون ديسک درايو به صورت بلاکی کار می کند، داده ابتدا در بافر ذخيره می شود تا بافر پر شود سپس کل بافر به صورت يک بلاک روی ديسک ذخيره می شود. همين فرآيند زمان خواندن داده از ديسک هم اتفاق می افتد. 

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

متد close() فايل را می بندد. اين متد کل جريان های بافر شده را به فايل منتقل می کند. 

myfile.close();

اگر برنامه دچار شکست شود داده ممکن است داده موجود در بافر از دست برود. برای جلوگيری از اين کار در صورت نياز با استفاده از متد flush() می توانيد محتويات بافر را بدون بستن فايل به فايل منتقل کنيد. 

مثال. يک فايل ممکن است در برنامه به منظور خواندن و نوشتن چندبار باز و بسته شود. 

#include <fstream.h>
#include <iostream.h>
int main () {
   char buffer[256];
   fstream myfile; // open it for output then write to it
   myfile.open("test2.txt",ios::out | ios::trunc);
   if (myfile.is_open()) {
      myfile << "This outputting a line.\n";
      myfile.close();
      }
   myfile.open("test.txt",ios::in); // open it for input and read in
   myfile.getline(buffer,100);
   cout << "The file contains " << buffer << "\n";
   myfile.close();
   myfile.open("test.txt",ios::app); //open for appending and append
   myfile << " Hey this is another line \n";
   myfile.close();
   myfile.open("test.txt",ios::in); // open it for input and read in
   myfile.getline(buffer,200);
   cout << "The file contains " << buffer << "\n";
   myfile.close();
   return 0;
}


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

----------


## baran_mehr

فایل های متنی
فايل های متنی مورد استفاده بسياری دارند. يک فايل متنی (text file) جريانی از کاراکترهاست که دارای کاراکتر(های) خاصی برای نشانه گذاری انتهای هر خط است. فايل های متنی را با هر اديتورمتنی می توان توليد کرد يا محتويات آن را مشاهده کرد.


مثال. ايجاد يک فايل متنی با نام test.txt.

#include <fstream.h>
int main() {
   ofstream myfile ("test.txt");
   if (myfile.is_open()){
      myfile << "This outputting a line.\n";
      myfile << "Guess what, this is another line.\n";
      myfile.close();
      }
   return 0;
}

مثال. خواندن فايل متنی test.txt و نمايش آن روی صفحه.

#include <fstream.h>
#include <iostream.h>
int main (){
   char buffer[256];
   ifstream myfile ("test.txt");
   while (! myfile.eof() ) {
      myfile.getline (buffer,100);
      cout << buffer << endl;
   }
   return 0;
}

در فايل های متنی می توانيم اعداد را هم ذخيره کنيم. اعداد به صورت متن ذخيره می شوند. برای مثال عدد 236 به صورت کاراکتر'2' ، کاراکتر '3' و کاراکتر '6' ذخيره می شود. اين تبديل زمان اضافه می برد اما فايل حاصل قابل خواندن است.

----------


## baran_mehr

*دسترسی تصادفی فايل*
هر فايل بازی يک انديکاتور موقعيت دارد که تعيين می کند عمل خواندن/نوشتن در کدام محل فايل انجام می شود. موقعيت هميشه برمبنای تعداد بايت ها از ابتدای فايل داده می شود. اگر فايل موجودی در مد اضافه کردن باز شود انديکاتور در انتهای فايل است در بقيه مدها انديکاتور در ابتدای فايل است و برابر صفر است.

توابع خواندن/نوشتن روی فايل که در محل انديکاتور انجام می شود باعث تغيير موقعيت آن می شود. مثلا اگر فايلی باز شود و 10 بايت از آن خوانده شود انديکاتور روی موقعيت 10 فايل قرار می گيرد. عمل بعدی روی موقعيت 10 انجام می گيرد. 

C++‎ توابعی را در اختيار می گذارد (seekp و seekg) که امکان کنترل انديکاتور و دسترسی تصادفی به فايل را می دهند. يعنی می توانيد به هر نقطه ای درون فايل مراجعه کنيد بدون اينکه مجبور باشيد فايل را از ابتدا بخوانيد يا بنويسيد. 

مثال. نمايش اندازه يک فايل.

#include <fstream.h>
#include <iostream.h>
int main () {
   long start,end;
   ifstream myfile (“test.txt”, ios::in|ios::binary);
   start = myfile.tellg();
   myfile.seekg (0, ios::end);
   end = myfile.tellg();
   myfile.close();
   cout << "size of " << “test.txt”;
   cout << " is " << (end-start) << " bytes.\n";
   return 0;
}

----------


## khafan_bat

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

----------


## ندااحمدی

آیا میتوان در visual stadio 2010  این برنامه های C++‎ را اجرا گرفت ؟ دقیقا در کدوم قسمت visiaul stadio 2010 می توان یک برنامه ثبت نام دانشجویی را با استفاده از زبان C++‎ نوشت؟لطفا راهنمایی کنید

----------


## بهروز عباسی

https://barnamenevis.org/showthread.p...al-studio-2010

----------


## luke2020

سوال

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

----------

