getline()函数问题

elegant87 2008-08-06 05:31:18
getline()函数可以输入空格,于是我试用getline()输入一个人名的变量。
但是不实现!大家帮忙看看!
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<cstdlib>

using namespace std;

class student
{
public:
void Input();
friend istream& operator >>(istream& in,student& s);
friend ostream& operator <<(ostream& out,student& s);
private:
string name;
string number;
size_t score;
};

void student::Input()
{
cout<<"请输入姓名: ";
getline(cin,name);//这句话怎么不实现呢
cout<<"请输入学号: ";
cin>>number;
cout<<"请输入总成绩: ";
cin>>score;
}

istream& operator >>(istream& in,student& s)
{
in>>s.name;
in>>s.number;
in>>s.score;
return in;
}

ostream& operator <<(ostream& out,student& s)
{
out<<s.name<<"\t"<<s.number<<"\t"<<s.score<<endl;
return out;
}

void Save(vector<student>& s)
{
string filename;
cout<<"请输入文件名: ";
cin>>filename;
ofstream outfile;
outfile.open(filename.c_str(),ios::out);
if(!outfile.is_open())
{
cerr<<"Can not open the file!"<<endl;
exit(0);
}
outfile<<"姓名\t学号\t总成绩"<<endl;
for(vector<student>::iterator iter=s.begin();iter!=s.end();++iter)
outfile<<*iter<<endl;
cout<<"学生信息保存成功!"<<endl;
}

void Read(vector<student>& s)
{
string filename;
cout<<"请输入文件名: ";
cin>>filename;
ifstream infile;
infile.open(filename.c_str(),ios::in);
if(!infile.is_open())
{
cerr<<"Can not open the file!"<<endl;
exit(0);
}
cout<<"读取的学生信息为: "<<endl;
string word;
getline(infile,word);
cout<<word<<endl;
student stu;
while(!infile.eof())
{
infile>>stu;
cout<<stu;
}
}

int main()
{
vector<student> s;
student stu;
size_t count;
string num;
cout<<"请输入录入学生的个数: ";
cin>>count;
for(size_t ix=0;ix!=count;++ix)
{
cout<<"\n请录入第"<<ix+1<<"个学生的信息.\n"<<endl;
stu.Input();
s.push_back(stu);
}
cout<<"保存学生信息"<<endl;
Save(s);
cout<<"读取学生信息"<<endl;
Read(s);
system("pause");
return 0;
}

...全文
2489 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
crazyboylcy 2010-02-24
  • 打赏
  • 举报
回复
引用 8 楼 lapizza 的回复:
哈哈,你太逗了。

你的main()
int main()
{
    vector <student> s;
    student stu;
    size_t count;
    string num;
    cout < <"请输入录入学生的个数: ";
cin>>count;
    for(size_t ix=0;ix!=count;++ix)
    {
        cout < <"\n请录入第" < <ix+1 < <"个学生的信息.\n" < <endl;
stu.Input();        s.push_back(stu);
    }
……
getline()前用了cin
然后你cin>>count时应该输入了一个回车,而cin 流里回车前的值给count了,但回车仍在流里。
stu.Input()中 getline()就读了一个回车,把回车前的东东(什么都没有,空字符串)作学生姓名了。
最简单的,用两个getline()就行了。
用cin.ignore()也行。

基于以上的分析,在getline的前一句加上endl清空缓冲区不就可以了么!
crazyboylcy 2010-02-24
  • 打赏
  • 举报
回复
引用 7 楼 row_li 的回复:
引用 5 楼 elegant87 的回复:
cin.ignore(1,'\n');
这是什么意思呢?解释一下吧!

忽略'\n'

基于以上的分析,在getline的前一句加上endl清空缓冲区不就可以了么!
LaPizza 2008-09-13
  • 打赏
  • 举报
回复
哈哈,你太逗了。

你的main()
int main()
{
vector<student> s;
student stu;
size_t count;
string num;
cout<<"请输入录入学生的个数: ";
cin>>count;
for(size_t ix=0;ix!=count;++ix)
{
cout<<"\n请录入第"<<ix+1<<"个学生的信息.\n"<<endl;
stu.Input(); s.push_back(stu);
}
……
getline()前用了cin
然后你cin>>count时应该输入了一个回车,而cin 流里回车前的值给count了,但回车仍在流里。
stu.Input()中 getline()就读了一个回车,把回车前的东东(什么都没有,空字符串)作学生姓名了。
最简单的,用两个getline()就行了。
用cin.ignore()也行。
Row_Li 2008-08-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 elegant87 的回复:]
cin.ignore(1,'\n');
这是什么意思呢?解释一下吧!
[/Quote]

忽略'\n'
study_live 2008-08-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 elegant87 的帖子:]
getline(cin,name);//这句话怎么不实现呢
[/Quote]

测试正确,是不是你别的地方错了?
elegant87 2008-08-06
  • 打赏
  • 举报
回复
cin.ignore(1,'\n');
这是什么意思呢?解释一下吧!
jay的Fans 2008-08-06
  • 打赏
  • 举报
回复
// a.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<cstdlib>

using namespace std;

class student
{
public:
void Input();
friend istream& operator >>(istream& in,student& s);
friend ostream& operator <<(ostream& out,student& s);
private:
string name;
string number;
size_t score;
};

void student::Input()
{
cout<<"ÇëÊäÈëÐÕÃû: ";
//getline(cin,name);//Õâ¾ä»°Ôõô²»ÊµÏÖÄØ
cin >> name;//用cin直接读入就行了,getline是以ctrl + Z结束的
cout<<"ÇëÊäÈëѧºÅ: ";
cin >> number;
cout<<"ÇëÊäÈë×ܳɼ¨: ";
cin>>score;
}

istream& operator >>(istream& in,student& s)
{
in>>s.name;
in>>s.number;
in>>s.score;
return in;
}

ostream& operator <<(ostream& out,student& s)
{
out<<s.name<<"\t"<<s.number<<"\t"<<s.score<<endl;
return out;
}

void Save(vector<student>& s)
{
string filename;
cout<<"ÇëÊäÈëÎļþÃû: ";
cin>>filename;
ofstream outfile;
outfile.open(filename.c_str(),ios::out);
if(!outfile.is_open())
{
cerr<<"Can not open the file!"<<endl;
exit(0);
}
outfile<<"ÐÕÃû\tѧºÅ\t×ܳɼ¨"<<endl;
for(vector<student>::iterator iter=s.begin();iter!=s.end();++iter)
outfile<<*iter<<endl;
cout<<"ѧÉúÐÅÏ¢±£´æ³É¹¦!"<<endl;
}

void Read(vector<student>& s)
{
string filename;
cout<<"ÇëÊäÈëÎļþÃû: ";
cin>>filename;
ifstream infile;
infile.open(filename.c_str(),ios::in);
if(!infile.is_open())
{
cerr<<"Can not open the file!"<<endl;
exit(0);
}
cout<<"¶ÁÈ¡µÄѧÉúÐÅϢΪ: "<<endl;
string word;
getline(infile,word);
cout<<word<<endl;
student stu;
//while(!infile.eof())//用这种的话,会多读入数据
while(infile>>stu)
{
//infile>>stu;
cout<<stu;
}
}

int main()
{
vector<student> s;
student stu;
size_t count;
string num;
cout<<"ÇëÊäÈë¼ÈëѧÉúµÄ¸öÊý: ";
cin>>count;
for(size_t ix=0;ix!=count;++ix)
{
cout<<"\nÇë¼ÈëµÚ"<<ix+1<<"¸öѧÉúµÄÐÅÏ¢.\n"<<endl;
stu.Input();
s.push_back(stu);
}
cout<<"±£´æѧÉúÐÅÏ¢"<<endl;
Save(s);
cout<<"¶ÁȡѧÉúÐÅÏ¢"<<endl;
Read(s);
system("pause");
return 0;
}

lzr4304061988012 2008-08-06
  • 打赏
  • 举报
回复
cout<<"请输入姓名: ";
cin.ignore(1,'\n');
getline(cin,name);
//这句话怎么不实现呢
cout<<"请输入学号: ";
cin>>number;

这样
wangdeqie 2008-08-06
  • 打赏
  • 举报
回复

//这么写
void student::Input()
{
cout<<"请输入姓名: ";
getline(cin,name);
cin.ignore(1,'\n');
cout<<"请输入学号: ";
cin>>number;
cout<<"请输入总成绩: ";
cin>>score;
}

bitxinhai 2008-08-06
  • 打赏
  • 举报
回复
使用cin.getline()
试试行吗???

64,672

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧