1.istrean::gcount

调用形式为cin.gcount()

gcount的返回值是获取的字符数,但是这个获取要被统计,必须是通过stream类函数来做的

你直接通过外部函数getline来读cin 那么cin的成员变量就不会计算了

如果用cin.getline就可以了

比如

#include<iostream>
#include<string>
using namespace std;
int main()
{
char str[100];
cin.getline(str, 100);
cout<<cin.gcount()<<endl;
}

这样你输入1234的时候 就会打出来一个5了 除了1234还读了一个换行符

2.isream::peek

调用形式为cin.peek()

返回输入序列中的下一个字符(返回值是一个char类型的字符,其返回值是指向指向的当前字符,如果要访问的字符是文件结束符,则函数值是EOF(-1)),而不进行提取(只是做观测使用,即指针仍停留在当前位置,并不后移。其功能是从输入流中读取一个字符,但该字符并未从输入流中删除):该字符保留为要从流中提取的下一个字符。

若把输入流比作一个队列,那么peek()函数相当于队列的成员函数front(),而cin.get()则相当于队列的成员函数pop()。

在内部,该函数通过首先构造一个sentry对象(noskipws设置为true)来访问输入序列。然后(如果好的话),它通过调用其成员函数sgetc从其关联的流缓冲区对象中读取一个字符,最后在返回之前销毁sentry对象。

调用此函数将gcount返回的值设置为零。

3.istream::putback

尝试将流中的当前位置减少一个字符,使从流中提取的最后一个字符再次可通过输入操作提取。也可以说是将字符放回到输入流中,输入流中字符的长度不变。

int main()
{
	char ch;
	cin>>ch;
	cin.putback(ch);
	char _ch;
	cin>>_ch;
	cout<<_ch;
}

运行结果

a
a

4.istream::seekg

可以看作seek+get,“寻找并获取(位置)”

seekg()是对输入文件定位,它有两个参数:第一个参数是偏移量,第二个参数是基地址。

对于第一个参数,可以是正负数值,正的表示向后偏移,负的表示向前偏移。而第二个参数可以是:

ios::beg:表示输入流的开始位置

ios::cur:表示输入流的当前位置

ios::end:表示输入流的结束位置

而tellg()函数不需要带参数,它返回当前定位指针的位置,也代表着输入流的大小(从开始到文件的隐藏指针)。

seekg()可以用于自定义隐藏指针的位置

例如

int main()
{
	ifstream in("d://data.txt");
	
	in.seekg(2,ios::beg);
	cout<<in.rdbuf();
}

可以从第三个位置开始读出数据