• 输入输出那些事


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

  • 相关阅读:
    hadoop中使用hprof工具进行性能分析
    hadoop map端的超时参数
    一次hadoop集群机器加内存的运维过程
    算法学习-回溯法
    项目中Map端内存占用的分析
    hadoop Shuffle Error OOM错误分析和解决
    算法学习-动态规划
    项目中Map端数据处理不均匀性分析
    《Hadoop技术内幕》读书笔记——Task运行过程分析
    jsp里更新Clob类型字段数据
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2685887.html
Copyright © 2020-2023  润新知