ورود

View Full Version : مبتدی: cin.get()



رضا ++
جمعه 28 آذر 1393, 10:58 صبح
سلام
من قبلا توی محیط بورلند کار میکردم و خوب ورودیم با cin بود و برای نگه داشتن برنامه از getch() استفاده میکردم
ولی جدیدا تو محیط ویژوال کار میکنم و نتونستم درست و حسابی cin.get() رو درک بکنم.یه جا برای ورودی استفاده میشه یه جا برای نگه داشتن برنامه به کار میره.بعضی جاها هم اصلا برنامه رو نگه نمیداره و باید از cin.ignore() استفاده بکنم.
بعضی جاها هم در آخر برنامه چند بار از این تابع استفاده میشه.
اگهممکنه کامل بگین که این تابع چکار میکنه.
خیلی ممنونم

رضا ++
شنبه 29 آذر 1393, 23:04 عصر
عاقا کسی نیست تابع cin.get() رو توضیح بده؟

rahnema1
یک شنبه 30 آذر 1393, 13:11 عصر
سلام
تابع cin.get چندین نحوه استفاده داره
اگه به این صورت استفاده بشه
cin.get()
یعنی می خواهیم یک کاراکتر را دریافت کنیم
اما این تابع لازم داره که حتما enter زده بشه تا به کار خودش خاتمه بده
اما getch یک کاراکتر از کاراکترهای موجود در بافر کیبورد را می خونه و بر می گردونه
بنابراین اگر بافر کنسول پر باشه ( یعنی حداقل یک کاراکتر داخلش باشه) تابع getch اصلا منتظر نمی مونه تا ما صفحه کلید را فشار بدیم و کاراکتر موجود در بافر را خوانده و بر می گردونه
اگر بافر خالی باشه منتظر می مونه که یک کلید فشار داده بشه به محض فشار داده شدن کلید تابع مقدار را بر می گردونه و enter هم لازم نداره

در چه صورت بافر کنسول می تونه پر باشه؟
درصورتی که ما مثلا در مرحله ای از اجرا برنامه روی دکمه های صفحه کلید فشار بدیم و مثلا برنامه در همون زمان در حالت انجام یک عملیات دیگه باشه یا در حالت sleep باشه
بعدا که getch صدا زده می شه با بافر پر مواجه میشه
که getch هم لازمه همراه با kbhit برای بررسی پر بودن بافر مورد استفاده قرار بگیره
اما cin یه ساختار پیچیده تر داره.خود cin در واقع یک stream هست. داخل cin یه چیزی وجود داره به نام streambuf که در واقع بافر cin محسوب میشه که این بافر با بافر کیبورد مربوط به getch متفاوته
یعنی مثلا وقتی برنامه در حال sleep یا یک عملیات محاسباتی باشه و من در همون لحظه روی صفحه کلید چند دکمه را فشار بدم، چیزی در بافر cin قرار نمی گیره. تنها وقتی عملیات ورودی بخواهیم انجام بدیم مثل get یا getline یا <<cin و مثل اینها انجام بدیم بافر cin به کار گرفته می شه.
گاهی وقتها هنگام ورودی تعداد کاراکترهایی که وارد می کنیم بیشتر از اون مقداری هست که برای گرفتن و تبدیل ورودی لازمه در این حالت cin کاراکترهای اضافی را در بافر خودش نگه می داره که این باعث می شه عملیات های دیگه با اشکال مواجه بشه مثل مثال زیر که می خواهیم یک int دریافت کنیم همیشه یک کاراکتر newline در بافر باقی می مونه

int a;
cin >> a;

یا در این مثال:

char ch[20]={};
cin.getline(ch, 5);

اینجا حداکثر تا 5 کاراکتر دریافت می کنه و اگه بیشتر وارد کردیم در نهایت ch یک رشته 5 حرفی خواهد بود و مابقی کلمات در بافر cin باقی می مونند
برای رفع این مشکل می شه از دستور زیر استفاده کرد

int numchar = cin.rdbuf()->in_avail();
if(numchar > 0 )
cin.ignore(numchar);

اما گاهی اوقات ورودی اشتباه وارد می کنیم مثلا وقتی که در مثال اولی لازمه عدد وارد کنیم به جای اون کاراکتر وارد کنیم در اینجا یه سری flag داخل cin هست که تغییر می کنه که نشون دهنده اینه که cin دچار ارور شده که ما لازمه این flag ها را پاک کنیم که از روش زیر استفاده می کنیم
cin.clear();
خلاصه کارکردن با کنسول این دردسر ها را هم داره که باید این موارد را در نظر گرفت