C++(二)输入与输出

文章目录

      • 一、输入与输出
      • 二、cin>>的用法
            • cin.get读取一个字符
            • cin.get读取一行
            • cin.getline读取一行
            • cin.ignore()
            • cin.sync()与cin.clear()
          • C++标准输入输出流的控制符

一、输入与输出

C语言的输入与输出:
getchar:字符输入函数
putchar:字符输出函数
scanf:输入
printf:输出
其中,scanf 和 printf 跟 C++ 中的 cin 和 cout 功能很类似,例如用 printf 输出多个值:
int x = 2;
int y = 3;
printf("%d + %d = %d", x, y, x+y);

printf 中的输出参数中要明确指定每个变量要输出的类型,%d 代表整形,%s 代表字符串,%c 代表字符型。

在C++中是用输入与输出流库中的 cin 和 cout 来实现的,不需要指定类型,它会自己处理的。
cin 和 cout 的定义是在 iostream 中,命名空间为 std。程序中要直接使用 cin 和 cout 就必须要加上以下两条语句:否则需要这样写std::cin,std::cout

#include 
using namespace std;

int x = 2;
int y = 3;
cout << x <<" + " <<y <<"= " << x + y << endl;
cout << x <<" + " <<y <<"= " << x + y << "\r\n";    //用转义符的换行符来替换endl

二、cin>>的用法

cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。

在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。

cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。
cin可以连续从键盘读取想要的数据,以空格tab换行作为分隔符。

cin 的常用读取方法:使用cin从标准输入读取数据时,通常方法有cin>>cin.getcin.getline

cin.get读取一个字符
char a;
a = cin.get();
cin.get读取一行

读取一行可以使用istream& get ( char* s, streamsize n )或者istream& get ( char* s, size_t n, streamsize delim )。二者的区别是前者默认以换行符结束,后者可指定结束符。n表示目标空间的大小。

#include 
using namespace std;

int main()
{
   char a;
   char array[20]={NULL}; 
   cin.get(array,20);
   cin.get(a);
   cout<<array<<" "<<(int)a<<endl;
   system("pause");
   return 0;
}
cin.getline读取一行

istream& getline(char* s, streamsize count); //默认以换行符结束
istream& getline(char* s, streamsize count, char delim);

#include 
using namespace std;
int main()
{
    char array[20]={NULL};
    cin.getline(array,20); //或者指定结束符,使用下面一行
    //cin.getline(array,20,'\n');
    cout<<array<<endl;
    system("pause");
    return 0;
}

C++中定义了一个在std名字空间的全局函数getline,因为这个getline函数的参数使用了string字符串,所以声明在了< string>头文件中了
getline利用cin可以从标准输入设备键盘读取一行,当遇到如下三种情况会结束读操作:1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。

istream& getline ( istream& is, string& str); //默认以换行符结束
istream& getline ( istream& is, string& str, char delim);

#include  
#include 
using namespace std;

int main()
{
    string str;
    getline(cin,str);
    cout<<str<<endl;
    system("pause");
    return 0;
}

cin.getline与cin.get的区别是,cin.getline不会将结束符或者换行符残留在输入缓冲区中。

cin.ignore()

例如:cin.ignore(5, ‘c’)的是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到5或者被抛弃的字符是’c’,则cin.ignore()函数执行终止;否则,它继续等待。
它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。比如可以这么用:cin.ignore(1024, ‘\n’);通常把第一个参数设置得足够大,这样实际上总是只有第二个参数’\n’起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。

cin.sync()与cin.clear()

cin.sync()用法,清空输入缓冲区的内容,在输入规定的数目float型数据中错误输入一个string型,然而后提示输入错误,转重新输入,直到输入正确。
cin.clear()用法如果输入发生错误发生,那么流状态既被标记为错误,你必须清除这些错误状态,以使你的程序能正确适当地继续运行。要清除错误状态,需使用clear()函数。

int x;
cin >> x;
while (cin.fail())
{
    cin.clear();
    cin.sync();
    cout << "XXXXX"<<endl;
    cin >> x;
}
C++标准输入输出流的控制符
格式标志 作用 格式标志 作用
dec 设置整数的基数为10 ios::left 输出数据在本域宽范围内左对齐
hex 设置整数的基数为16 ios::right 输出数据在本域宽范围内右对齐
oct 设置整数的基数为8 ios::internal 数值的符号位在域宽内左对齐,数值右对齐,中间由填充字符填充
setbase(n) 设置整数的基数为n(n只能是16,10,8之一) ios::dec 设置整数的基数为10
setfill© 设置填充字符c,c可以是字符常量或字符变量 ios::oct 设置整数的基数为8
setprecision(n) 设置实数的精度为n位。
在以一般十进制小数形式输出时,n代表有效数字。
在以fixed(固定小数位数)形式和scientific(指数)形式输出时,n为小数位数。
ios::hex 设置整数的基数为16
setw(n) 设置字段宽度为n位。 ios::showbase 强制输出整数的基数(八进制以0打头,十六进制以0x打头)
setiosflags(ios::fixed) 设置浮点数以固定的小数位数显示。 ios::showpoint 强制输出浮点数的小点和尾数0
setiosflags(ios::scientific) 设置浮点数以科学计数法(即指数形式)显示。 ios::uppercase 在以科学计数法输出E和十六进制输出字母X时,以大写表示
setiosflags(ios::left) 输出数据左对齐。 ios::showpos 输出正数时,给出“+”号。
setiosflags(ios::right) 输出数据右对齐。 ios::scientific 设置浮点数以科学计数法(即指数形式)显示
setiosflags(ios::shipws) 忽略前导的空格。 ios::fixed 设置浮点数以固定的小数位数显示
setiosflags(ios::uppercase) 在以科学计数法输出E和十六进制输出字母X时,以大写表示。 ios::unitbuf 每次输出后刷新所有流
setiosflags(ios::showpos) 输出正数时,给出“+”号。 ios::stdio 每次输出后清除 stdout,stderr
resetiosflags 终止已设置的输出格式状态,在括号中应指定内容。

用流对象的成员控制输出格式

流成员函数 与之作用相同的控制符 作用
precision(n) setprecision(n) 设置实数的精度为n位。
width(n) setw(n) 设置字段宽度为n位。
fill(c) setfill(c) 设置填充字符c。
setf( ) setiosflags( ) 设置输出格式状态,括号中应给出格式状态,
内容与控制符setiosflags括号中内容相同。
ubsetf( ) resetiosflags( ) 终止已设置的输出格式状态。
#include 
using namespace std;
int main()
{
   int a=21;
   cout.setf(ios::showbase); //设置输出时的基数符号
   cout<<"dec:"<<a<<endl;    //默认以十进制形式输出a
   cout.unsetf(ios::dec);    //终止十进制的格式设置

   cout.setf(ios::hex);   //设置以十六进制输出的状态
   cout<<"hex:"<<a<<endl; //以十六进制形式输出a
   cout.unsetf(ios::hex); //终止十六进制的格式设置

   char *pt="China";     //pt指向字符串”china”
   cout.width(10);       //指定域宽为10
   cout<<pt<<endl;       //输出字符串
   cout.width(10);       //指定域宽为10
   cout.fill('*');       //指定空白处以'*'填充
   cout<<pt<<endl;       //输出字符串
   double pi=22.0/7.0;   //计算pi值
   cout.setf(ios::scientific);//指定用科学记数法输出
   cout<<"pi=";               //输出"pi="
   cout.width(14);            //指定域宽为14
   cout<<pi<<endl;            //输出"pi值
   cout.unsetf(ios::scientific); //终止科学记数法状态
   cout.setf(ios::fixed);        //指定用定点形式输出
   cout.width(12);               //指定域宽为12
   cout.setf(ios::showpos);      //在输出正数时显示“+”号
   cout.setf(ios::internal);     //数符出现在左侧
   cout.precision(6);            //保留6位小数
   cout<<pi<<endl;               //输出pi,注意数符“+”的位置
   return 0;
}

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