نمایش نتایج 1 تا 3 از 3

نام تاپیک: cin.get()

  1. #1

    cin.get()

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

  2. #2

    نقل قول: cin.get()

    عاقا کسی نیست تابع cin.get() رو توضیح بده؟

  3. #3

    نقل قول: cin.get()

    سلام
    تابع 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();

    خلاصه کارکردن با کنسول این دردسر ها را هم داره که باید این موارد را در نظر گرفت
    آخرین ویرایش به وسیله rahnema1 : چهارشنبه 25 شهریور 1394 در 09:10 صبح دلیل: اضافه کردن و اصلاح بعضی موارد

تاپیک های مشابه

  1. سوال: یه تابع مثل cin.get
    نوشته شده توسط mahdi5121 در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 8
    آخرین پست: پنج شنبه 05 فروردین 1389, 13:45 عصر
  2. سوال: مشکل در استفاده از دستور cin.get
    نوشته شده توسط Altech در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 1
    آخرین پست: چهارشنبه 29 مهر 1388, 16:53 عصر
  3. سوال: سورس تابع cin.get
    نوشته شده توسط payamsalami در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 0
    آخرین پست: شنبه 10 اسفند 1387, 21:54 عصر
  4. سوال: cin.get()
    نوشته شده توسط helma20 در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 6
    آخرین پست: دوشنبه 02 دی 1387, 00:16 صبح
  5. cin.get
    نوشته شده توسط hercules_3d در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 10
    آخرین پست: جمعه 15 اردیبهشت 1385, 14:09 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •