C++技術點積累(6)——異常處理、輸入和輸出流
1、異常處理機制:
1、異常是一種程式控制機制,與函式機制獨立和互補
函式是一種以棧結構展開的上下函式銜接的程式控制系統,異常是另一種控制結構,它依附於棧結構,卻可以同時設定多個異常型別作為網捕條件,從而以型別匹配在棧機制中跳躍回饋.
2、異常設計目的:
棧機制是一種高度節律性控制機制,面向物件程式設計卻要求物件之間有方向、有目的的控制傳動,從一開始,異常就是衝著改變程式控制結構,以適應面向物件程式更有效地工作這個主題,而不是僅為了進行錯誤處理。
1) 若有異常則通過throw操作建立一個異常物件並拋擲。
2) 將可能丟擲異常的程式段嵌在try塊之中。控制通過正常的順序執行到達try語句,然後執行
3)如果在保護段執行期間沒有引起異常,那麼跟在try塊後的catch子句就不執行。
4)catch子句按其在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...in、for...of、異常處理、函數、事件、JS選擇器、JS操作頁面樣式
結束 建議 prop map、set -c 表單元素 tle form collect JavaScript基礎操作 一、分支結構 1、if語句 if 基礎語法 if (條件表達式) { 代碼塊; } // 當條件表達式結果為true,會執行代碼塊;反之不執行