C++控制台输入输出总结

当在控制台输入数据时,所有的数据都是输入到缓冲区的,当从其中提取数据时,也是从缓冲区提取的!其有一个指向缓冲区的指针,就是通过此指针对数据提取的。

例如cin>>a;就是通过>>的重载实现从缓冲区取出数据并进行相应的转换后赋值给a;如果缓冲区没有数据的话,则等待用户输入数据。

1.对于从控制台读入数据到数据结构中,主要要了解的是:

  • 1,读入的数据是什么(尤其针对字符串,是否包括空格,换行符等)。
  • 2,读入数据后缓冲区的指针指向什么位置(缓冲区都指向读入数据的下一位)

通常读入的数据可以分为两种,一种是数值数据,例如int,float等。另一种是字符数据,包括单个字符和字符串。

对于数值数据,直接将数据读入到相关的数据结构中即可。指针指向数据的后一位。可以指向换行符!

对于字符数据,如果是单个字符读入的话,类似数值数据。也可以指向换行符!

对于字符数据,如果是读入字符串的话,则针对存储类型有不同的实现机制:

1.如果用c风格的字符数组保存字符串,则字符串的结尾一定是会添加0作为结束符的

2.如果用string保存字符串,则结尾一定是不增加0的。

char a[100];

cin.getline(a,100);//读入一行数据,同时将数据存放在a字符数组中,末尾添0,同时换行符不存储。(指针指向下一行开始!如果没有数据了则设置指针读完eof。指针指向下一行很容易理解,既然是getline,自然是将此行数据全部读完了,那指针指向下一位自然是下一行开始。只是在存储时将换行符舍弃了而已)

2.console程序中,按下enter键,输入数据进入缓冲区,后面的取数据操作都是在缓冲区中进行的。  

当输入字符串时,主要要考虑到不同的输入函数对字符串的读取方式。包括空白字符是否读取,字符串末尾是否补‘\0’等。

对于各种输入函数作如下整理:

  • cin>>a;从缓冲区中取数据赋值给a,遇到空格,tab,enter结束。当a是字符串时,在a末尾添加0.(如果字符串长度>=a.len,最后一位不输入数据,输入0)
  • cin.getline(s,20,'\n');给s赋值,遇到enter结束,不保存enter,同时在s末尾添加0(如果字符串长度>=20,最后一位不输入数据,输入0),也就是说s有效长度最多19,必须以0结尾。
  • getchar();从缓冲区中获取一个字符,可以是任何字符,包括空格,tab,enter等。
  • getch();直接用户在屏幕中输入一个字符,其就返回一个字符,不从缓冲区中取,其是针对屏幕的。
  • gets();从缓冲区读入字符串,当遇到enter时结束,不保存enter。遇到空格,tab保存,同时继续向后字符串末尾也补0.
  • scanf();根据参数形式确定了最终的赋值情况。
  • scanf("%d,%d",&a,&b)则屏幕应该输入10,20
  • scanf("%d%d“,&a,&b)则屏幕输入10 20 或者10 tab 20 或者10 enter 20
  • 当输入为字符串时,不读取enter,‘ ’,tab,末尾补0,但是读取‘ ’和tab,当输入字符时,读取enter('\n')

3.对于接收从控制台输入的数据,可以采用如下规则:

1,对于行数不固定的输入,只需要有行输入结束的判断即可,由于行结束输入了,整个输入也就结束了,所以可以直接利用cin来判断,当整个输入结束时,cin 为false

2.,对于每一行的数据,如果数据的个数和数据的类型确定的话,则可以用cin>>a>>b...等方式来进行读入数据。

3,对于每一行的数据,如果行数据个数不固定,则在接收数据的同时需要判断行结束标志:可以采用如下两种处理方式:

  • 对于数据间有空格的数据,可以用cin.get() != '\n'来持续输入:例如 123 ab 34 cd 334 def
  • 对于数据间没有空格的输入,可以用stringstream来。例如123a34b324c

4.stringstream的使用注意点:

1.每次使用stringstream之前都要调用clear()函数清空。

2.stringstream是否结束是采用eof()函数来判断的,而不是像cin一样用此对象本身来判断,例子:

[cpp]  view plain  copy
 
  1. #include   
  2. #include   
  3. using namespace  std;  
  4.   
  5.   
  6. string s;  
  7. stringstream ss;  
  8. int a;  
  9. char c;  
  10.   
  11. while(getline(cin,s)){//s = 123A23B234C......  
  12.     ss.clear();  
  13.     ss<
  14.     while(!ss.eof()){  
  15.         ss>>a>>c;  
  16.     }  
  17. }  
5.读入单个字符的方法:cin.get(c);或者cin.get(),其返回值为char.

读入一行字符的方法cin.getline():其是iostream中的函数。getline(cin,s):其是stl中的函数.

1,char c[100]; cin.getline(c,100)//数据保存在字符数组中,如果字符数组开辟的小于一行的输入的话则会丢失相关数据

2,string s; getline(cin,s);//数据保存在字符串中,不存在1中的问题。

6.cin>>的使用:从缓冲区指针处开始,跳过空白符(空格,tab等)和换行符,取相关数据到变量中,直到遇到下一个空白符(空格,tab等)和换行符,结束。

如果数据无法转换,则cin返回false(cin返回false除了输入结束外,还有输入出错的情况!!)

string a;cin>>a;从缓冲区指针处开始,按照上面说明的方法,取数据放入a中。

int b;cin>>b;同上

char c[100];对于c风格的字符数组,方法同上,只是字符数组的最后都会自动补0的。




C/

 stringstream的具体例子符串流

输入输出的头文件  
string流的头文件  
文件流的头文件  

stringstream的用法

1.利用输入输出做数据转换

stringstream ss_stream;
ss_stream << i;   // 将int输入流中
ss_stream >> str; // 将ss_stream中的数值输出到str中

//注意:如果做多次数据转换;必须调用clear()来设置转换模式
ss_stream << "456"; 
ss_stream >> i;   // 首先将字符串转换为int
ss_stream.clear();
ss_stream << true;
ss_stream >> i;   // 然后将bool型转换为int;假如之前没有做clear,那么i会出错

//运行clear的结果 
i = 456 
i = 1 
//没有运行clear的结果 
i = 456 
i = 8800090900 

 

 

2.支持char*的输入和输出

char sz_buf[20];
ss_stream << 8888;
ss_stream >> sz_buf; // 直接将数输出到sz_buf字符数组中

 

3.来存储可变数据的列表

stringstream ss_stream;
ss_stream << "字符串一" << endl;
ss_stream << "字符串二" << endl;
ss_stream << "字符串三" << endl;
ss_stream << "字符串四" << endl;
ss_stream << "字符串五" << endl;

char buffer[100];
while ( ss_stream.getline(buffer, sizeof(buffer))
{
    printf("msg=%s\n", buffer);
}
ss_stream("");// 释放字符串流中的资源

// 或者用string来接收
stringstream ss_stream;
string stemp;
while ( getline(ss_stream, stemp) )
{
    task_download(stemp.c_str(), relate.c_str());
}

你可能感兴趣的:(C++)