串流类(istrstream)输入行为的探讨

首先,istrstream类的两个构造函数:

  istrstream::istrstream(const char* str);

  istrstream::istrstream(const char* str, int size);

接着,看下面一段代码:

 1 #include<strstrea.h>
 2 #include<iostream.h>
 3 
 4 void main()
 5 {
 6     char str[100]="I am a student.
";
 7     char a;
 8     istrstream  ai(str, 5);
 9 
10     ai>>a;
11     cout<<a<<endl;
12 }

  当size=0时;

    以n表示第十行代码(ai>>a)的重复次数:

    n=1,   输出:I;

    n=2,   输出:a;

    n=3,   输出:m;    

    n=4,   输出:a;

    n=5,   输出:s;

    n=11,  输出:t;

    n=12,  输出:.;

    n=13,  输出:.;     //这位字符是' ' ;(仅仅看除去空格、制表符、换行等后的字符)

    n=14,  输出:.;  //这位字符是’ ‘ ;

    n=15,  输出:.;  //这位字符是'' ;

    n=16,  输出:.;  //这位字符是'' ;

  当size>0时;

  1. size = 3;

      n=1('I');

      n=2('a');

      n=3('a');

      n=4('a');

    2.  size = 5;

      n=3('m');

      n=4('m');

      n=5('m');

    3.  size = 6;

      n=3('m');

      n=4('a');

      n=5('a');

      n=6('a');

综上:

  1. 不论size是否大于0,二者都只输入除去空格、回车、制表符、换行等以后的字符;如果输入中遇到空格等一类字符,程序自动以后面第一个非空格一类字符代替(对于size>0的情况,这句话指size还没有起作用时候);
  2. 当size = 0, 当输入次数大于有效字符(除去空格一类字符)数时,后面的输入保持不变,维持在最有一个有效字符的输入状态;
  3. 当size>0时,
    1. size控制位数(此“位数”包括所有字符,甚至是空格、回车、制表符、换行等符号),当输入次数超过size后,size肯定就开始发挥限制输入的作用了;
    2. size 可能在输入次数小于size大小的时候就开始发挥限制作用了;("I am a student." , 此情况,如果size = 5, 那么在第三次输入得到'm'后size 就开始发挥输入限制作用了)
    3. 当输入被size限制后,后面再输入的字符维持在最后一个有效字符的状态;
原文地址:https://www.cnblogs.com/richard-c-java/p/3292528.html