PDA

View Full Version : سوال: رفتار cin با ctrl+z



...StacK...
سه شنبه 15 بهمن 1387, 01:04 صبح
سلام دوستان به کد زیر نگاه کنید:



// stack.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;//this is a program for test
int main(){
char word[80];
int x=1;
do
{
cin >>word;
if(*word) cout<<"\t\""<<word<<"\"\n";
cout<<"program is to crashing\n"<<endl;
cout<<word<<" ";

}while(x);
return 0;
}


من وقتی میخوام برنامه رو با استفاده از ctrl+z ببندم , برنامه شروع به طی کردن حلقه

بی نهایت میکنه و دیگه عملگر cin از ما درخواست ورودی نمیکنه و این حلقه با چاپ

پیام درون حلقه تا بی نهایت ادامه پیدا میکنه و تنها راه بستن برنامه به غیر از بستن پنجره

کنسول , استفاده از کلید break هست.!!!
================================================== ==

البته من اینجوری تصور میکنم ولی مطمئن نیستم:

وقتی من به جای ورودی از ctrl +z استفاده میکنم , کاراکتر NUL در ابتدای رشته قرار میگیره

پس در این صورت وقتی cin میبینه که کارکتر NUL در ابتدای رشته وجود داره ...تصور

میکنه که رشته ما به پایان رسیده , پس در این صورت طلب ورودی نمیکنه.

این تصور من درسته؟؟؟؟
================================================== ==

حالا وقتی کلید break رو فشار میدم چه اتفاقی میفته که برنامه بسته میشه؟؟؟

================================================== ==

emad_67
پنج شنبه 17 بهمن 1387, 12:04 عصر
علتش اینه که ctrl+z معادل EOF یعنی end of file برای cin هست، شما وقتی eof وارد کنی تابع eof() از شی cin مقدار 1 بر میگردونه که در واقع به cin میگه انتهای جریان هست و cin دیگه رشته ای رو نمیخونه. در کد شما هم بعد از وارد کردن ctrl+z دیگه خط :


cin >>word;

خونده نمیشه و چون شرط حلقع رو هم 1 گذاشتی تو یک حلقه بینهایت می افته.
این رو تست کن:


int main()
{
char word[80];
char s;
cin>>s;
cin>>word;
cout<<cin.eof();
return 0;
}

میبینی که بعد از زدن ctrl+z دیگه رشته word خونده نمیشه و به انتهای برنامه میرسیم.
اما برای حل مشکل خودت کافیه شرط while رو به این شکل قرار بدی:


while(!cin.eof());

موفق باشید