使用getline函数如何多次读取同一行这是程序中的一段代码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 很明显后面没读到

来源:学生作业学帮网 编辑:学帮网 时间:2024/05/04 02:54:40

使用getline函数如何多次读取同一行
这是程序中的一段代码
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:此程序是从书上看到的,为什么书上这样的格式就可以 而我的不行 注:代码无错

首先要明白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!