PDA

View Full Version : سوال: عدم اجرای تابع ()getline



emadfa
جمعه 06 شهریور 1388, 10:21 صبح
سلام
امروز زمانی که قصد نوشتن یک برنامه را داشتم مشکلی پیش آمد که به نوعی جالب بود ( و البته تعجب بر انگیز) ! و آن این که زمانی که در یک برنامه برای ورودی یک رشته از تابع ()getline استفاده کردم در هنگام اجرای برنامه این تابع اجرا نمی شد. البته دلیل این مساله را هم با مثالی مشابه یافتم! هرگاه قبل از اجرای تابع ()getline ( نه دقیقا خط قبل بلکه حتی خطوط قبل از آن ) حداقل یک تابع cin برای ورودی استفاده شود دیگر تابع ()getline اجرا نمی شود. ( به نوعی که انگار کامپایلر در هنگام کامپایل آن را ignore کرده است! )
از دوستان اگر کسی در مورد علت این مساله و چاره ( چون گاهی نیاز است که از هر دو دستور ورودی در برنامه استفاده کنم! ) آن اطلاعی دارد لطفا کمک کنید.


string partNumber, partDescript;
int quantity, price;

cout << "Enter the product name: ";
cin >> partNumber;

cout << "Enter the description of the product: ";
getline(cin ,partDescript);



cout << "Enter the product quantity: ";
cin >> quantity;

به عنوان مثال در نمونه کد بالا تابع getline اجرا نشده و دو دستور cout بلافاصله بعد از هم اجرا می شوند.

tdkhakpur
جمعه 06 شهریور 1388, 12:06 عصر
سلام
کدتان را بصورت زیر اصلاح کنید.


string partNumber, partDescript;
int quantity, price;

cout << "Enter the product name: ";
cin >> partNumber;

cout << "Enter the description of the product: ";
cin>>ws; // این کد باعث میشود که خط زیر برای دستور زیر تنظیم شده باشد.
cin.getline(partDescript, 32);
cout << "Enter the product quantity: ";
cin >> quantity;

اگر کلاس فوق را من طراحی کرده بودن این کار را انجام نمیدادم.

emadfa
جمعه 06 شهریور 1388, 12:32 عصر
با تشکر از شما دوست عزیز اما متاسفانه با قرار دادن این کد ( در تابعی که قرار است قرار است به اعضای یک کلاس مقدار اولیه دهد ) پیغام خطا دریافت می کنم.


اگر کلاس فوق را من طراحی کرده بودن این کار را انجام نمیدادم.
چرا؟؟

clover
جمعه 06 شهریور 1388, 12:37 عصر
کد را به شکل زیر هم می توان تغییر داد که نزدیکتر به کد شماست :


string partNumber, partDescript;
int quantity, price;

cout << "Enter the product name: ";
cin >> partNumber;

cout << "Enter the description of the product: ";
cin >>ws;
getline(cin ,partDescript);

cout << "Enter the product quantity: ";
cin >> quantity;

البته یاد آوری می کنم که تابع ()getline پارامتر سومی هم داره که کاراکتر پایان خط را مشخص میکنه و فکر می کنم به صورت پیش فرض '\n' باشه که با تغییر به ' ' مشکل حل می شود و نیازی به هیچ تغییری نیست :


getline(cin ,partDescript, ' ');

مثال :

string s1, s2;

cout << "Enter a sentence (use <space> or <Enter> as the delimiter): ";
cin >> s1;
cout << "You entered: " << s1 << endl;

cout << "Enter a sentence (use <space> as the delimiter): ";
getline(cin, s2, ' ');
cout << "You entered: " << s2 << endl;

tdkhakpur
جمعه 06 شهریور 1388, 13:22 عصر
با تشکر از شما دوست عزیز اما متاسفانه با قرار دادن این کد ( در تابعی که قرار است قرار است به اعضای یک کلاس مقدار اولیه دهد ) پیغام خطا دریافت می کنم.

خطاش کجاست کدها که استاندارد هستند؟

hoax3r
جمعه 06 شهریور 1388, 16:50 عصر
قبل اینکه از getline استفاده کنی این دستور cin.sync() رو وارد کن


cin.sync();

cout << "Enter the description of the product: ";
getline(cin ,partDescript);

emadfa
جمعه 06 شهریور 1388, 18:19 عصر
قبل اینکه از getline استفاده کنی این دستور cin.sync() رو وارد کن


cin.sync();

cout << "Enter the description of the product: ";
getline(cin ,partDescript);


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