C++輸入與輸出


1 概述

  C和C++都沒有將輸入和輸出建立在語言中,C++將輸入輸出的解決方案放在類庫中(由頭文件iostream和fstream中定義的類)

  C++程序把輸入和輸出看作字節流。流充當了程序和流源流目標之間的橋梁。

  C++輸入輸出類的派生關系:ios_base -> ios -> istream/ostream -> iostream

  cin和cout是對象

 

2 cout

2.1 <<插入操作符

  使用插入操作符可以有一下3種方法:1.一個cout接受的類型(int char long(包括signed/unsigned)float double long double),包括數值/變量/解除引用的指針/數組;2.char數組名或char的指針(必須是char */signed char */unsigned char*而不能是其他類型)3.引號引起的字符串

1     int i = 999;
2     int *p = &i;
3     cout<<*p<<"  "<<p<<endl;
4     char *a = "hellow";
5     cout<<*a<<"  "<<a<<endl;
6     char name[10] = "world";
7     cout<<name<<endl;

  輸出結果:

  也就是說對於非char類型的指針,必須是cout<<*p,否則cout<<p只是輸出p的地址;而char類型的指針,cout<<*p相當於輸出p[0],是cout<<p輸出p指向字符串的全部內容,原因是cout<<原型中為char類型提供了單獨的char指針類型,charl類型的字符串數組也是類似。總而言之對非char類型的指針或數組名正常處理,對於char類型的指針或數組名直接當作內容處理

2.2 拼接輸出

  <<插入操作符可以拼接,方法也可以拼接,如cout.pur('I').put('T')

2.3 cout.put();cout.write()

  put輸出字符,接收一個char類型的參數,或者將數值參數轉化為char值

  write輸出字符串,接收兩個參數,原型為:

1 basic_ostream<charT,traints>& write(const char_type* s, streamsize n);

  write遇到空字符時不會停止,即使超出邊界,write仍繼續打印

    cout.put('A')<<endl;
    cout.put('A' + 0x20)<<endl;
    cout.put(65)<<endl;
    char *name = "hellow";
    char *name1 = "world";
    cout.write(name,12)<<endl;

2.4 cout格式化值

  對於char,數值整型,字符串顯示在與其寬度相對應的字段中,對於浮點數,顯示為6位(如果夠6位),不夠的末尾的0也不顯示,當指數>=6或<=-5時以科學計數法顯示,否則以定點表示法顯示

1     float i = 1.2;
2     float j = 1.23456789;
3     float m = 123456789;   //默認精讀是6位
4     float n = 123456.789;
5     cout<<i<<endl;
6     cout<<j<<endl;
7     cout<<m<<endl;
8     cout<<n<<endl;
9     cout<<(n * 1e3)<<endl;

  最后一行相當於1乘以10的3次方,此時指數大於6,用科學計數法表示

  輸出十進制:cout<<dec;八進制:cout<<oct;十六進制:cout<<hex    作用域,永久有效直到將格式狀態改變為止。

2.5 cout.width();cout.fill();cout.precision()

  width()方法有兩種原型:

  int width();         //返回字符寬度的當前設置

  int width(int i);   //設置寬度為i,並返回以前的字符寬度

  注意:width方法只影響接下來顯示的一個項目,然后將字段寬度恢復為默認值;C++永遠不會截短數據,當寬度不夠會增加寬度,顯示所有數據比保持列整潔更為重要

1     int w = cout.width(30);  
2     cout << "default field width = " << w << ":\n"; 
3     for(int i = 1;i <= 10;i++)
4     {
5         cout<<"width:";
6         cout.width(i);
7         cout<<i<<endl;
8     } 

  由於width()返回以前的寬度,故返回默認的寬度為0,程序表明width()只影響接下來被顯示的一個項目

  默認情況下用空格填充字段中未被使用的部分,可以用fill()方法來修改填充,比如用*填充寫作cout.fill('*'),其作用域一直持續直到更改為止

  cout.precision()為設置精度的方法,在默認情況下精度是指的總位數,在定點模式(fixed)和科學模式下精度是指小數點后面的位數,作用域也是一直有效,默認情況下精度是6位

1     cout.precision(5);
2     float i = 1.2345678;
3     cout<<i<<endl;
4     cout<<fixed<<i<<endl; 

2.6 cout.setf();cout.setf()以及C++的標准控制符

  這類函數可以控制多種格式化特性,前者是用來設置格式,后者用來消除格式,比如:cout.setf(hios_base::showpoint),用來顯示末尾小數點,但是這樣用比較繁瑣,所以C++提供了多個控制符,能夠調用setf()

  標准控制符直接在插入操作符后面使用,一些常見的標准控制符:

  cout<<showbase;  cout<<noshowbase;  對於輸出使用/不使用C++前綴

  cout<<showpoint; cout<<noshowpoint;  顯示/不顯示末尾小數點

  cout<<showpos;  cout<<unshowpos;        對於正數,顯示/不顯示 +

  cout<<left; cout<<right;                           左對齊/右對齊

  cout<<dec; cout<<oct; cout<<hex;           輸出十進制/八進制/十六進制

  cout<<fixed; cout<<scientific;                   使用定點/科學計數法

2.7 iomanip頭文件

  主要提供三個函數:setprecision();  設置精度

           setfill();      填充字符

           setw();       設置寬度

  比較方便的是可以與cout語句拼接起來

 

3 cin

3.1 >>抽取操作符

  cin>>______ 空格必須是cin接受的類型(int char long(包括signed/unsigned)float double long double),可以是變量,引用,被解除引用的指針,也可以是類或結構體成員

  同cout一樣也單獨針對char類型的指針和數組做出單獨的重載,可以直接使用數組名或指針,而對於非char類型的指針則必須要解除引用

1     int a;
2     int *p = &a;
3     cin>>*p;
4     cout<<*p<<endl;
5     char name[10];
6     cin>>name;
7     cout<<name<<endl;

3.2 cin>>檢查輸入

  讀取從非空白字符開始,到與目標類型不匹配的第一個字符之間的全部內容。輸入與預期格式不匹配將導致cin>>結果為false

  輸入結束條件  :到與目標類型不匹配的第一個字符(比如Enter、Space、Tab鍵)

  對結束符的處理 :丟棄緩沖區中使得輸入結束的結束符(Enter、Space、Tab)

3.3 cin.get(); cin.getline();

  cin.get(); cin.getline() 都提供不跳過空白的輸入

  cin.get()常用的有三種原型:cin.get(),  cin.get(char ),  cin.get(char *, int)

  單字符輸入可以用前兩種,ch=cin.get() 與 cin.get(ch)是等價的,輸入並顯示一段帶空格的字符串

1     char ch;
2     while( (ch = cin.get()) != '\n')
3         cout<<ch;

  字符串出入可以用cin.get(char *, int)或是cin.getline(char *, int)

  輸入結束條件  :讀取到指定數目字符或換行符時停止讀取

  對結束符的處理 :get()將換行符留在輸入流中,這樣接下來的輸入操作首先看到的書換行符,而getline()抽取並丟棄輸入流中的換行符,用get()讀取字符串時可以用一個cin.get()處理留在輸入流中的換行符

1     cin.get(array1,10);
2     cin.get();
3     cin.get(array2,10);

  cin.get(array_name, Arsize)當輸入的字符串超長時,不會引起cin函數的錯誤,后面的cin操作會繼續執行,只是直接從緩沖區中取數據。但是cin.getline()當輸入超長時,會引起cin函數的錯誤,后面的cin操作將不再執行

3.4 cin.peek()

  返回輸入中的下一個字符,但不抽取輸入流中的字符,也就是僅查看,不抽取。比如屏蔽空格

1 while( cin.peek() == ' ' )
2     cin.get();

3.5 cin.ignore();cin.read();cin.gcount();

  cin.ignore(),接收兩個參數,比如:cin.ignore(200,'\n')讀取並丟棄輸入流中的200個字符或是到達第一個換行符為止

  cin.read(),接收兩個參數,讀取指定數目的字節,並將它們存儲在指定的位置中,char gross[144]  cin.read(gross,144),一般與cout.write()一起用

  cin.gcount(),返回最后一個非格式化抽取方法讀取的字符數,意味着由get(),getline(),ignore(),read()方法讀取的字符會被統計,而不是>>

1     cout<<"輸入一段字符:";
2     cin.ignore(5,'\n');
3     char num[20];
4     cin.read(num,10);
5     cout<<"抽取的字符數:"<<cin.gcount()<<endl;
6     cout.write(num,10)<<endl;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM