440 likes | 674 Views
برنامه نویسی پیشرفته جریان ها (streams). رئوس مطالب. کلاس های جریانی خطاهای جریانی ورودی خروجی دیسک با جریان ها مکان نمای فایل خطایابی در ورودی/خروجی فایل ورودی/خروجی فایل در توابع عضو سربارگذاری عملگرهای درج و استخراج استفاده از حافظه به عنوان شی جریان. کلاس های جریانی.
E N D
برنامه نویسی پیشرفتهجریان ها(streams)
رئوس مطالب • کلاس های جریانی • خطاهای جریانی • ورودی خروجی دیسک با جریان ها • مکان نمای فایل • خطایابی در ورودی/خروجی فایل • ورودی/خروجی فایل در توابع عضو • سربارگذاری عملگرهای درج و استخراج • استفاده از حافظه به عنوان شی جریان
کلاس های جریانی • جریان: دنباله ای از داده ها بین دو نقطه • ورودی/خروجی و برنامه • فایل و برنامه • فایل ها نوعی جریان اند • در C، کار با فایلها با توابع خاصی انجام می شد در C++ با استفاده از اشیاء خاصی انجام میشود. • دانستن سلسله مراتب کلاس های جریان مهم است چون توابع به ارث برده میشوند.
کلاس IOS • توابع عضو و داده های عضو این کلاس توسط تمامی کلاس های جریانی به ارث برده میشود • کلاس ios جد تمامی کلاسهای جریانی است و حاوی ویژگیهای اصلی که در کار با جریانهای C++ به آنها نیاز داریم. سه تا از مهمترین ویژگیها: • علامتهای فورمت بندی • بیتهای وضعیت خطا • وضع عملیات روی فایلهاست.
علامتهای فورمت بندی ios • این علامتها مانند کلیدهای دو وضعیتی بصورت خاموش و روشن عمل می کنند. • چند روش مختلف برای مقداردهی به این علامات وجود دارد. • از آنجائیکه این علامات عضو کلاس ios هستند برای دسترسی به آنها از :: استفاده می شود. • مقدار دهی به علامات فورمت دهی • توسط توابع عضو کلاس ios یعنی setf و unsetf فعال و غیر فعال میشوند. • با استفاده از دستکاری کننده ها به آنها مقدار داد.
دستکاری کننده ها • دستکاری کنند ها : دستورات فورمت بندی که مستقیماً به جریان اضافه میشوند. • عناصری از جریان هستند که قالب جریان در بعد از خود را عوض میکنند. • نمونه متداول آنها endl • تمامی علامات فورمت بندی را میتوان از طریق دستکاری کننده ها هم فعال یا غیر فعال کرد.
دستکاری کنند ها (ادامه) • دستکاری کننده ها به دو صورت متفاوت ظاهر میشوند: • دستکاری کننده های بدون آرگومان • دستکاری کننده هایی که یک آرگومان میگیرند • cout << hex << var; Note that manipulators affect only the data that follows them in the stream, not the data that precedes them.
دستکاری کنند های تک آرگومانی • بایستی سرفایل iomanipبه برنامه اضافه شود.
توابع عضو کلاس ios • از این توابع عضو میتوان برای تنظیم علامتهای فورمت دهنده و کارهای دیگر استفاده کرد.
istream • کلاس جریانی که عملیات مخصوص ورودی یا خواندن داده ها را انجام میدهد • توابع عضوی دارد هم درورودی از صفحه کلید و برخی در ورودی از فایل هم کاربرد دارد.
OSTREAM • ostream: کلاس جریانی که با عملیات خروجی سروکار دارد. • توابع عضوی دارد هم در خروجی روی صفحه نمایش و برخی در خروجی روی فایل هم کاربرد دارد.
خطاها در جریان ها • در هنگام ورودی/ خروجی از جریان ممکن است خطاهایی رخ دهد. • منتظر int هستیم کاربر حرف وارد کند. • بیت های کنترلی خاصی وجود دارد که وضعیت خطا را نشان میدهد • وضعیت این بیت ها را میتوان با استفاده از توابع عضو بررسی کرد یا تغییر داد. • توابع عضو مهم : eof() نشاندهنده پایان جریان، good() نشاندهنده عدم خطا در جریان و clear() برای پاک کردن بیت خطا هستند.
بررسی خطا در جریان ورودی • مثال: ورودی از کاربر با استفاده از cin دریافت میشود.
ورودی/خروجی از فایل • با استفاده از اشیاء سه کلاس ifstream، ofstream و fstream انجام میشود. به ترتیب برای خواندن از فایل، نوشتن در فایل و انجام هر دو کار. • انواع فایل • متنی / باینری • مراحل انجام کار با فایل • تعریف یک شی از نوع کلاس جریانی مناسب و مشخص کردن فایل مرتبط روی حافطه جانبی • خواندن/نوشتن از طریق جریان • بستن جریان • نقش مخرب
ورودی و خروجی I/O برای فایل های متنی • در سازنده کافی است نام و مسیر فایل ذکر شود. • برای خواندن از کلاس ifstream برای نوشتن از ofstream استفاده میشود. • برای خواندن و نوشتن میتوان از عملگرهای << و >> استفاده کرد. • مخرب، فایل را می بندد
رشته هایی با فاصله خالی میانی-(فایلهای متنی) • روش قبل برای رشته های char* که حاوی فاصله های خالی میانی هستند کار نمی کند. • برای کار با این رشته ها لازم است کاراکتر محدود کننده خاصی را پس از هر رشته بنویسید و با استفاده از getline() بجای عملگر ورودی آنها را بخوانید.
فایلهای متنی • در هر خط فایل ورودی تعدادی عدد صحیح وجود دارد. برنامه مجموع اعداد هر سطر را نشان میدهد. 27 39
فایلهای باینری • در سازنده علاوه بر نام و مسیر فایل، باینری بودن فایل در پارامتر دوم اعلام شود • برای خواندن از کلاس ifstream برای نوشتن از ofstream استفاده میشود. • برای خواندن و نوشتن میتوان از توابع write و read استفاده کرد. • Data آدرس عنصری که قرار است خوانده/نوشته شود • SIZE اندازه عنصر به بایت
فایل های باینری- مثال • نوشتن آرایه در فایل و خواندن آن
نوشتن و خواندن یک شی با فایلهای باینری-مثال • نوشتن شی در فایل و خواندن آن. • لزوم سازگاری موقع خواندن و نوشتن
فایلهای باینری-مثال • نکته: اشیاء با عضو داده ای اشاره گر را نمیتوان مستقیماً در فایل نوشت. • چرا؟
fstream • اشیاء fstream هم میتوانند بعنوان ورودی و هم بعنوان خروجی استفاده شوند. • با تابع عضو open میتوان ارتباط فایل را باز نموده و وضعیت آن را تعریف نمود • فایل میتواند چند و ضعیت داشته باشد که با هم OR منطقی میشوند.
مکان نمای فایل • مکان نمای فایل : محل فعلی خواندن و نوشتن از فایل را مشخص میکند. • دو مکان نما داریم : برای خواندن و برای نوشتن • مقدار مکان نما تعداد بایت از ابتدای فایل را مشخص میکند. • توابع عضوی برای اطلاع از مقدار مکان نما و تغییر آن وجود دارد • tellp, getp, tellg, getg
خطا در فایل • روش برخورد و تشخیص خطاها در istream و ostream در اینجا هم کاربرد دارد (کلاس پدر)
خواندن/نوشتن یک شی در توابع عضو • برای خواندن و نوشتن در فایل باید از this استفاده کرد
خواندن/نوشتن همه اشیاء یک کلاس در توابع عضو • میخواهیم بتوانیم کلیه اشیاء کلاس را با یک فراخوانی load و save کنیم • حداقل، نیاز به اعضای static داریم • عضو های داده ای static: تعداد اشیاء ساخته شده و آرایه ای از اشاره گر ها به آنها • توابع داده ای static: تابعی برای save و تابعی برای load
ذخیره چند نوع شی در یک فایل • موقع نوشتن، قبل از هر شیء، کد شیء را هم ذخیره میکنیم تا موقع خواندن نوع شی ذخیره شده معلوم باشد
ذخیره چند نوع شی در یک فایل • حتی میتوان اشیاء یک سلسله مراتب توارثی را هم با استفاده از چند ریختی ذخیره و بازیابی نمود. • موقع خواندن محتویات فایل با خواندن قسمت کد نوع شی و استفاده از عملگر typeid ، نوع شی بعد از آن را متوجه میشویم. کلاس پایه
ذخیره اشیاء پایه و مشتق در یک فایل- ادامه • کلاس های مشتق
ذخیره اشیاء پایه و مشتق در یک فایل-ادامه • تعریف توابع static در کلاس پایه
ذخیره اشیاء پایه و مشتق در یک فایل-ادامه • توابع static خواندن و نوشتن در کلاس پایه
ذخیره اشیاء پایه و مشتق در یک فایل-ادامه • main برنامه
سربارگذاری عملگرهای >>و >> • عملگرها باید بصورت تابع friend سربارگذاری شوند چون عملگر در سمت چپ آنها قرار میگیرد. • خروجی عملگر ها باید istream& یا ostream& باشد. • قالب کلی برای << پارامترها و خروجی ها، باید نوع ارجاع باشند. قالب کلی برای >>
سربارگذاری عملگرهای >>و >> • برای کار با cin و cout
سربارگذاری عملگرهای >>و >> • سربارگذاری برای کار با ifstream و ofstream • سربارگذاری istream برای ifstream هم کار میکند • سربارگذاری ostream برای ofstream هم کار میکند • بخاطر چندریختی
استفاده از حافظه به عنوان شی جریان • از یک آرایه کاراکتری میتوان بعنوان جریان استفاده کرد • معمولاً از کلاس strstream برای قالب بندی خروجی و ذخیره در یک رشته استفاده میشود. • strstream فرزند iostream است. • قالب کلی