PDA

View Full Version : مبتدی: مشکل با cin.get()



vasilopita
جمعه 20 اسفند 1389, 20:27 عصر
سلام. دو تا سوال مبتدی دارم در حد تیم ملی . لطفا اول این کد رو چک کنید :


#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include<windows.h>
using namespace std;
struct student
{
char name[15];
int ID,barom;
float averege;
}stu1;
void get_info();
void search();
void edit(int);
void main()
{
char chr;
while(1)
{
cout<<"*********************** MENU *************************\n\n\a";
cout<<"1:new Information \n2:Search & Edit Informatin \n3:exit\n\n";
cin>>chr;
switch(chr)
{
case('1'):
get_info();
break;
case('2'):
search();
break;
case('3'):
exit(0);
break;
}
}

}
void get_info()
{
int counter=0;
cout<<"Please Enetr The Below Information...\a\n";
ofstream out("student.dat");
if(!out)
{
cout<<"Can Not Open File .... \a\a\a\a\n";
exit(0);
}
while(1)
{
cout<<"\n**************** Student:"<<counter+1<<" *****************\n";
cout<<"\nName: ";
cin.get(stu1.name,16);
if(!stu1.name[0]) //in bakhsh baraye check kardan charachtere enter e
break;
cout<<"\nID: ";
cin>>stu1.ID;
cout<<"\nAverege: ";
cin>>stu1.averege;
cout<<"\nBarom: ";
cin>>stu1.barom;
cin.get();
out.write((char *)&stu1,sizeof(struct student));
counter++;
}
out.close();
cout<<"\nALL Students ARE: "<<counter<<"\n\n";
}
void search()
{
bool flag=0;
//cout<<"\npress a key to continue ...\n";
//_getch();
int sid=0;
cout<<"\n\nPlease Enter an ID to Search....\a\n";
//cin.get();
cin>>sid;
ifstream in("student.dat");
while(in.read((char *)&stu1,sizeof(struct student)))
{
if(stu1.ID==sid)
{
flag=1;
cout<<"\n\nStudent Found ...\n\n";
edit(sid);
break;
}
}
if(flag==0)
{
cout<<"\n\aStudent NOT Found...\n";
}
}
void edit(int sid)
{
ifstream in("student.dat");
ofstream out("temp.dat");
while(in.read((char*)&stu1,sizeof(class student)))
{
if(stu1.ID==sid)
{
cout<<"\nPlease Enter the below informations to edit ...\n\n";
cout<<"Name: \n";
cin>>stu1.name;
cout<<"ID: \n";
cin>>stu1.ID;
cout<<"Averege: \n";
cin>>stu1.averege;
cout<<"barom: \n";
cin>>stu1.barom;
}
out.write((char*)&stu1,sizeof(class student));
}
out.close();
remove("student.dat");
rename("temp.dat","student.dat");
}

نمی دونم مشکلش با تابع cin.get() چیه ؟ و اینکه چرا از این روش برای تشخیص کاراکتر اینتر استفاده شده.؟ و سوال بعد اینکه غیر از این راه ، راه دیگه ای وجود داره که بشه باش فهمید کارکتر وارد شده اینتر بوده؟
به حرفه ای بودن خود ما را ببخشید ... :لبخندساده:

vasilopita
یک شنبه 22 اسفند 1389, 01:56 صبح
باز سلام. فکر نمی کردم کسی به این سوال پاسخ نده. واقعا برای اساتید گرامی این سوال خیلی خیلی مبتدیه. چرا کسی جواب نداده ؟ واقعا عجیبه ...! اگر کدها رو یه لحظه کپی کنید بعد اجراش کنید و بعد گزینه 1 رو بزنید مشکل خودش رو نشون می ده. خواهشا جواب بدید.
با تشکر

sahar.13
چهارشنبه 25 اسفند 1389, 11:33 صبح
سلام.من هم مثل شما یک مبتدی هستم و امیدوارم پاسخم برای شما مفید باشد.(اما در کل کد خوبی نوشته اید) کد که شما نوته اید را با چند تغیر درست عمل میکند(شما این تغییرات را اعمال کنید و اگر در مورد دلیل و نحوه ی آنها سوالی بود بنده پاسخگو هستم)

در خط 53این دستور را جایگزین کنید(با این دستور باید آخر نامی که وتارد میکنید حتما نقطه قرار دهید)

cin.get(stu1.name,16,'.');

در خط 54 به جای این دستور بنویسید:


if(stu1.name[0]=='*')
break;

بین دو خط 56 و 57 هم اضافه کنید:

cin.get();

فقط در مورد کد شما این روشهایی که عرض کردم موجب می شوند که برنامه شما داخل حلقه بینهایت نیفتد.و به کار معمولی اش ادامه دهد فقط یک مشکل با منو دارید که فکر میکنم خودتان راه حل آن را بدانید.

(دوست عزیز یک توصیه دارم و آن هم این است که هرچقدر هم که مبتدی باشید می توانید برنامه های خودتان را به بهترین شکل اصلاح کنید.راه حل آن یک dbugeساده است و کمی حوصله!!!اگر با کامپایلری مانند ویژوآل استودیو کار می کنید این امکان به راحتی فراهم شده است.چون برنامه نویسی یعنی همین،همین که بنویسی و خطا برطرف کنی و خطای معنایی را بفهمی.هرکس که برنامه نویس خوبی شده فقط تمرین و حوصله زیادی داشته.)

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

vasilopita
پنج شنبه 26 اسفند 1389, 17:54 عصر
سلام دوست عزیز. واقعا خوشحال شدم از اینکه پاسخ دادین. ممنون. ولی خدمتتون عرض کنم که بنده از ویژال استفاده می کنم و تریس هم کردم و اشکالات رو هم پیدا کردم و حتی بلدم چجور حلش کنم. مثلا شما اینجا گفتید که با کاراکتر نقطه کار رو انجام بدم من خودم این رو بلدم ولی می خوام با کارکتر اینتر کار رو انجام بدم و مشکلم فقط با این کارکتر هستش. ولی در کل خیلی ازتون ممنونم :)
موفق باشید

پ.ن: هم اکنون منتظر یاری سبزتان هستیم .

ashkan_d13
یک شنبه 29 اسفند 1389, 16:35 عصر
سلام
اول اینکه enter رو میشه با getch هم تشخیص داد، تو این کد با همون cin.get بهتره،
بعدش اینکه اگه بعد از استفاده از <<cin بخواین از cin.get استفاده کنین، یه enter تو ورودی هست که <<cin اونو نمیگیره و cin.get میگیرش و در نتیجه رشته ی خالی بوجود میاد، پس قبل از cin.get باید اون enter رو در بکنین که معمولا با cin.ignore این کارو انجام میدن.
بعدشم اینکه این cin.get نمی دونم چه جوریه که باید بعد از استفاده ازش از cin.clear استفاده کرد، پس کلاً بهتره از cin.getline استفاده کنید.


#include <iostream>
#include <fstream>
//#include <stdlib.h>
#include <conio.h>
//#include<windows.h>
using namespace std;
struct student {
char name[15];
int ID,barom;
float averege;
}stu1;
void get_info();
void search();
void edit(int);
void main() {
char chr;
while(1)
{
system("cls");
cout<<"*********************** MENU *************************\n\n";
cout<<"1:new Information \n2:Search & Edit Informatin \n3:exit\n\n";
cin>>chr;
cin.ignore();
switch(chr)
{
case('1'):
get_info();
break;
case('2'):
search();
break;
case('3'):
exit(0);
break;
}
}
}
void get_info() {
int counter=0;
cout<<"Please Enetr The Below Information...\a\n";
ofstream out("student.dat");
if(!out)
{
cout<<"Can Not Open File .... \a\a\a\a\n";
exit(0);
}
while(1)
{
cout<<"\n**************** Student:"<<counter+1<<" *****************\n";
cout<<"\nName: ";
cin.getline(stu1.name,15);
if(!stu1.name[0])
//in bakhsh baraye check kardan charachtere enter e
break;
cout<<"\nID: ";
cin>>stu1.ID;
cout<<"\nAverege: ";
cin>>stu1.averege;
cout<<"\nBarom: ";
cin>>stu1.barom;
//cin.get();
cin.ignore();
out.write((char *)&stu1,sizeof(struct student));
counter++;
}
out.close();
cout<<"\nALL Students ARE: "<<counter<<"\n\n";
}
void search() {
bool flag=0;
//cout<<"\npress a key to continue ...\n";
//_getch();
int sid=0;
cout<<"\n\nPlease Enter an ID to Search....\a\n";
//cin.get();
cin>>sid;
ifstream in("student.dat");
while(in.read((char *)&stu1,sizeof(struct student)))
{
if(stu1.ID==sid)
{
flag=1;
cout<<"\n\nStudent Found ...\n\n";
edit(sid);
break;
}
}
if(flag==0)
{
cout<<"\n\aStudent NOT Found...\n";
}
}
void edit(int sid) {
ifstream in("student.dat");
ofstream out("temp.dat");
while(in.read((char*)&stu1,sizeof(class student)))
{
if(stu1.ID==sid)
{
cout<<"\nPlease Enter the below informations to edit ...\n\n";
cout<<"Name: \n";
cin>>stu1.name;
cout<<"ID: \n";
cin>>stu1.ID;
cout<<"Averege: \n";
cin>>stu1.averege;
cout<<"barom: \n";
cin>>stu1.barom;
}
out.write((char*)&stu1,sizeof(class student));
}
out.close();
remove("student.dat");
rename("temp.dat","student.dat");
}