输入输出那些事

 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函数 

  功能:函数用于输入流。它读入字符,直到已经读了num 个字符(默认为1)或是直到字符delim 被读入(默认为EOF).
 
  其调用形式为cin.ignore(n,终止字符)
 
  原型:istream &ignore( streamsize num=1, int delim=EOF );
 
  函数作用是跳过输入流中n个字符,或在遇到指定的终止字符时提前结束(此时跳过包括终止字符在内的若干字符)。
 
3.getline函数
  此函数是按行读取,其语法为:cin.getline(字符指针,字符个数N,结束符); 
    功能是:一次读取多个字符(包括空白字符),直到读满N-1个,或者遇到指定的结束符为止(默认的是以'\n'结束)。 
 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()直接就停了,不知道这种理解对不对,
 它还可以这样用: 
   cin.ignore();  
     即不带参数;此时默认参数为1.
调用ignore函数时需要注意一个问题
当调用cin.ignore(10)时候,那么如果在缓冲区中字符数不足10的时候,你的程序将暂停,直到你输入到缓冲区的字符数达到了10,这条语句才运行结束,之后的语句才能运行。

 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为指定读入的字符的数量。

原文地址:https://www.cnblogs.com/hxsyl/p/2685887.html