C++輸入輸出流

来源:http://www.cnblogs.com/baobao-meng/archive/2016/06/06/5565111.html
-Advertisement-
Play Games

輸入輸出流 1. 用控制符輸出格式,例: 控制符用法列表如下: 2. 用流對象cout中用於控制輸出格式的成員函數來控制輸出格式 例如: cout.setf(iso::showbase) cout.setf(iOS::oct) cout.width(10) cout.setf(ios::intern ...


輸入輸出流

1. 用控制符輸出格式,例:

 

 1 #include <iostream>
 2 #include <iomanip>//利用控制符輸出必須包含iomanip頭文件
 3 using namespace std;
 4 int main()
 5 {int a;
 6 cout<<"input a:";
 7 cin>>a;
 8 cout<<"dec:"<<dec<<a<<endl;  //以十進位輸出
 9 cout<<"hex:"<<hex<<a<<endl;  //十六進位
10 cout<<"oct:"<<setbase(8)<<a<<endl; //八進位
11 char *pt="China";
12 cout<<setw(10)<<pt<<endl; //寬度為10,China前補上5個空格
13 cout<<setfill('*')<<setw(10)<<pt<<endl; //China前補上5個*
14 double pi=22.0/7.0;
15 cout<<setiosflags(ios::scientific)<<setprecision(8);//科學記數法,8位小數
16 cout<<"pi="<<pi<<endl;    //輸出pi
17 cout<<"pi="<<setprecision(4)<<pi<<endl;              //改為4位小數
18 cout<<"pi="<<setiosflags(ios::fixed)<<pi<<endl;//去掉科學記數法
19 return 0;
20 }

 

 

控制符用法列表如下:

 

2. 用流對象cout中用於控制輸出格式的成員函數來控制輸出格式

例如:

cout.setf(iso::showbase)

cout.setf(iOS::oct)

cout.width(10)

cout.setf(ios::internal | ios::showpos)

等等,其中參數iso::showbase屬於格式標誌,是在類ios中定義的枚舉值。因為用流控製成員函數沒有控制符使用方便,所以一般不常用。

 

3. put函數(cout對象的成員函數)

作用:輸出單個字元,例如:

cout.put(‘a’); //等價於cout.put(97),97為a的ASCII碼

cout.put(71).put(79).put(79).put(68).put(‘\n’);//連續輸出字元GOOD

將字元串“BASIC”反序輸出:

 1 #include <iostream>  
 2 using namespace std;  
 3 int main( )  
 4 { 
 5     char *a="BASIC";  
 6     for(int i=4;i>=0;i--)  
 7         cout.put(*(a+i));  
 8     cout.put('\n');  
 9     return 0;  
10 }  

 

也可以用C語言的格式:將上面的cout.put()改成putchar()

 

4. cin.get()提取一個字元,類似於C語言中的getchar(),但是它可以有3個參數:

cin.get(字元數組,字元個數n,終止字元)

例如:cin.get(ch, 10, ‘\n’); cout<<ch<<endl;

get函數中第三個參數可以省略,此時預設為’\n’。下麵兩行等價:

cin.get(ch, 10, ‘\n’);

cin.get(ch, 10);

終止字元也可以用其他字元,例如:

cin.get(ch,10,’x’);

5. cin.getline用於輸入一個字元串

用法:cin.getline(char*,int,char),ENTER來結束輸入,例如:

 1 #include<iostream>  
 2 using namespace std;  
 3 int main()  
 4 {  
 5     const int ArSize = 20;  
 6     char name[ArSize];  
 7     char dessert[ArSize];  
 8   
 9     cout<<"Enter your name:\n";  
10     cin.getline(name,ArSize);  
11     cout<<"Enter your favorite dessert:\n";  
12     cin.getline(dessert,ArSize);  
13     cout<<"I have some delicious "<<dessert;  
14     cout<<" for you, "<<name<<".\n";  
15     return 0;  
16 }  

 

cin<<與cin.getline()的區別:用“cin<<”讀數據時以空白字元(空格、tab、回車)作為終止標誌,而用cin.getline()可以讀入一系列字元,包括空格。例如:

char c[30];//輸入I’m a good boy !

cin>>c;// c只能得到第一個空格前的I’m

cin.getline(c);//c可以得到整句I’m a good boy !

 

6. eof函數

eof是end of file的縮寫,表示“文件結束”,eof函數值為非零表示真,否則為0表示假。例如:

 1 #include <iostream>  
 2 using namespace std;  
 3 int main( )  
 4 {  
 5     char c;  
 6   
 7     while (!cin.eof())  
 8     {  
 9         if( (c=cin.get()) != ' ')  
10             cout.put(c);  
11     }  
12     return 0;  
13 }  

 

當輸入Ctrl+Z時,cin.eof()就為真,!cin.eof()則為假,所以結束while迴圈。

 

7. cin.peek()函數和cin.putback()函數

用法見下麵程式的註釋:

 1 #include <iostream>  
 2 using namespace std;  
 3 int main( )  
 4 {  
 5     char c[30];  
 6     char w;  
 7     cin.getline(c, 30, '^');//輸入I am a cool boy !^'m bad girl.^  
 8     w=cin.peek();//獲取當前指針(指向^)的下一個字元(即’)  
 9     cout.put(w).put('\n');  
10     cin.putback(c[0]);//獲取前面get或者getline中的一個字元,插入到當前字元前(即w前)  
11     cin.getline(c, 30, '^');  
12     cout<<c<<endl;  
13     return 0;  
14 }  

 

即,我們可以用cin.peek()函數來獲取當前輸入流指針的當前指向;可以用cin.putback()來獲取前面get或getline函數輸入的內容中的一個字元,並插入到當前流指針的前面。

 

8. cin.ignore()函數

用法cin.ignore(5, ‘A’); //從當前指針位置(不包括當前指針)開始,忽略後面cin輸入的5個字元,或者遇到字元’A’就不再往後跳了(‘A’會被跳過)。

預設寫作:cin.ignore(),相當於cin.ignore(1, EOF),EOF代表文件結束符

例如: 

 1 #include <iostream>  
 2 using namespace std;  
 3 int main( )  
 4 {  
 5     char c[30];  
 6     cin.getline(c, 30, '^');//輸入I am a cool boy !^123I'm bad girl.^I’m smart.  
 7     cout<<"The first part is: "<<c<<endl;  
 8     cin.ignore(3);//忽略掉^後面的1233個字元  
 9     cin.getline(c, 30, '^');  
10     cout<<"The second part is: "<<c<<endl;  
11     return 0;  
12 }  


9.文件

(1)ASCII文件(類名ifstream、ofstream和fstream,存入是out,讀取是in)

a. 存入文件

ofstream outfile;

outfile.open("f1.dat",ios::out); // ios::out(格式標誌)是預設的,故也可以省略

上面兩行等價於:

ofstream outfile("f1.dat",ios::out);

現在可以用outfile對象來存入數據了:

              cin>>a[i];

              outfile<<a[i]<<" ";//每讀入一個整數就輸出到磁碟文件

用完記得,關閉文件:

       outfile.close();

文件輸入輸出格式標誌如下:

 

完整實例:

 1 /*將鍵盤輸入的數據存入文件中*/  
 2 #include <fstream>  
 3 #include <iostream>  
 4 using namespace std;  
 5 int main( )  
 6 {  
 7     int a[10];  
 8     ofstream outfile("f1.dat",ios::out);   
 9     if(!outfile)  
10     {  
11         cerr<<"open error!"<<endl;  
12         exit(1);  
13     }  
14     cout<<"enter 10 integer numbers:"<<endl;  
15     for(int i=0;i<10;i++)  
16     {  
17         cin>>a[i];  
18         outfile<<a[i]<<" ";//每讀入一個整數就輸出到磁碟文件  
19     }  
20     outfile.close();//記住關閉文件  
21     return 0;  
22 }  

 

生產的f1.dat文件可以用記事本打開,也可以在DOS下用TYPE命令打開:

C:\Documents and Settings>D:     //直接輸入盤符,切換到D盤

D:\>cd 001\mycpp                //用cd命令切換到文件目錄

D:\ 001\mycpp>type f1.dat    //用TYPE命令查看dat文件

2 5 6 8 7 9 5 6 4 10

 

b. 讀取文件,例:

和存入文件差不多:infile("f1.dat",ios::in),infile>>a[i],infile.close()

實例如下:

 1 /*將文件中的數據在屏幕中顯示*/  
 2 #include <fstream>  
 3 #include <iostream>  
 4 using namespace std;  
 5 int main( )  
 6 {  
 7     int a[10],max,i,order;  
 8     ifstream infile("f1.dat",ios::in);//打開磁碟文件  
 9     if(!infile)  
10     {  
11         cerr<<"open error!"<<endl;  
12         exit(1);  
13     }  
14     for(i=0;i<10;i++)  
15     {  
16         infile>>a[i];//從文件中讀入整數,存到a[i]中  
17         cout<<a[i]<<" ";  
18     }  
19     cout<<endl;  
20     max=a[0];  
21     order=0;  
22     for(i=1; i<10; i++)//找出最大的數及下標  
23     {  
24         if(a[i]>max)  
25         {  
26             max=a[i];  
27             order=i;  
28         }  
29     }  
30     cout<<"max="<<max<<endl<<"order="<<order<<endl;  
31     infile.close();//記住關閉文件  
32     return 0;  
33 }  

 


編一個專門讀取dat文件內容的程式:

 1 #include <fstream>  
 2 #include <iostream>  
 3 using namespace std;  
 4 void display_dat(char *filename)  
 5 {  
 6     ifstream infile(filename, ios::in);  
 7     if(!infile)  
 8     {  
 9         cerr<<"open error!"<<endl;  
10         exit(1);  
11     }  
12     char ch;  
13     while (infile.get(ch))  
14     {  
15         cout.put(ch);  
16     }  
17     cout<<endl;  
18     infile.close();  
19 }  
20   
21 int main( )  
22 {  
23     display_dat("f1.dat");//相對目錄  
24     return 0;  
25 }  

 

(2)二進位文件(類名為ifstream、ofstream和fstream,與ASCII用到的類相同)

成員函數read和write,原型如下:

istream & read(char * buffer, int len);//讀取

ostream & write(const char * buffer, int len);//存入

兩個參數:char指針指向要讀寫的對象,len代表讀寫的位元組數。用法如下:

outfile.write((char *)&stud[i], sizeof(stud[0]));

iofile.read((char *)&stud[i], sizeof(stud[0]));

註意原型聲明中類型為字元指針型,傳遞時必須用字元指針(p)或者字元類型數據的地址(&s),只能將相同類型的指針或者地址賦值給指針。

其他成員函數,例如:

infile.seekg(100);//g是get的意思,代表輸入。文件指針向前移動50個位元組

infile.seekg(-50,ios::cur);//輸入文件指針從當前位置後移50位元組

outfile.seekp(-70,ios::end);//輸出文件指針從文件尾倒退70位元組

 

完整實例:

 1 /*將數據存入文件*/  
 2 #include <fstream>  
 3 #include <iostream>  
 4 using namespace std;  
 5 struct student  
 6 {  
 7     char name[20];  
 8     int num;  
 9     int age;  
10     char sex;  
11 };  
12 int main( )  
13 {  
14     student stud[3]={"Li",1001,18,'f',"Fun",1002,19,'m',"Wang",1004,17,'f'};   
15     ofstream outfile("stud.dat",ios::binary);//以二進位形式輸入數據到文件  
16     if(!outfile)  
17     {  
18         cerr<<"open error!"<<endl;  
19         abort( );  
20     }  
21     for(int i=0;i<3;i++)  
22     {  
23         outfile.write((char*)&stud[i], sizeof(stud[i]));//強制數據類型轉換  
24     }  
25     outfile.close( );  
26     return 0;  
27 }  

 


例子:訪問文件中的任何一個位置,並頻繁讀寫

要求:有5個學生的數據,把它們存到磁碟文件中,將磁碟文件中的第1,3,5個學生數據讀入程式,並顯示出來;將第3個學生的數據修改後存回磁碟文件中的原有位置;從磁碟文件讀入修改後的5個學生的數據並顯示出來。程式如下:

 1 #include <fstream>  
 2 #include <iostream>  
 3 using namespace std;  
 4 struct student  
 5 {  
 6     int num;  
 7     char name[20];  
 8     float score;  
 9 };  
10   
11 int main( )  
12 {  
13     student stud[5]={1001,"Li",85,1002,"Fun",97.5,1004,"Wang",54,  
14         1006,"Tan",76.5,1010,"ling",96};  
15     fstream iofile("stud.dat",ios::in|ios::out|ios::binary);  
16     //用fstream類定義輸入輸出二進位文件流對象iofile,註意名字iofile是自定義的  
17     if(!iofile)  
18     {     
19         cerr<<"open error!"<<endl;    
20         abort( );  
21     }  
22     for(int i=0;i<5;i++)//向磁碟文件輸出5個學生的數據  
23     {  
24         iofile.write((char *)&stud[i], sizeof(stud[i]));  
25     }  
26     student stud1[5];                  //用來存放從磁碟文件讀入的數據  
27     for(i=0; i<5; i=i+2)  
28     {  
29         iofile.seekg(i*sizeof(stud[i]),ios::beg);  //定位於第0,2,4學生數據開頭  
30         iofile.read((char *)&stud1[i/2], sizeof(stud1[0]));   
31         //先後讀入3個學生的數據,存放在stud1[0],stud[1]和stud[2]中  
32         cout<<stud1[i/2].num<<" "<<stud1[i/2].name<<" "<<stud1[i/2].score<<endl;  
33         //輸出stud1[0],stud[1]和stud[2]各成員的值  
34     }  
35     cout<<endl;  
36     stud[2].num=1012;                         //修改第3個學生(序號為2)的數據  
37     strcpy(stud[2].name,"Wu");  
38     stud[2].score=60;  
39     iofile.seekp(2*sizeof(stud[0]),ios::beg);   //定位於第3個學生數據的開頭  
40     iofile.write((char *)&stud[2],sizeof(stud[2])); //更新第3個學生數據  
41     iofile.seekg(0,ios::beg);                       //重新定位於文件開頭  
42     for(i=0;i<5;i++)  
43     {  
44         iofile.read((char *)&stud[i],sizeof(stud[i]));  //讀入5個學生的數據  
45         cout<<stud[i].num<<" "<<stud[i].name<<" "<<stud[i].score<<endl;  
46     }  
47     iofile.close( );  
48     return 0;  
49 }  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • https://github.com/corydolphin/flask-cors/blob/master/examples/app_based_example.py ...
  • Here is my directory structure: -/path/to/folder/run.py -|app -|__init__.py -|views.py -|templates -|static Contents of /path/to/folder/run.py if __na ...
  • python3批量刪除豆瓣分組下的好友 ...
  • 寫了一個簡單的JMS例子,之所以使用JNDI 是出於通用性考慮,該例子使用JMS規範提供的通用介面,沒有使用具體JMS提供者的介面,這樣可以保證我們編寫的程式適用於任何一種JMS實現(ActiveMQ、HornetQ...)。 什麼是JNDI JNDI(Java Naming and Directo ...
  • 兩個線程操作同一個資源,比如,輸入和輸出,操作同一個對象,此時兩個線程會爭奪cpu的執行權,隨機的進行切換。我們想實現先輸入再輸出,順序的執行 目標對象定義一個標記欄位,進行判斷,wait()和notify()方法 wait()方法,線程會處於等待狀態,等待的線程位於記憶體中的線程池中 notify( ...
  • 對自己定義的類規範化一下,事件和圖形化組件分離出來 定義一個類FrameDemo 定義成員屬性Frame frame 定義成員屬性Botton 定義構造方法FrameDemo() 定義初始化方法init() 初始化方法中,new出來Frame(),參數:String的窗體名稱 調用Frame對象的s ...
  • switch允許對一個標量(表達式)的多個可能結果做選擇。 語法: 系統計算expr的值,根據計算結果(result1、result2等)來選擇下麵對應執行語句,如果所有的case結果都不符合,則會執行default里的語句。 例子: 運行 提示 可以有多個 case 條件判斷 case 後面結果也 ...
  • 我們在中級篇中學會瞭如何進行反向解析,但是有這樣一個問題,在為 url 命名的時候,名字不能重覆,否則會導致各種各樣的問題。在 url 還少的時候保證不重名還是比較簡單的,但是 url 多起來以後就比較難了。為瞭解決這樣的問題,可以在 url 中加一個首碼。例如,我有一個 url 的名字叫做 'co ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...