1.如果不加cin.ignore();这行,s2将不会被输入。原因是缓冲区每次结尾的时候还有/n,而getline()一开始读的时候认为已经结束,就返回空行。
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 int main( ) 5 { 6 string s; 7 cin >> s; 8 string s2; 9 //cin.ignore(); 10 getline(cin, s2); 11 cout << "s2:" << s2 << endl; 12 return 0; 13 }
2.ignore函数
1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 char a[20]; 7 a[9] = 555; 8 cin.getline(a,10);//类似fgets 9 for(int i=0;i<10;i++) 10 cout<<a[i]<<" "; 11 cout<<endl; 12 while(1); 13 } 14 //输入:123456789123始终输出123456789,最后一位默认\0
1 char str1[30],str2[30],str3[30]; 2 cout < < "请输入你的姓名: "; 3 cin> > str1; 4 cout < < "请输入你的住址: "; 5 cin.ignore(); 6 cin.getline(str2,30); 7 cout < < "请输入你的籍贯: "; 8 cin.ignore(); 9 cin.getline(str3,30); 10 11 问题:我知道cin> > str1不能获取带有空格符的字符串,而cin.getline()可以,但是为什么在cin.getline()前面必须要有一个cin.ignore()呢,为什么要忽略一个字符? 12 13 我猜测是第一个cin> > str1其实第一个是cin.getline()也一样,在我们敲回车的时候回车键的编码也被获取放到了cin当中,只是没有放到字符串中,而cin.getline()的默认的第三个参数(定界符)也是 '\n '(对不对?),所以第二个cin.getline()直接就停了,不知道这种理解对不对,
4.C++清空缓冲区
cout.tie(&cout); cout<<unitbuf; fflush(stdin);//一般C++里不用 记得还有个和cin.clear()配套使用的也可完成此功能,现在忘了。
所有输入流的共同特征:没数据就阻塞,满了就留在流里
5.iostream头文件
成员函数put()
输出类ostream的成员函数put()用于输出一个字符,其格式是:
ostream& <类对象>.put (char ch);
其中,参数ch用于存储需要输出的字符,最常用的ostream类对象是cout。例如:
cout.put('X'); // 显示输出字母X
由于该函数的返回类型为ostream类对象的引用,所以它可以被串联使用,例如:
cout.put('G').put('o') .put('o') .put('d'); // 显示输出Good
成员函数write()
输出类ostream的成员函数write()用于输出一个指定长度的字符串,其格式是:ostream& <类对象>.write (const char *str, int length);
其中,参数str用于存储需要输出的字符串,length用于指定字符串中希望被输出的字符的个数,当length等于strlen(str)时,输出整个字符。
和函数put()一样,在函数write()中最常用的的ostream类对象是cout。该函数的返回类型也是ostream类对象的引用,所以也可以被串联使用。
成员函数get()
输入类istream的成员函数get()可以读入一个字符或者一个字符串,它不会忽略空格、制表符、换行符和回车,而是将它们也当作字符一并读入。
它有三种原型:
int get(); // ①
istream& get(char& ch); // ②
istream& get(char *str, int length, char delimiter = '\n'); // ③
原型③是在参数的控制下读入若干个字符,结束读入操作的条件有三种:
(1)参数length,
表示读入字符的数量不得多于length-1个;
(2)参数delimiter,缺省值是换行符“\n”,用于指定一个特定的字符,当遇到该字符时就停止读入操作。
(3)当遇到文件结束符EOF时。
成员函数getline()
输入类istream的成员函数getline()的原型如下:
istream& getline(char *str, int length, char delimiter = '\n');
它和函数get()的功能基本相同,用于读取一串字符,直到读入字符的个数大于length-1,或者遇到文件的结束符EOF,或者遇到delimiter。
但是,函数getline()要比函数get()好用得多,因为它能够自动丢弃delimiter,而不会将它留在istream中作为下一个输入的字符。
成员函数read()
输入类istream的成员函数read()的功能是从输入流中读取指定数量的字符,其函数原型如下:
istream& read(char * str, int length);
其中,参数str用于存放读入的字符,length为指定读入的字符的数量。