使用getline函数如何多次读取同一行

这是程序中的一段代码input.getline(buf,4);a=atoi(buf);input.getline(buf,5);ex=atoi(buf);input.ge... 这是程序中的一段代码
input.getline(buf,4);
a=atoi(buf);
input.getline(buf,5);
ex=atoi(buf);
input.getline(buf,7);
num=atoi(buf);
这是数据444 111 9999
输出后只有444 很明显后面没读到 后来我知道getline每次只读取一行并且自动加上\n这样接下去读取的就是下一行 怎样让它接下去读取
我又发现不仅仅是同一行的问题
如果将数据改为:
444*(后面随意多出一个东西包括空格)
111
9999
就不可以
也就是说如果遇到所读取的数据大于它的最大值(input.getline(buf,4);)4.就无法读入下面的数据 怎么解决

后来又查到如果输入的数据大于i会发出溢出,程序就会错乱,是不是这样的?
PS:此程序是从书上看到的,为什么书上这样的格式就可以 而我的不行 注:代码无错
展开
 我来答
龍__鳳
2014-02-02 · TA获得超过2346个赞
知道小有建树答主
回答量:948
采纳率:0%
帮助的人:1459万
展开全部

首先要明白getline函数的形式,使用。

getline (char* s, streamsize n, char delim );

第一个参数是存储的位置,第二个是读取的最大字符数,第三个参数是终结符,默认为'\n',你可以自行设置

你的程序里,默认使用'\n'为终结符,才导致每次读取一行的问题,根据你的输入格式,你可以用空格作为终结符,这样可以只输入一行即可。具体看金色潜鸟的例子。

如果,你仍然使用'\n'作为终结符,而且只输入一行,你理解的是444后面没有读到,是不对的。其实是在读取444后,输入流input错误了。针对第一个getline(buf,4);默认终结符'\n',输入是444 111 9999,在读第四个字符时,判断是否是'\n',若是则结束,若不是则输入流发生错误,这是你输入过多导致。解决方式是:在之后加上input.clear();,清空输入流状态。实例如下:

正确读取。对于getline不能简单理解为每次读取一行!


再解释为什么分3次输入时,在444后加空格为什么读取出错。

我只输入了444a回车111回车,程序就判定完成输入。你的第一个getline最多读取3个字符,判断第4个字符,确定是否正常结束读取。第四个字符不是'\n',输入流发生错误,后续的输入流就失效了,需要使用clear()才能继续使用。第二个getline时,输入的第5个字符是'\n',所以正常结束,读取字符串为a。输出的第二个就是0了。可以把每次读取的结果输出来验证一下:

第一个输出是444,第二个输出是a!

追问
这个程序是书上的,那为啥书上这样就可以呢,是书错了吗
是英文翻译过来的,感觉应该可信度比较高吧
追答
事实胜于雄辩呀,也许是书上的例子不完善
金色潜鸟
2014-02-02 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:6181万
展开全部
读函数 有自己的功能和适用场合,并非万能。
应选则符合输入数据格式,数据大小的 读函数 -- 用斧头砍柴,用菜刀切菜。
若一定要 用菜刀砍柴,用 斧头切菜 就成了难题。

getline 有第3个参数:
getline (char* s, streamsize n, char delim );
如果你要求用空格作分隔符:
char buff[10];
std::cin.getline (buff,4,' ');
cout << "1: "<< buff << endl;
std::cin.getline (buff,5,' ');
cout << "2: " << buff << endl;
std::cin.getline (buff,7);
cout << "3: " << buff << endl;
输入数据: 444 111 9999
------------------
其实,你要用空白作分隔符,直接用 cin << buff1 << buff2 <<buff3 很方便
用斧头砍柴,用菜刀切菜 就可以了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
宠宠欲动闯天涯
2015-11-21 · 知道合伙人旅游行家
宠宠欲动闯天涯
知道合伙人旅游行家
采纳数:10997 获赞数:52344
学生

向TA提问 私信TA
展开全部
getline函数的作用是从输入流中读取一行字符,其用法与带3个参数的get函数类似。即
cin.getline(字符数组(或字符指针), 字符个数n, 终止标志字符)
用getline函数读入一行字符。
#include <iostream>
using namespace std;
int main( )
{
char ch[20];
cout<<"enter a sentence:"<<endl;
cin>>ch;
cout<<"The string read with cin is:"<<ch<<endl;
cin.getline(ch,20,'/'); //读个字符或遇'/'结束
cout<<"The second part is:"<<ch<<endl;
cin.getline(ch,20); //读个字符或遇'/n'结束
cout<<"The third part is:"<<ch<<endl;
return 0;

c++:
C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。最新正式标准C++14于2014年8月18日公布。[1] 其编程领域众广,常用于系统开发,引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性。}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式