程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++輸入和輸出,輸入輸出

C++輸入和輸出,輸入輸出

編輯:C++入門知識

C++輸入和輸出,輸入輸出


本文轉載:blog.csdn.net/zhanghaotian2011/article/details/8868577博客

輸入和輸出並不是C++語言中的正式組成成分。C和C++本身都沒有為輸入和輸出提供專門的語句結構。輸入輸出不是由C++本身定義的,而是在編譯系統提供的I/O庫中定義的。
C++的輸出和輸入是用“流”(stream)的方式實現的。圖3.2和圖3.3表示C++通過流進行輸入輸出的過程。

有關流對象cin、cout和流運算符的定義等信息是存放在C++的輸入輸出流庫中的,因此如果在程序中使用cin、cout和流運算符,就必須使用預處理命令把頭文件stream包含到本文件中:
    #include <iostream>
盡管cin和cout不是C++本身提供的語句,但是在不致混淆的情況下,為了敘述方便,常常把由cin和流提取運算符“>>”實現輸入的語句稱為輸入語句或cin語句,把由cout和流插入運算符“<<”實現輸出的語句稱為輸出語句或cout語句。根據C++的語法,凡是能實現某種操作而且最後以分號結束的都是語句。

一、輸入流與輸出流的基本操作

cout語句的一般格式為:
    cout<<表達式1<<表達式2<<……<<表達式n;
cin語句的一般格式為:
    cin>>變量1>>變量2>>……>>變量n;
在定義流對象時,系統會在內存中開辟一段緩沖區,用來暫存輸入輸出流的數據。在執行cout語句時,先把插入的數據順序存放在輸出緩沖區中,直到輸出緩沖區滿或遇到cout語句中的endl(或'\n',ends,flush)為止,此時將緩沖區中已有的數據一起輸出,並清空緩沖區。輸出流中的數據在系統默認的設備(一般為顯示器)輸出。
一個cout語句可以分寫成若干行。如
   cout<<"This is a simple C++ program."<<endl;
可以寫成
   cout<<"This is "  //注意行末尾無分號
   <<"a C++ "
   <<"program."
   <<endl; //語句最後有分號
也可寫成多個cout語句,即
   cout<<"This is "; //語句末尾有分號
   cout <<"a C++ ";
   cout <<"program.";
   cout<<endl;
以上3種情況的輸出均為
This is a simple C++ program.
注意 不能用一個插入運算符“<<”插入多個輸出項,如:
    cout<<a,b,c; //錯誤,不能一次插入多項
    cout<<a+b+c; //正確,這是一個表達式,作為一項
在用cout輸出時,用戶不必通知計算機按何種類型輸出,系統會自動判別輸出數據的類型,使輸出的數據按相應的類型輸出。如已定義a為int型,b為float型,c為char型,則
    cout<<a<<' '<<b<<' '<<c<<endl;
會以下面的形式輸出:
4 345.789 a
與cout類似,一個cin語句可以分寫成若干行。如
    cin>>a>>b>>c>>d;
可以寫成
   cin>>a //注意行末尾無分號
   >>b //這樣寫可能看起來清晰些
   >>c
   >>d;
也可以寫成
   cin>>a;
   cin>>b;
   cin>>c;
   cin>>d;
以上3種情況均可以從鍵盤輸入: 1  2  3  4 ↙
也可以分多行輸入數據:
   1↙
   2  3↙
   4↙
在用cin輸入時,系統也會根據變量的類型從輸入流中提取相應長度的字節。如有
   char c1,c2;
   int a;
   float b;
   cin>>c1>>c2>>a>>b;
如果輸入
1234 56.78↙
注意: 34後面應該有空格以便和56.78分隔開。也可以按下面格式輸入:
1 2 34 56.78↙ (在1和2之間有空格)
不能用cin語句把空格字符和回車換行符作為字符輸入給字符變量,它們將被跳過。如果想將空格字符或回車換行符(或任何其他鍵盤上的字符)輸入給字符變量,可以用3.4.3節介紹的getchar函數。
在組織輸入流數據時,要仔細分析cin語句中變量的類型,按照相應的格式輸入,否則容易出錯。

二、在輸入流與輸出流中使用控制符

上面介紹的是使用cout和cin時的默認格式。但有時人們在輸入輸出時有一些特殊的要求,如在輸出實數時規定字段寬度,只保留兩位小數,數據向左或向右對齊等。C++提供了在輸入輸出流中使用的控制符(有的書中稱為操縱符)。
需要注意的是: 如果使用了控制符,在程序單位的開頭除了要加iostream頭文件外,還要加iomanip頭文件。
舉例: 輸出雙精度數。
double a=123.456789012345;對a賦初值
(1) cout<<a;輸出: 123.456
(2) cout<<setprecision(9)<<a;輸出: 123.456789
(3) cout<<setprecision(6);恢復默認格式(精度為6)
(4) cout<< setiosflags(ios∷fixed);輸出: 123.456789
(5) cout<<setiosflags(ios∷fixed)<<setprecision(8)<<a;輸出: 123.45678901
(6) cout<<setiosflags(ios∷scientific)<<a;輸出: 1.234568e+02
(7) cout<<setiosflags(ios∷scientific)<<setprecision(4)<<a; 輸出: 1.2346e02
下面是整數輸出的例子:
int b=123456;對b賦初值
(1) cout<<b;輸出: 123456
(2) cout<<hex<<b; 輸出: 1e240
(3) cout<<setiosflags(ios∷uppercase)<<b;輸出: 1E240
(4) cout<<setw(10)<<b<<','<<b; 輸出:  123456,123456
(5) cout<<setfill('*')<<setw(10)<<b;輸出: **** 123456
(6) cout<<setiosflags(ios∷showpos)<<b;輸出: +123456
如果在多個cout語句中使用相同的setw(n),並使用setiosflags(ios∷right),可以實現各行數據右對齊,如果指定相同的精度,可以實現上下小數點對齊。
例3.1 各行小數點對齊。
#include <iostream>
#include <iomanip>
using namespace std;
int main( )
{
   double a=123.456,b=3.14159,c=-3214.67;
   cout<<setiosflags(ios∷fixed)<<setiosflags(ios∷right)<<setprecision(2);
   cout<<setw(10)<<a<<endl;
   cout<<setw(10)<<b<<endl;
   cout<<setw(10)<<c<<endl;
   return 0;
}
輸出如下:
  123.46 (字段寬度為10,右對齊,取兩位小數)
3.14
  -3214.67
先統一設置定點形式輸出、取兩位小數、右對齊。這些設置對其後的輸出均有效(除非重新設置),而setw只對其後一個輸出項有效,因此必須在輸出a,b,c之前都要寫setw(10)。

學C++的時候,這幾個輸入函數弄的有點迷糊;這裡做個小結,為了自己復習,也希望對後來者能有所幫助,如果有差錯的地方還請各位多多指教(本文所有程序均通過VC 6.0運行)轉載請保留作者信息;
1、cin
1、cin.get()
2、cin.getline()
3、getline()
4、gets()
5、getchar()

1、cin>>         

用法1:最基本,也是最常用的用法,輸入一個數字:

#include <iostream>
using namespace std;
main ()
{
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
}

輸入:2[回車]3[回車]
輸出:5

用法2:接受一個字符串,遇“空格”、“TAB”、“回車”都結束

#include <iostream>
using namespace std;
main ()
{
char a[20];
cin>>a;
cout<<a<<endl;
}

輸入:jkljkljkl
輸出:jkljkljkl

輸入:jkljkl jkljkl       //遇空格結束
輸出:jkljkl

2、cin.get()

用法1: cin.get(字符變量名)可以用來接收字符

#include <iostream>
using namespace std;
main ()
{
char ch;
ch=cin.get();               //或者cin.get(ch);
cout<<ch<<endl;
}

輸入:jljkljkl
輸出:j

用法2:cin.get(字符數組名,接收字符數目)用來接收一行字符串,可以接收空格

#include <iostream>
using namespace std;
main ()
{
char a[20];
cin.get(a,20);
cout<<a<<endl;
}

輸入:jkl jkl jkl
輸出:jkl jkl jkl

輸入:abcdeabcdeabcdeabcdeabcde (輸入25個字符)
輸出:abcdeabcdeabcdeabcd              (接收19個字符+1個'\0')

用法3:cin.get(無參數)沒有參數主要是用於捨棄輸入流中的不需要的字符,或者捨棄回車,彌補cin.get(字符數組名,接收字符數目)的不足.

這個我還不知道怎麼用,知道的前輩請賜教;

3、cin.getline()   // 接受一個字符串,可以接收空格並輸出

#include <iostream>
using namespace std;
main ()
{
char m[20];
cin.getline(m,5);
cout<<m<<endl;
}

輸入:jkljkljkl
輸出:jklj

接受5個字符到m中,其中最後一個為'\0',所以只看到4個字符輸出;

如果把5改成20:
輸入:jkljkljkl
輸出:jkljkljkl

輸入:jklf fjlsjf fjsdklf
輸出:jklf fjlsjf fjsdklf

//延伸:
//cin.getline()實際上有三個參數,cin.getline(接受字符串的看哦那間m,接受個數5,結束字符)
//當第三個參數省略時,系統默認為'\0'
//如果將例子中cin.getline()改為cin.getline(m,5,'a');當輸入jlkjkljkl時輸出jklj,輸入jkaljkljkl時,輸出jk

當用在多維數組中的時候,也可以用cin.getline(m[i],20)之類的用法:

#include<iostream>
#include<string>
using namespace std;

main ()
{
char m[3][20];
for(int i=0;i<3;i++)
{
cout<<"\n請輸入第"<<i+1<<"個字符串:"<<endl;
cin.getline(m[i],20);
}

cout<<endl;
for(int j=0;j<3;j++)
cout<<"輸出m["<<j<<"]的值:"<<m[j]<<endl;

}

請輸入第1個字符串:
kskr1

請輸入第2個字符串:
kskr2

請輸入第3個字符串:
kskr3

輸出m[0]的值:kskr1
輸出m[1]的值:kskr2
輸出m[2]的值:kskr3

4、getline()     // 接受一個字符串,可以接收空格並輸出,需包含“#include<string>”

#include<iostream>
#include<string>
using namespace std;
main ()
{
string str;
getline(cin,str);
cout<<str<<endl;
}

輸入:jkljkljkl
輸出:jkljkljkl

輸入:jkl jfksldfj jklsjfl
輸出:jkl jfksldfj jklsjfl

和cin.getline()類似,但是cin.getline()屬於istream流,而getline()屬於string流,是不一樣的兩個函數

5、gets()        // 接受一個字符串,可以接收空格並輸出,需包含“#include<string>”

#include<iostream>
#include<string>
using namespace std;
main ()
{
char m[20];
gets(m);                       //不能寫成m=gets();
cout<<m<<endl;
}

輸入:jkljkljkl
輸出:jkljkljkl

輸入:jkl jkl jkl
輸出:jkl jkl jkl

類似cin.getline()裡面的一個例子,gets()同樣可以用在多維數組裡面:

#include<iostream>
#include<string>
using namespace std;

main ()
{
char m[3][20];
for(int i=0;i<3;i++)
{
cout<<"\n請輸入第"<<i+1<<"個字符串:"<<endl;
gets(m[i]);
}

cout<<endl;
for(int j=0;j<3;j++)
cout<<"輸出m["<<j<<"]的值:"<<m[j]<<endl;

}

請輸入第1個字符串:
kskr1

請輸入第2個字符串:
kskr2

請輸入第3個字符串:
kskr3

輸出m[0]的值:kskr1
輸出m[1]的值:kskr2
輸出m[2]的值:kskr3

自我感覺gets()和cin.getline()的用法很類似,只不過cin.getline()多一個參數罷了;

這裡順帶說明一下,對於本文中的這個kskr1,kskr2,kskr3的例子,對於cin>>也可以適用,原因是這裡輸入的沒有空格,如果輸入了空格,比如“ks kr jkl[回車]”那麼cin就會已經接收到3個字符串,“ks,kr,jkl”;再如“kskr 1[回車]kskr 2[回車]”,那麼則接收“kskr,1,kskr”;這不是我們所要的結果!而cin.getline()和gets()因為可以接收空格,所以不會產生這個錯誤;

6、getchar()   //接受一個字符,需包含“#include<string>”

#include<iostream>
#include<string>
using namespace std;
main ()
{
char ch;
ch=getchar();                        //不能寫成getchar(ch);
cout<<ch<<endl;
}

輸入:jkljkljkl
輸出:j

//getchar()是C語言的函數,C++也可以兼容,但是盡量不用或少用;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved