C++多字节操作cin.get
本帖最后由 tafeita 于 2023-6-30 00:56 编辑学习C++ Primer第5版674页的is.get(sink,size,delim),试着编了如下一小段代码:
#include <iostream>
using namespace std;
int main()
{
char arr;
int a;
for (int i = 0; i < 2; ++i) {
a = cin.get(arr, 10).get();
cout << a << endl;
for (size_t i = 0; i < 10; ++i)
cout << arr;
cout << "z" << endl;
}
return 0;
}
运行时输入abcdefghij然后敲回车键,结果如图片
第一轮循环的106是j的ascii码,第二轮循环的-1不知道对应的是什么输入?敲的回车换行ascii码应该是10,为何显示-1{:1_904:}(在VS2015中编译)
不知哪位大佬肯指点指点{:1_893:}{:1_893:}{:1_893:} cin.get(arr, 10)读取了10个字符,但是实际上只传送9个给arr。再次调用get获取到j的数值,所以输出106。
由于只传送了9个字符给arr,所以你输出的是abcdefghi z
第二次循环的时候,cin.get(arr, 10)只读取到了\n,cin.get(arr, 10)实际上是转发到了cin.get(arr, 10, '\n')函数,所以遇到\n就停了,并且没有实际内容传输给arr,只是把arr的首字符置0。
接下来因为cin.get(arr, 10)已经读取到了文件末尾,所以get读取到的是eof,也就是-1。
再次输出arr的时候,因为你是按照数组遍历的方式,所以首字符0啥也没输出,后面的bcdefghi没有被修改,所以正常输出了。 用法:cin.get(arrayname,size)把字符输入到arrayname中,长度不超过size,原因是c字符串结尾需要有一个\0
所以,你输入的size=10,最大可以接收9个字符,cin.get()的返回值是缓冲区的最后一个非\n字符,
所以第一行显示106,j的asci码
第二行显示adcdefghi
第二次循环时,继续读取缓冲内空,即读到了EOF,也就是-1
第一行显示-1
由于第二次循环,没有重新读入数据到err,err中仍为上次的数据
所以,第二行显示abcdefghi
谢谢@yes2大佬的分析解读,您的指点提醒我在循环内增加了显示输入流条件状态的两行代码,修改如下:
#include <iostream>
using namespace std;
int main()
{
char arr;
int a;
for (int i = 0; i < 2; ++i) {
cin.get(arr, 10);// 将 a = cin.get(arr, 10).get()拆开,分别查看get成员函数执行后cin的状态
cout << "第" << i + 1 << "次循环cin.get(arr, 10)之后:" << endl;
cout << "cin.eof--->" << boolalpha << cin.eof() << endl;
cout << "cin.fail--->" << cin.fail() << endl;
a = cin.get();
cout << "第" << i + 1 << "次循环接着cin.get()之后:" << endl;
cout << "cin.eof--->" << cin.eof() << endl;
cout << "cin.fail--->" << cin.fail() << noboolalpha << endl;
cout << a << endl;
for (size_t i = 0; i < 10; ++i)
cout << arr;
cout << "z" << endl;
}
return 0;
}
运行结果说明第二次循环时,cin.get(arr, 10, '\n')读完\n之后,因为缓冲区里再无内容,输入流的failbit被置位(奇怪的是eofbit并没有被置位),由于failbit被置位才返回了-1。是不是badbit, failbit和eofbit任一个被置位,cin.get()就会返回-1?
再次感谢大佬的热心解答{:1_919:}{:1_919:}{:1_919:} 谢谢@nanaqilin的解答{:1_919:}{:1_919:}{:1_919:},好像不是因为eof,而是无数据可读fail造成的,不知道我的理解对不对{:1_904:}
页:
[1]