Presentation is loading. Please wait.

Presentation is loading. Please wait.

فایل ها.

Similar presentations


Presentation on theme: "فایل ها."— Presentation transcript:

1 فایل ها

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

3 C++ فایل ها را به صورت مجموعه ای از بایت ها در نظر می گیرد

4 انواع فايل از نظر نوع اطلاعات :
داده ها در فایل به دو صورت نوشته می شوند : 1- متن 2- باینری در هر دو روش، دنباله ای از بایتها داخل حافظه دائمی نوشته میشوند. در روش متنی، هنگام نوشتن اطلاعات در فایل، داده ها بصورت دنباله ای از کالاکترها نوشته میشوند و هنگام خواندن اطلاعات نیز باید عکس این عمل اتفاق بیافتد. ولی در روش باینری، اطلاعات همانگونه که در RAM هستند به حافظه دائمی منتقل میشوند.

5 مثال در نظر بگیرید که عدد صحیح دو بایتی n=2345 را میخواهیم درون فایل ذخیره کنیم. حالت اول) اگر فایل را بصورت متنی ایجاد و از توابع خواندن و نوشتن متنی استفاده کنیم، هنگام نوشتن عدد n، چهار بایت درون فایل نوشته میشود. که به ترتیب کد اسکی عدد 2، کد اسکی عدد 3 ، کد اسکی عدد 4 و کد اسکی عدد 5 است. یعنی مجموعاً فایل ایجاد شده حاوی 4 بایت خواهد بود. (2345)(‘2’,’3’,’4’,’5’)(50,51,52,53) (0x32,0x33,0x34,0x35) حالت دوم) اگر فایل را بصورت باینتری ایجاد و از توابع خواندن و نوشتن باینتری استفاده کنیم. عدد n بصوت 2 بایت یعنی به شکل زیر ذخیره میشود. (2345) (0X0929)

6 - تبدیل فرمت در فایل متنی
نکته : این تبدیلات مستلزم صرف وقت است بنابراین دسترسی به اطلاعات موجود در فایل متنی کندتر از فایل های باینری است . از آنجا که یک فایل متنی را با مرورگرهای مختلف میتوان خواند لذا ایجاد و کار با فایلهای متنی از اهمیت بالایی برخوردارند.

7 لذا نحوه تشخیص انتهای فایل در فایل باینری با فایل متنی متفاوت است .
تعیین انتهای فایل : در هر دو روش ذخیره فایل ، طول فایل توسط سیستم نگهداری می شود و انتهای فایل با توجه به این طول مشخص می شود . در حالت متنی کاراکتر EOF كه معادل 0xff و يا -1 است، مشخص کننده انتهای فایل است. لذا نحوه تشخیص انتهای فایل در فایل باینری با فایل متنی متفاوت است .

8 کلاس های فایل : برای ورودی-خروجی فایل باید فایل <fstream.h> را به برنامه C++ ضمیمه کرد: #include <fstream.h> ios ostream istream ofstream ifstream fstream fstreambase

9 نام فایل از ترکیبی از حروفa تا z و خط ربط_ تشكيل ميشود
باز کردن و بستن فایل : هر فایل قبل از اینکه مورد استفاده قرار گیرد باید باز شود. هنگام باز کردن فایل ، موارد زیر باید مشخص شوند : 1. نام فایل داده 2. نوع فایل از نظر ذخیره اطلاعات متنی یا باینری 3. نوع فایل از نظر ورودی – خروجی نام فایل از ترکیبی از حروفa تا z و خط ربط_ تشكيل ميشود

10 برای باز کردن فایل ابتدا باید مجرایی را از نوع این کلاس ها تعریف کرد و سپس فایلی را به این مجرا ها نسبت داد . ifstream f1; //input stream ofstream f2; //output stream fstream f3; //input output stream دستور سوم , f2دستور دوم مجرای خروجی , f1دستور اول مجرای ورودی را ایجاد می کند f3مجرای ورودی-خروجی

11 حالت فایل دو چیز را مشخص می کند : 1. عملی که با فایل باید انجام شود
حالت فایل : حالت فایل دو چیز را مشخص می کند : 1. عملی که با فایل باید انجام شود 2. روش ذخیره اطلاعات از نظر متنی یا باینری بودن سه عمل را می توان با فایل انجام داد : 1. عمل ورودی (در این حالت فایل طوری باز میشود که فقط می توان اطلاعات را از آن خواند این فایل را فایل ورودی گویند) 2. عمل خروجی(در این حالت فایل طوری باز میشود که فقط می توان اطلاعات را در آن نوشت اين فایل را فایل خروجی گویند) 3. عمل ورودی- خروجی (در این حالت فایل طوری باز میشود که همزمان می توان اطلاعات را از آن خواند و نوشت این فایل را فایل ورودی-خروجی گویند )

12 حالت فایل :

13 مثال : ofstream f1; ifstream f2; fstream f3; f1.open (“data1.dat” , ios::out); f2.open (“data2.dat” , ios::in); f3.open (“data3.dat” , ios::in | ios::out);

14 نکته : قبل از کار با فایل باید از باز بودن فایل اطمینان حاصل کرد برای این کار می توان از دستورات زیر استفاده کرد . if(!myfile) { cout<<“can not open file”; … } نام مجرای ماست) myfile( یا می توان از تابع is_open() استفاده کرد در صورت باز بودن فایل ارزش درستی در غیر این صورت ارزش نادرستی را برمی گرداند . if(!myfile.is_open()) }

15 نکته : حتماً بعد از استفاده از فایل باید فایل را بست . هنگام بسته شدن برنامه تمام فایل های باز آن بسته می شوند . تعداد فایل هایی که در هر برنامه می توان باز نگه داشت محدود است . در برخی از کاربرد ها اگر متوجه فایل های باز نباشیم ممکن است از حد متعارف تجاوز کنیم. براي بستن يك فايل از تابع close استفاده ميكنيم: my file.close();

16 از اعمالی هنگام خواندن داده ها باید انجام دهیم ، تست انتهای فایل است .
تست انتهای فایل : از اعمالی هنگام خواندن داده ها باید انجام دهیم ، تست انتهای فایل است . به بیان دیگر یعنی باید هنگام خواندن اطلاعات از فایل به طریقی تشخیص دهیم که به انتهای فایل رسیدیم یا خیر . برای تست انتهای فایل از تابع eof() استفاده می کنیم bool ios::eof(); اگر فایلی که این تابع بر روی آن عمل می کند به انتها رسیده باشد ، این تابع ارزش درستی و گرنه ارزش نادرستی را برمی گرداند .

17 برنامه اي بنويسيد كه فايل aa.txt را در فايل bb.txt كپي كند

18 void main() { ifstream InFile; ofstream OutFile; InFile. open("c:\\aa
void main() { ifstream InFile; ofstream OutFile; InFile.open("c:\\aa.txt",ios::in); if (InFile.is_open()==false) cout<<"Can not open input file"; return; } OutFile.open("c:\\bb.txt",ios::out); if(OutFile.is_open()==false) cout<<"Can not open output file"; InFile.close(); //Close the input file while(!InFile.eof()) char ch; InFile.get(ch); OutFile.put(ch); InFile.close(); OutFile.close();

19 شیوه های ذخیره و بازیابی اطلاعات :
1. داده ها کاراکتر به کاراکتر در فایل نوشته می شوند سپس کاراکتر به کاراکتر از فایل خوانده می شوند. 2. داده ها به صورت رشته ای از کاراکتر ها در فایل نوشته و سپس به همان شکل از فایل خوانده می شوند. 3. داده ها در حین نوشتن بر روی فایل ، با فرمت خاصی نوشته و سپس به همان فرمت خوانده می شوند. 4. داده ها به شکل ساختمان (رکورد) بر روی فایل نوشته شده سپس به صورت ساختمان از فایل خوانده می شوند.

20 توابع ورودی: توابع ورودی و خروجی : توابع خروجی:
نوشتن در فایل با استفاده از اپراتور << put(ch)یک بایت در فایل می نویسد. write(buff , size) آدرس يك خانه و تعداد بايتها را گرفته و آنرا در فایل می نویسد. توابع ورودی: خواندن از فایل با استفاده از اپراتور >> get(ch) یک بایت از فایل خوانده و درون ch قرار می هد. تابع get كه حالتهاي مختلف دارد و يكي از حالتهاي آن get(str , max) ميباشد كه با توجه به تعداد كاراكتر وارد شده از فايل خوانده و در آرايه str قرار می دهد. تابع getline(str , max , DELIM) یک خط از فایل ورودی را خوانده تا به كاركتر DELIM ويا تعداد بايت خوانده شده به اندازه max برسد. read(buff , size) آدرس يك خانه و تعداد بايتها را گرفته و تعداد بايد خواسته شده را از فايل ميخواند و در بافر قرار می دهد.

21 از بين توابع معرفي شده در اسلايد قبل دو تابع read و write براي فايلهاي باينري استفاده ميشوند

22 مثال: void main() { char ch = 'x' ; int j = 77 ; double d=7.66 ; char str1[] ="ali" ; char str2[] ="programmer" ; ofstream outfile("c:\\fdata.txt"); outfile<< j <<endl<<ch <<endl << d <<endl << str1 <<endl << str2 ; cout << "file written" ; }

23 مثال ذخیره اطلاعات دانشجو در فایل:
در این مثال یک کلاس دانشجو داریم که مشخصات یک دانشجو را توسط تابع write2file() درفایل ذخیره میکند. در صورتی که این تابع بدون آرگومان فراخوانی شود یک فایل هم نام با شماره دانشجویی ایجادگردد . void student::write2file(char *fname); void student:: write2file();

24 مثال ذخیره اطلاعات دانشجو در فایل:
class student { private: int stcode; char stname[100]; char address[200]; int age; public : student (int code , char * name, char addr , int age); void write2file(char * fname); void write2file(); };

25 void student::write2file() { char fname [200]; sprintf (fname , "d:\\% d.txt", stcode ); write2file(fname); } void student ::write2file(char *fname) ofstream outf (fname); outf<< stcode << endl; outf<< stname << endl; outf.close(); اين تابع اطلاعات دانشجو را در فايل متني مينويسد

26 نحوه استفاده از تابع main() { student st ( , " Reza ", "Iran-Tehran-Shahed Un.", 18); st.write2file(" d:\\tmp.txt "); st.write2file(); }

27 مثال خواندن و نوشتن اطلاعات آرایه در فایل باینری:
void WriteArray2File(int numbers[100]) { ofsream outfile(“c:\\test.dat” , ios :: binary); outfile.write( ( char *) numbers , 100 * sizeof (int)); outfile.close(); } void ReadArrayFromFile(int numbers[100]) ifstream inf(“c:\\test.dat” , ios :: binary); inf.read ( ( char *) numbers , 100 * sizeof (int)); inf.close();

28 مثال خواندن و نوشتن اطلاعات يك شي در فایل باینری:
void MyClass::Write2File(char *fname) { ofsream outfile(fname , ios :: binary); outfile.write( ( char *) this , sizeof (MyClass)); outfile.close(); } void MyClass::ReadFromFile(char *fname) ifstream inf(fname, ios :: binary); inf.read (( char *) this , sizeof (MyClass)); inf.close();

29 مثال : برنامه اي بنويسيد كه يك فايل متني را روي صفحه نمايش دهد
void main () { char buff [100]; ifstream infile(“test.txt”) ; while (!infile.eof()) infile.getline (buff , 100); cout<<buff <<endl; } infile.close();

30 تمرين 6: كلاس ليست پيوندي ر ا تغيير داده و توابع مورد نياز براي خواندن و نوشتن ليست پيوندي در فايل را تعريف نماييد

31 تغییر موقعیت اشاره گر فایل :
سیستم برای هر فایل دو اشاره گر در نظر می گیرد . یکی اشاره گر خواندن و دیگری اشاره گر نوشتن . اشاره گر خواندن مشخص می کند که دستور خواندن بعدی از فایل ازکجا باید بخواند و اشاره گر نوشتن در فایل مشخص می کند که دستور نوشتن بعدی در فایل ، در کجای فایل باید بنویسد . با هر دستور خواندن و نوشتن این دو اشاره گر به طور خودکار تغییر می کنند. استفاده می شود. seekp , seekg برای تغییر اشاره گر های فایل از دو تابع istream &seekg(num , origin); ostream &seekp(num , origin); مشخص می کند که اشاره گر چند بایت باید جابجا شود و numدر هر دو مشخص می کند که مبدا حرکت کجا باشد .Origin

32 جدول مبدا حرکت اشاره گر فایل :

33 تغیین موقعیت فعلی اشاره گر فایل :
با استفاده از توابع tellp() , tellg() می توان تشخیص دادکه اشاره گر خواندن و نوشتن فایل در کجای فایل قرار دارند . pos_type tellg(); pos_type tellp(); همانطور که قبلاً بیان شد، ميتوان با استفاده از توابع seekg و seekp اشاره گر خواندن و نوشتن در فايل را جابجا نمود. istream &seekg (pos_type pos); ostream &seekp (pos_type pos);

34 تابع نوشتن در فايل دانشجو را به گونه اي تغيير دهيد كه هنگام نوشتن اطلاعات با توجه به شماره دانشجويي به موقعيت مترادف با شماره دانشجويي رفته و در آن مكان اطلاعات دانشجو نوشته شود همچنين تابع خواندن از فايل دانشجو را به گونه اي بنويسيد كه شماره دانشجويي را گرفته و پس از انتقال اشاره گر خواندن از فايل به موقعيت مترادف، اطلاعات دانشجو را بخواند.

35 void student ::write2file(char
void student ::write2file(char *fname) { ofstream outf (fname , ios :: binary); outf.seekp(stcode * sizeof(student) , ios :: beg); outf.write( ( char *) this , sizeof (student)); outf.close(); } void MyClass::ReadFromFile(int code, char *fname) ifstream inf(fname, ios :: binary); inf.seekg(code * sizeof (student) , ios :: beg); inf.read (( char *) this , sizeof (student)); inf.close();

36 istream& operator >>(istream & is , student &st);
بخش دوم تمرين 6 با استفاده از توابع دوست و سربارگذاري عملگرها دو اپراتور << و >> را به گونه اي بنويسيد كه مشخصات دانشجو را درون فايل متني بنويسد و بخواند. براي نوشتن اين اپراتورها به شكل زير عمل كنيد: istream& operator >>(istream & is , student &st); ostream& operator <<(ostream & os , student &st); اين اپراتورها براي كلاسهاي istream و ostream تعريف شده اند بررسي نماييد درصورتي كه از اشياء ifstream و ofstream استفاده شود چه اتفاقي مي‌افتد.


Download ppt "فایل ها."

Similar presentations


Ads by Google