1. 程式人生 > >C++技術點積累(6)——異常處理、輸入和輸出流

C++技術點積累(6)——異常處理、輸入和輸出流

1、異常處理機制:

1、異常是一種程式控制機制,與函式機制獨立和互補

函式是一種以棧結構展開的上下函式銜接的程式控制系統,異常是另一種控制結構,它依附於棧結構,卻可以同時設定多個異常型別作為網捕條件,從而以型別匹配在棧機制中跳躍回饋.

2、異常設計目的:

棧機制是一種高度節律性控制機制,面向物件程式設計卻要求物件之間有方向、有目的的控制傳動,從一開始,異常就是衝著改變程式控制結構,以適應面向物件程式更有效地工作這個主題,而不是僅為了進行錯誤處理。

1) 若有異常則通過throw操作建立一個異常物件並拋擲。

2) 將可能丟擲異常的程式段嵌在try塊之中。控制通過正常的順序執行到達try語句,然後執行

try塊內的保護段。

3)如果在保護段執行期間沒有引起異常,那麼跟在try塊後的catch子句就不執行。

4catch子句按其在try塊後出現的順序被檢查。匹配的catch子句將捕獲並處理異常(或繼續拋擲異常)。

5) 如果匹配的處理器未找到,則執行函式terminate將被自動呼叫,其預設功能是呼叫abort終止程式。

6處理不了的異常,可以在catch的最後一個分支,使用throw語法,向上扔。

7)    C++的異常處理機制使得異常的引發異常的處理不必在同一個函式中,這樣底層的函式可以著重解決具體問題,而不必過多的考慮異常的處理。上層呼叫者可以在適當的位置設計對不同型別異常的處理。

        異常捕捉嚴格按照型別匹配,異常捕捉的型別匹配之苛刻程度可以和模板的型別匹配媲美,它不允許相容型別的隱式轉換。


2、輸入和輸出流:
                  

1)標準輸入流物件cin:
        cin.get()    //一次只能讀取一個字元
        cin.get(一個引數)     //讀一個字元
        cin.get(三個引數)     //可以讀字串
        cin.getline()
        cin.ignore()
        cin.peek()
        cin.putback()

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

//get()
void main09()
{
	char ch;
	while ((ch = cin.get()) != EOF)   //Ctrl+z終止輸入
	{
		cout << ch << endl;
	}
	system("pause");
}

void main73()
{
	char a, b, c;

	cout << "cin.get(a) 如果緩衝區沒有資料,則程式阻塞 \n";
	cin.get(a);
	cin.get(b);
	cin.get(c);

	cout << a << b << c << "因為緩衝區有資料,程式不會阻塞\n";

	cin.get(a).get(b).get(c);

	cout << a << b << c;

	system("pause");
}

//getline函式可以接受 空格
void main089()
{
	char buf1[256];
	char buf2[256];

	cout << "請輸入一個字串 含有多個空格 aa bb cc dd\n";

	cin >> buf1;             // 遇見空格停止接受 資料

	cin.getline(buf2, 256);  //字串剛開始的空格,最後的空格都會讀入,回車結束輸入

	cout << "buf1:" << buf1 << ",buf2:" << buf2 << "結束" << endl;
	system("pause");
}

void main75()
{
	char buf1[256];
	char buf2[256];

	cout << "請輸入一個字串 含有多個空格aa  bbccdd\n";

	cin >> buf1;
	cin.ignore(2);    //cin.ignore()忽略後面的兩個空格
	int myint = cin.peek();    //cin.peek()看一把
	cout << "myint:" << myint << endl;

	cin.getline(buf2, 256);

	cout << "buf1:" << buf1 << "\nbuf2:" << buf2 << endl;
	system("pause");
}

//案例:輸入的整數和字串分開處理
int main()
{
	cout << "Please, enter a number or a word: ";
	char c = std::cin.get();

	if ((c >= '0') && (c <= '9')) //輸入的整數和字串 分開處理
	{
		int n; //整數不可能 中間有空格 使用cin >>n
		cin.putback(c);
		cin >> n;
		cout << "You entered a number: " << n << '\n';
	}
	else
	{
		string str;
		cin.putback(c);
		//cin.getline(str);
		getline(cin, str); // //字串 中間可能有空格 使用 cin.getline();
		cout << "You entered a word: " << str << '\n';
	}
	system("pause");
	return 0;
}

2)標準輸出流物件cout:

       cout.flush()
       cout.put()
       cout.write()
       cout.width()
       cout.fill()
       cout.setf(標記)
#include <iostream>
using namespace std;
#include <iomanip>

/*
manipulator(操作符、控制符)
flush
endl
oct
dec
hex
setbase
setw
setfill
setprecision
*/

void main011()
{
	cout << "hello" << endl;
	cout.put('h').put('e').put('l');
	char *p = "hello itcast";

	cout.write(p, strlen(p)) << endl;
	cout.write(p, strlen(p) - 4) << endl;  //設定輸出的長度
	cout.write(p, strlen(p) + 4) << endl;  //危險!
	system("pause");
	return;
}

void main022()
{
	//使用類成員函式
	cout << "<start>";
	cout.width(30);  //設定輸出的長度
	cout.fill('*');  //設定填充效果
	cout.setf(ios::showbase);   //#include <iomanip>  //顯示基準0x
	//cout.setf(ios::internal); //設定 隔離
	cout << hex << 123 << "<End>\n";  //hex十六進位制輸出

	cout << endl << endl;

	//使用控制符
	cout << "<Start>"
		<< setw(30)
		<< setfill('*')
		<< setiosflags(ios::showbase) //基數
		<< setiosflags(ios::internal) //設定 隔離
		<< hex
		<< 123
		<< "<End>\n"
		<< endl;
}

int main033()
{
	int a;
	cout << "input a:";
	cin >> a;
	cout << "dec:" << dec << a << endl;   //以十進位制形式輸出整數
	cout << "hex:" << hex << a << endl;   //以十六進位制形式輸出整數a
	cout << "oct:" << setbase(8) << a << endl;  //以八進位制形式輸出整數a
	char *pt = "China";  
	cout << setw(10) << pt << endl;  //指定域寬為,輸出字串
	cout << setfill('*') << setw(10) << pt << endl;   //指定域寬,輸出字串,空白處以'*'填充
	double pi = 22.0 / 7.0;  //計算pi值
	//按指數形式輸出,8位小數
	cout << setiosflags(ios::scientific) << setprecision(8);
	cout << "pi=" << pi << endl; //輸出pi值
	cout << "pi=" << setprecision(4) << pi << endl;  //改為位小數
	cout << "pi=" << setiosflags(ios::fixed) << pi << endl;   //改為小數形式輸出
	system("pause");
	return 0;
}

int main044()
{
	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;
	system("pause");
	return 0;
}

3)檔案流類和檔案流物件

檔案流物件和指定的磁碟檔案建立關聯,以便使檔案流流向指定的磁碟檔案。

ofstream類的預設建構函式原形為:
ofstream::ofstream(constchar *filename,  int mode = ios::out,  int penprot = filebuf::openprot);
     filename:  要開啟的檔名
     mode:    要開啟檔案的方式
     prot:    開啟檔案的屬性
在定義ifstream和ofstream類物件的時候,我們也可以不指定檔案。以後可以通過成員函式open()顯式的把一個檔案連線到一個類物件上。
     ofstream myfile;      myfile.open("c:\\1.txt",ios::out|ios::app,0); 
     ifstream  myfile;      myfile.open("c:\\1.txt",ios::in,0); 
     fstream   myfile;      myfile.open("c:\\1.txt",ios::out|ios::app,0);      //同時讀寫

mode屬性表
ios::app   以追加的方式開啟檔案
ios::ate   檔案開啟後定位到檔案尾,ios:app就包含有此屬性
ios::binary  以二進位制方式開啟檔案,預設的方式是文字方式
ios::in  檔案以輸入方式開啟
ios::out  檔案以輸出方式開啟
ios::trunc  如果檔案存在,把檔案長度設為0

可以用“|”把以上屬性連線起來,如ios::out | ios::binary。

openprot屬性表
屬性      含義
0      普通檔案,開啟訪問
1      只讀檔案
2      隱含檔案
4      系統檔案

A.C++對ASCII檔案的讀寫操作   ——http://blog.csdn.net/songshimvp1/article/details/48049135
       如果檔案的每一個位元組中均以ASCII程式碼形式存放資料,即一個位元組存放一個字元,這個檔案就是ASCII檔案(或稱字元檔案、文字檔案)。程式可以從ASCII檔案中讀入若干個字元,也可以向它輸出一些字元。

B.C++對二進位制檔案的讀寫操作 ——http://blog.csdn.net/songshimvp1/article/details/48049135 
       二進位制檔案不是以ASCII程式碼存放資料的,它將記憶體中資料儲存形式不加轉換地傳送到磁碟檔案,因此它又稱為記憶體資料的映像檔案。因為檔案中的資訊不是字元資料,而是位元組中的二進位制形式的資訊,因此它又稱為位元組檔案。
       對二進位制檔案的操作也需要先開啟檔案,用完後要關閉檔案。在開啟時要用ios::binary指定為以二進位制形式傳送和儲存。二進位制檔案除了可以作為輸入檔案或輸出檔案外,還可以是既能輸入又能輸出的檔案。這是和ASCII檔案不同的地方。
       對二進位制檔案的讀寫主要用istream類的成員函式read和write來實現。這兩個成員函式的原型為:
             istream&     read(char *buffer,int len);
             ostream&    write(const char * buffer,int len);
       字元指標buffer指向記憶體中一段儲存空間。len是讀寫的位元組數。呼叫的方式為:
             fout. write(p1,50);
             fin. read(p2,30);

相關推薦

C++技術積累(6)——異常處理輸入輸出

1、異常處理機制: 1、異常是一種程式控制機制,與函式機制獨立和互補 函式是一種以棧結構展開的上下函式銜接的程式控制系統,異常是另一種控制結構,它依附於棧結構,卻可以同時設定多個異常型別作為網捕條件,從而以型別匹配在棧機制中跳躍回饋. 2、異常設計目的: 棧機制是一種高度節

6.C語言巨集定義與預處理函式函式庫》

《6.C語言巨集定義與預處理、函式和函式庫》 第一部分、章節目錄 4.6.1.C語言預處理理論 4.6.2.C語言預處理程式碼實戰 4.6.3.巨集定義1 4.6.4.巨集定義2 4.6.5.函式的本質 4.6.6.函式的基本使用 4.6.7.遞迴函式 4.6.8.函式庫 4.6.9.字

C++輸入輸出

一 I/O流的概念和流類庫的結構 1 I/O流的概念和流類庫的結構 1)標準裝置的輸入和輸出。即從鍵盤輸入資料,輸出到顯示器螢幕。標準輸入輸出 2)標準裝置的輸入和輸出。即從鍵盤輸入資料,輸出到顯示器螢幕。標準輸入輸出 3)記憶體中指定的空間進行輸入和輸出,稱為字串輸入輸出,簡稱串I

c++類比python 學習(遍歷列表異常處理丟擲異常

遍歷列表 for i in list: print i c++11 的特性 1、這種情況是改變i的值並不改變vector,相當於只讀型別,淺拷貝 for(int i:vector) //

C#進階系列——WebApi 異常處理解決方案(轉)

機制 輸出 ges 如果 但是 rom lba slist 解決 出處:http://www.cnblogs.com/landeanfen/p/5363846.html 閱讀目錄 一、使用異常篩選器捕獲所有異常 二、HttpResponseException自

異常處理拋出異常

依次 管理員 images 視圖 obj 聯系 運行時異常 nco 獲取 一、異常處理機制 Java 應用程序中,異常處理機制為:拋出異常,捕捉異常。 拋出異常:當一個方法出現錯誤引發異常時,方法創建異常對象並交付運行時系統,異常對象中包含了異常類型和

Python之操作Excel異常處理網絡編程

方法 ssi request 對象的引用 深拷貝 code text 索引超出 編號 知識補充: 1.falsk模塊中一些方法總結 import flask from flask import request,jsonify server = flask.Flask(_

Python開發基礎-Day23try異常處理socket套接字基礎1

序列 env rup indexer tin accep 依次 cli 建立 異常處理 錯誤 程序裏的錯誤一般分為兩種:   1、語法錯誤,這種錯誤,根本過不了python解釋器的語法檢測,必須在程序執行前就改正   2、邏輯錯誤,人為造成的錯誤,如數據類型錯誤、調用方法錯

Python開發基礎----異常處理socket套接字基礎1

括號 return 提示 傳輸層 init and prot back vision 異常處理 錯誤 程序裏的錯誤一般分為兩種:   1、語法錯誤,這種錯誤,根本過不了python解釋器的語法檢測,必須在程序執行前就改正   2、邏輯錯誤,人為造成的錯誤,如數據類型錯誤、調

Python基礎知識進階(五---2)----程序基本結構簡單分支異常處理三大實例分析基本循環結構通用循環構造方法死循環嵌套循環布爾表達式

方法 算法 嵌套 構造方法 決策樹 輸入 繼續 實例 控制 上一篇隨筆寫的內容有點多了,決定分成兩節,不然自己看的時候也頭疼。 三者最大實例: 分支結構可以改變程序的控制流,算法不再是單調的一步步順序執行。     假設:以找出三個數字中最大者的程序設計為例。      

七天學會ASP.NET MVC (六)——線程問題異常處理自定義URL

d+ mit nes 如何 bus blog edi default 繼續 本節又帶了一些常用的,卻很難理解的問題,本節從文件上傳功能的實現引出了線程使用,介紹了線程饑餓的解決方法,異常處理方法,了解RouteTable自定義路徑 。 目錄 實驗27—

10.異常處理自定義異常斷言

類型 出現 color spa 同時 就是 put exception valid 什麽是異常: 當程序遭遇某些非正常問題的時候就會拋出異常:比如int()只能處理能轉化成int的對象,如果傳入一個不能轉化的對象就會報錯並拋出異常 常用的異常有: ValueError :

C語言異常處理之 setjmp()longjmp()

divide font 變量 bsp ron 否則 sharp highlight == 異常處理之除0情況 相信大家處理除0時,都會通過函數,然後判斷除數是否為0,代碼如下所示: double divide(doublea,double b) { co

異常處理網絡編程

stop buffer 子類 erro 疑問 路徑問題 lap one python代碼 異常處理 1、什麽是異常 異常是錯誤發出的信號 程序一旦出錯,如果程序沒有相應的處理機制,那麽該錯誤就會產生異常拋出來,程序就會運行終止 異常主要分為三個部分: 1、異常的追蹤信息 2

異常處理模塊包時間模塊subprocess(調用shell命令)

模塊異常處理 捕捉異常可以使用try/except語句。try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息並處理。如果你不想在異常發生時結束你的程序,只需在try裏捕獲它。 更多的異常關鍵字:http://www.runoob.com/python/python-exce

接口開發異常處理網絡編程

表示 技術 必須 pwd 錯誤 有一個 申請 網絡編程 encode 一.接口開發,有依賴關系的接口開發 1.場景:用戶登錄後發表文章 用戶登錄接口代碼示例: import flask,time,json from lib import tools server = f

java基礎 第十二章(異常處理工具類集合)

重寫 trac com int 出現異常 sta 順序存儲 空指針異常 處理 一、異常處理 1.兩種異常: (1)程序員自身問題(運行時異常) (2)外界問題(可控異常) 2.兩種異常的詳細說明 (1)運行時異常

Spring MVC溫故而知新 – 參數綁定轉發與重定向異常處理攔截器

單獨 UC exclude require 加載 pre buffered nts 節點 請求參數綁定 當用戶發送請求時,根據Spring MVC的請求處理流程,前端控制器會請求處理器映射器返回一個處理器,然後請求處理器適配器之心相應的處理器,此時處理器映射器會調用Spr

c++基礎(十三)——異常處理

err fun runt splay cat c++基礎 自動 所有 參數 異常處理的思想與程序實現 異常處理的基本思想 異常處理的語法 異常接口聲明 一個函數顯式聲明可能拋出的異常,有利於函數的調用者為異常處理做好準備 可以在函數的聲明中列出這個函數可能拋擲的所有異

前端(十二)—— JavaScript基礎操作:if語句for循環while循環for...infor...of異常處理函數事件JS選擇器JS操作頁面樣式

結束 建議 prop map、set -c 表單元素 tle form collect JavaScript基礎操作 一、分支結構 1、if語句 if 基礎語法 if (條件表達式) { 代碼塊; } // 當條件表達式結果為true,會執行代碼塊;反之不執行