تماس درباره   صفحه اصلی
  زبان ++C > دستورات ورودی و خروجی  
 
 

دستورات ورودی و خروجی


اشيای cout و cin در C++ برای ارسال خروجی به صفحه نمايش و دريافت مقادير از صفحه کليد استفاده می شوند. اين توابع در فايل هدری به نام iostream قرار دارد که بايد ضميمه شود. کليه نيازهای ورودی و خروجی با اين اشياء برطرف می شود.

cout
قالب بندی خروجی
cerr و clog
cin


با وجوديکه ++C سازگاری خود را با C حفظ کرده است و می توان از توابع printf() و scanf() در کتابخانه <stdio.h> استفاده کرد، اشيای ورودی/خروجی ديگری را فراهم آورده است که بسيار قوی تر و مطمئن تر است. کلاس iostream، موجود در کتابخانه ای با همين نام، اشياء و متدهای موردنياز را در اختيار می گذارد. اين کتابخانه از ostream (برای خروجی) و istream (برای ورودی) مشتق می شود.

ورودی/خروجی به صورت جريانی (stream) از کاراکترها يا بايت ها از برنامه به صفحه نمايش، چاپگر يا فايل به عنوان خروجی و يا از صفحه کليد به عنوان ورودی تصور می شود. جريان ها راه انعطاف پذيری برای کار با ورودی و خروجی است که درمورد فايل های I/O هم صدق می کنند.

cout

شئ cout متعلق به کتابخانه iostream برای نمايش داده روی صفحه نمايش است. cout به کامپايلر فرمان می دهد که جريان بايت ها را به دستگاه خروجي پيش فرض که معمولا مانيتور است هدايت کند.

cout مخفف console output است.

بعد از cout علامت << قرار می گيرد که جهت متن ارسالی را تعيين می کند. در C سمبل <<‌ برای شيفت بيت های عدد صحيح به سمت چپ بکار می رفت. در ++C اين سمبل برای انواع داده مانند int، float و رشته پشتيبانی می شود، چند مقدار با << بهم ريسمان می شود تا خروجی ارسال شود.


مثال.

cout << "Some Text" << intvalue << floatdouble;

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

cout.<<("some text").cout.<<( intvalue ).cout.<<(floatdouble).cout;


برای اينکه پيغام در خط جداگانه ای نمايش داده شود \n را اضافه کنيد. \n به کامپايلر می گويد از يک خط جديد شروع کند. \n يک نوع Escape Code است که برای فرمت بندی خروجی استفاده می شوند.


مثال. نمايش متن "Hello World!" روی مانيتور.

#include <iostream>

int main()
{
   //print hello word on the screen
   cout << "Hello World!\n";
   return 0;
}


بعضی از کدهای escape در جدول زير آمده است.

شرح Escape Code
New line n\
Carriage retuen r\
Backspace b\
Horizontal tab t\
Single quotation mark '\
Form feed f\
Bell (alert) a\
Vertical tab v\
Backslash \\
Double quotation mark "\
Literal question mark ?\

نکته. بيشتر از يک escape code می تواند در متن خروجی باشد.

نکته. اگر در يک رشته بخواهيم علامت گيومه (") قرار دهيم به معني پايان رشته تعبير می شود بنابراين بايد از يک Escape code استفاده شود.


مثال. در برنامه زير عبارت " escape keys " درون گيومه و عبارت ' useful ' درون تک گيومه نمايش داده می شوند.

#include <iostream>

int main()
{
   // the following code demo’s various escape keys
   cout << "As you can see these \" escape keys \" \n";
   cout << "are quite \'useful \' \a \\ in your code \\ \a \n";
   return 0;
}


برای تعيين شروع خط جديد بجای \n دستور endl می تواند در انتهای خروجی ذکر شود. endl باعث خالی شدن بافر C++ می شود.


مثال.

#include <iostream>

int main()
{
   cout << "You have previously used the \\n key to get a new line \n";
   cout << "However you can also use the endl command" << endl;
   return 0;
}


قالب بندی خروجی

وقتی عددی نمايش داده می شود صفات زير مورد نظر است:

• مقدار فضای مورد نياز برای عدد روی صفحه
• چپ چين يا راست چين بودن ( اعداد تمايل به راست چين دارند)
• تعداد ارقام اعشار
• علامت برای اعداد منفی
• نمای علمی برای اعداد بزرگ

اين صفات توسط شئ cout و توابع کتابخانهiomanip قابل تنظ‍يم هستند.

در C با استفاده از فرامين فرمت مانند %d در تابع printf() قادر به فرمت بندی خروجی هستيم. در C++ فرمت بندی خروجی به طريق متفاوتی از طريق اضافه کردن دستکاری کننده ها (manipulators) به جريان خروجی انجام می گيرد.

manipulator تابعی است که می تواند خصوصيات جريان خروجی را تغيير بدهد. manipulator می توانند به جريان های ورودی يا خروجی اضافه شوند.


مثال.endl خط را تمام می کند و خط جديد را شروع می کند.

cout << endl;
cout << "Some Text" << endl << endl; // Two blank lines


تابع به صورت زير هم می تواند استفاده شود.

endl(cout);

کلاس ostream که برای خروجی استفاده می شود خود از کلاس ios مشتق شده است که از ios_base گرفته شده است. کلاس اخير توابع عمومی را برای دستکاری کننده ها تعريف می کند.

کلاس iostream از ostream و istream ارث بری دارد بنابراين مثال های cout می توانند iostream را استفاده کنند.

انواع دستکاری کننده ها

اکثر دستکاری کننده ها در اعلان شده اند اما endl، ends و flush از می آيند. بعضی يک پارامتر می گيرند و از می آيند.

دستکاری کننده های کتابخانه <ostream>:

• endl – خط را خاتمه داده و flush را صدا می زند.
• ends – کاراکتر '\0' (NULL) را در جريان درج می کند.
• flush – بافر را بلافاصله به خروجی می فرستد.

دستکاری کننده های کتابخانه <ios> که بيشتر آنها در <ios_base>‌ اعلان شده اند:

• boolalpha – درج يا استخراج اشيای بولين مانند.
• noboolalpha – درج يا استخراج اشيای بولين مانند مقادير درست و غلط.

• fixed – درج مقادير مميزشناور در فرمت ثابت.
• scientific – درج مقادير مميزشناور در فرمت علمی.

• internal – وسط چين
• left – چپ چين
• right – راست چين

• dec – درج يا استخراج مقادير صحيح در فرمت دهدهی.
• hex – درج يا استخراج مقادير صحيح در فرمت هگز.
• oct – درج يا استخراج مقادير صحيح در فرمت اکتال.

• showbase – مبنای مقدار را پيشوند آن می کند.
• noshowbase – مبنای مقدار را پيشوند نمی کند.
• showpoint – هميشه نقطه اعشار را هنگام درج مقدار اعشار نمايش می دهد.
• noshowpoint – نقطه اعشار را اگر لازم نيست نمايش نمی دهد.
• showpos – اگر عدد مثبت است علامت بعلاوه (+) را درج می کند.
• noshowpos – اگر عدد مثبت است علامت بعلاوه (+) را درج نمی کند.
• skipws – از روی فاصله ها می پرد.
• noskipws – از روی فاصله ها نمی پرد.
• uppercase – حروف کوچک را با حروف بزرگ جايگزين می کند. تنها روی خروجی توليد شده مانند اعداد هگز تاثير دارد.
• nouppercase – حروف کوچک را با حروف بزرگ جايگزين نمی کند.

• unitbuf – بافر را بعد از درج خالی می کند.
• nounitbuf – با را بعد از هر درج خالی نمی کند.


برنامه قالب بندی خروجی


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

تنظيم فلگ مستقيما توسط ()cout.setf قابل انجام است و توسط ()cout.unsetf خنثی می شود. اين توابع متعلق به کتابخانه هستند.

تابع setf به دو صورت می تواند استفاده شود:

setf( flagvalues);
setf( flagvalues, maskvalues);
unsetf( flagvalues);


مثال. برای قالب بندی خروجی به صورت scientific، uppercase و boolalpha پارامترها برای تنظيم بيت ها به صورت زير ارسال می شود:

cout.setf( ios_base::scientific | ios_base::uppercase | ios_base::boolalpha) ;
cout << hex << endl;
cout << 1234 << endl;
cout << dec << endl;
cout << 123400003744.98765 << endl;
bool value=true;
cout << value << endl;
cout.unsetf( ios_base::boolalpha) ;
cout << value << endl;

خروجی به صورت زير توليد می شود:

4D2
1.234000E+011
true
1


هر کاراکتری را می توان توسط casting به خروجی ارسال کرد. برای مثال Char(27) کاراکتر escape را ارسال می کند.


برنامه قالب بندی خروجی توسط دستکاری کننده ها و تنظ‍يم فلگ ها.

برنامه نمايش اعداد در مبناهای 10، 8 و 16 با استفاده از دستکاری کننده ها


اگر دو ثابت رشته در جوار هم باشند و بين آنها علامتی نباشد کامپايلر دو رشته را بهم می چسباند.


مثال.

#include <iostream>

int main()
{
   cout << "This is far too long to put on a "
   "single line but it can be broken up with "
   "no ill effects\nas long as there is no "
   "punctuation separating adjacent character "
   "arrays.\n";
   return 0;
}


cerr و clog

cerr و clog مشابه cout دو شئ تعريف شده در ostream هستند.


مثال. برنامه زير نشان می دهد چگونه cerr می تواند به جای cout بکار برود.

#include <iostream>

int main()
{
   cerr.width(15) ;
   cerr.right;
   cerr << "Error" << endl;
   return 0;
}


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

cout و clog هردو خروجی را بافر می کنند يعنی ابتدا کل خروجی در بافر ذخيره می شود سپس همگی يکباره با هم به خروجی فرستاده می شود. cerr خروجی را بافر نمی کند و آنرا بلافاصله به دستگاه خروجی می فرستد.

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


cin

کلاس iostream امکان خواندن ورودی را هم فراهم می کنند. شئ مورد استفاده برای ورودی استاندارد cin است که ورودی را معمولا از کنسول می گيرد اما می تواند از منابع ديگر هم دريافت کند.

عملگری که همراه با cin استفاده می شود >> است که برای دريافت ورودی از نوع آرگومانش صبر می کند. مثلا اگر آرگومان صحيح باشد برای يک عدد صحيح از صفحه کليد منتظر می ماند.


مثال. برنامه زير يک عدد صحيح را دريافت کرده معادل اکتال و هگز آنرا نمايش می دهد.

#include <iostream>

int main()
{
   int number;
   cout << "Enter a decimal number: ";
   cin >> number;
   cout << "value in octal = 0" << oct << number << endl;
   cout << "value in hex = 0x" << hex << number << endl;
   return 0;
}


برنامه دريافت دو عدد و محاسبه حاصل جمع وضرب آنها


تابع cin متوجه نوع متغير می شود و داده ورودی را به نوع متناسب تبديل می کند.


مثال. برنامه زير تابع cin را برای خواندن سه عدد که با space از هم جدا می شوند استفاده می کند. بعد از وارد کردن مقادير بايد کليد enter را فشار داد.

#include <iostream>

int main()
{
   int a = 0;
   float b = 0.0;
   int c = 0;
   cout << "Please Enter an int, a float and int separated by spaces" <<endl;
   cin >> a >> b >> c;
   cout << "You entered " << a << " " << b << " " << c << endl;
   return 0;
}

اگر 3 7.2 3 وارد شود خروجی به صورت "You entered 3 7.2 3" خواهد بود.

اگر 3.76 5 8 وارد شود خروجی به صورت " You entered 3 0.76 5" می شود. چون نقطه مميز جز عدد صحيح نيست به عنوان شروع عدد اعشاری درنظرگرفته می شود و بقيه خط ورودی از بين می رود.


اگر ورودی به طور موفق تبديل نشود شئ cin يک بيت شکست را تنظيم می کند که قسمتی از ios است و توسط تابع fail() هم در cin و هم در cout به صورت زير قابل خواندن است.

if (cin.fail() ) //do something

برای صفحه نمايش روشن است که ()cout.fail بندرت ممکن است استفاده شود اما درفايل های I/O می تواند بکار برود.


برنامه گرفتن ورودی به صورت صحيح


تابع ()good هم برای cin و cout وجود دارد.

cin بهترين دستور برای همه شرايط نيست اما ساده ترين را ه است. تابع get يک کاراکتر تکی صرفنظر از نوع را دريافت می کند.

تابع getline برای دريافت تعداد معينی کاراکتر است. اين تابع وقتی می خواهيد داده ای را درون آرايه ذخيره کنيد سودمند است. cin اجازه می دهد کاربر داده های بيشتری را در آرايه ذخيره کند که overloading نام دارد. توسط تابع getline تعداد بايت هايی که می خواهيد کاربر وارد کند را تعيين می کنيد. هرکاراکتر که کاربر تايپ می کند يک بايت فضا می برد. مثلا اگر برای تابع 4بايت تعريف کنيد و کاربر کلمه Computer را وارد کند تنها Comp دريافت می شود.


مثال.

#include <iostream>

int main()
{
   char text[10];
   cout << "Please enter a word\n";
   cin.getline(text,10);
   cout << text << endl;
   return 0;
}

کليه ورودی هائی که با cin خوانده می شوند نياز دارند کليد Enter يا Return زده شود. در C++ استاندارد راهی برای خواندن مستقيم کليدها از صفحه کليد وجود ندارد. اما می توان از کتابخانه های ديگر استفاده کرد.


 


 


صفحه اصلی| PDF| درباره| تماس