C++程序7 :IO流與異常處理

2021-03-02 編程足跡

一、IO流基本操作

#include <iostream>

#include <iomanip>   //輸出流控制字符

#include <string>

using namespace std;

struct MM

{

string name;

int age;

int num;

};  

/*

    流:流是由若干字節組成的字節序列

         代表信息從源到目的的流動

         流中內容:可以是二進位;ASCII碼;或其他形式

         用類實現所有流操作---》流類體系結構

*/

int main()

{

cout << "ILoveyou" << endl;

int num;

cin >> num;

//輸出流對象:

//1.成員函數的使用方式

//字符和字符串

cout.put('A');

char cNum = 'C';

cout.put(cNum);

cout << endl;

char name[] = "女生";

cout.write(name,5);

//2.其他兩個輸出流對象 cerr;clog -->cout

int  size = 0;

if (size == 0)

cerr << "棧不能為空" << endl;   //表示錯誤輸出

clog << "一樣的效果" << endl;                  //表示錯誤輸出

//輸入流

//1.字符輸入

fflush(stdin);

cNum = cin.get();//輸入一個字符

cout << cNum << endl;

fflush(stdin);

cin.getline(name, 5);   //輸入一個字符串

cout << name << endl;

//流控制字符 等於C語言中的格式空字符

//1.包含頭文件 iomanip

bool bNum = false;

//boolalpha   //流控制字符

cout << boolalpha << bNum << endl;

struct MM array[3] = { "name1", 18, 1001, "name2", 28, 1002, "name3", 48, 1003 };

//設置寬度

//默認右對齊

cout << setiosflags(ios::left)<<setw(10) << "name"

<< setw(4) << "age"

<< setw(5) << "num" << endl;

for (int i = 0; i < 3; i++)

{

cout << setiosflags(ios::left) << setw(10) << array[i].name

<< setw(4) << array[i].age

<< setw(5) << array[i].num << endl;

}

//設置精度 :指有效位數,並不是小數位

cout << setprecision(3) << 343123.23 << endl;

cout << hex << 32 * 18 << endl;

cout.width(10);  //設置寬度

cout.setf(ios::right);

cout << name << endl;

system("pause");

return 0;

}

二、字符流

#include <iostream>

#include <sstream>

#include <string>

using namespace std;

int main()

{

//1.處理字符串

string info("ip地址: 192 168 12 1");

cout << info << endl;

//stringstream 構建對象

//stringstream 類名

//object: 對象名 標識符而已

stringstream object(info);//用info初始化字符流

//str();函數得到我們字符流對象中的字符串

cout << object.str() << endl;//通過字符流對象獲取字符流中內容

cout << "通過空格拆分每一部分:" << endl;

//把字符流當做是一次用戶的數據輸入,從字符流流向變量

string tempData;

cout << "字符流對象充當輸入的功能" << endl;

object >> tempData;  //等價於cin

//cin>>tempData;  鍵盤-->輸入流對象--->tempData;

//int num;

//cin >> num;//用戶輸入鍵盤 數據流到cin對象中,cin對象流到num中

//12 234 34 34

cout << tempData << endl;

int a[4];

for (int i = 0; i < 4; i++)

{

object >> a[i];

cout << a[i] << " "; 

}

cout << endl;

string score("12345");

stringstream strToInt(score);

int result = 0;

strToInt >> result;

cout << result << endl;

system("pause");

return 0;

}

三、文件流操作

#include <iostream>

#include <string>

#include <fstream>

#include <iomanip>

using namespace std;

/*

fstream: 類  可讀可寫

ifstream :read  只讀

ofstream :write 只寫

1.打開文件

1.1 定義一個文件對象

fstream file;

1.2 打開文件

file.open(char *fileURL,int mode);

mode:  //讀寫方式

ios::in 讀

ios::out 寫

ios::app 追加

注意點:組合方式:

ios::in|ios::out  位或

2.讀寫文件

2.1 流運算符來操作 >> <<

2.2 成員函數

write(char *dst,size_t size);

寫的首地址

寫多少個字節

read(char *dst,size_t size);

3.關閉文件

   file.close();

4.操作文件指針

//fseek

seekg(size_t length,int position)

ios::beg

ios::cur

ios::end

*/

struct MM

{

string name;

int age;

int num;

};

int main()

{

//流的方式操作文件

fstream file1;

file1.open("流運算符讀寫.txt", ios::out | ios::in | ios::trunc);

int num = 1001;

file1 << "ILoveyou" <<' '<<num<< endl;

file1.seekg(0, ios::beg);  //移動到開始位置

char str[10];

int result = 0;

file1 >> str>>result;

cout << str<<":"<<result << endl;

file1.close();

//通過成員函數去讀寫

struct MM array[3] = { "name1", 18, 1001, "name2", 28, 1002, "name3", 48, 1003 };

fstream fMM;

fMM.open("MM.txt", ios::out | ios::in | ios::trunc);

fMM.write((char *)&array[0], sizeof(struct MM) * 3);

fMM.seekg(0, ios::beg);

MM readInfo[3];

fMM.read((char *)&readInfo[0], sizeof(struct MM) * 3);

for (int i = 0; i < 3; i++)

{

cout << setiosflags(ios::left) <<

setw(6) << readInfo[i].name <<

setw(4) << readInfo[i].age <<

setw(5) << readInfo[i].num << endl;

}

fMM.close();

system("pause");

return 0;

}

四、異常處理

#include <iostream>

#include <string>

using namespace std;

/*

異常:什麼是異常?萬物即可是異常 包含錯誤

拋出異常:throw 可以拋出任何東西

捕獲異常:try   

處理異常:catch  根據捕獲的異常的類型去處理

注意:拋出的異常沒有被處理,會調用默認的abort函數終止程序

*/

void  print(int a, int b)

{

//以前做法:當前有問題當前解決

if (b == 0)

return;

printf("%d", a / b);

}

void printError(int a, int b)

{

if (b == 0)

throw b;

printf("%d", a / b);

}

void printError(int a)

{

throw  string("任何東西都是異常");

}

int main()

{

print(1, 0);

//{}必須存在

try

{

printError(2, 0);

printf("ILoveyou!");

}

catch (int)//

{

cout << "除數不能為0!" << endl;

}

catch (double)

{

cout << "double" << endl;

}

try

{

printError(12);

}

catch (string object)  //string object=拋出的內容

{

cout << object << endl;

}

try

{

printError(2, 0);

}

catch (...)

{

printf("任何東西都是異常!\n");

}

system("pause");

return 0;

}

五、自定義類型的異常

#include <iostream>

#include <string>

using namespace std;

class stackEmpty

{

public:

stackEmpty(string str = "棧為NULL") :str(str){}

void print()

{

cout << str << endl;

}

protected:

string str;

};

void pop(int size)

{

if (size == 0)

throw stackEmpty("棧為NULL,無法操作!");

}

//不存在的異常的函數

int Max(int a, int b) throw()

{

return a > b ? a : b;

}

int main()

{

try

{

pop(0);

}

catch (stackEmpty object)

{

object.print();

}

system("pause");

return 0;

}

六、C++庫中異常

#include<exception>

#include<string>

#include<iostream>

using namespace std;

/*

exception: 異常的基類

what方法用來列印相關異常的信息

//異常的派生類

bad_alloc   new的異常

out_of_range 溢出

runtime_error 運行時問題

range_error 

length_error

*/

int main()

{

try

{

int **pMomery = new int*[100000000];

for (int i = 0; i < 1000; i++)

{

pMomery[i] = new int[100000000];

}

}

catch (bad_alloc object)

{

cout << object.what() << endl;

}

int array[5] = { 1, 2, 3, 4, 5 };

int *p = &array[4];

//p[0]

//cout<<p[0]<<endl;

cout << p[-3] << endl;

system("pause");

return 0;

}

相關焦點

  • 在程序中如何正確地創建和銷毀軟體應用系統中文件IO流對象實例
    Unix作業系統之間在文件管理方面的不同點;並可以實現以相同的程序實現方式處理數據的流動(讀寫)、傳輸(網絡)等方面的功能實現。這些流類使用裝飾器(Decorator)設計模式,並允許在程序中可以動態地裝配流類(如需要一個具有緩衝的文件輸入流,則應當組合使用FileInputStream和BufferedInputStream兩個流類)。在java.io程序包中的各個流類的結構關係如下示圖所示。
  • C/C++程序運行時的異常處理
    如果對於這些錯誤沒有採取有效的防範措施,那麼往往會得不到正確的運行結果,程序不正常終止或嚴重的會出現死機現象。我們把程序運行時的錯誤統稱為異常,對異常處理稱為異常處理。C++中所提供的異常處理機制結構清晰,在一定程度上可以保證程序的健壯性。
  • 每日乾貨丨C++異常處理入門(try和catch)
    而第 8 行代碼則不同,at() 函數檢測到下標越界會拋出一個異常,這個異常可以由程式設計師處理,但是我們在代碼中並沒有處理,所以系統只能執行默認的操作,也即終止程序執行。捕獲異常我們可以藉助 C++ 異常機制來捕獲上面的異常,避免程序崩潰。捕獲異常的語法為:
  • 解析一下C++的異常處理
    本文轉載自【微信公眾號:羽林君,ID:Conscience_Remains】經微信公眾號授權轉載,如需轉載與原文作者聯繫總述在程序運行過程中經常會碰到一些問題,例如數組下標越界,除數為零等,這些錯誤不過能被發現處理,則我們的代碼很有可能會導致程序崩潰。
  • 選擇題 | C++輸入輸出和異常處理
    A.ifstreamB.fstreamC.ostreamD.cstdio4.執行以下程序:char *str;cin>>str;cout<<str;若輸入abcd  1234↙則輸出(D
  • c++ fstream + string 處理大數據
    /FileWriter,BufferedReader/BufferedWriter等類,詳見java讀寫文件(2)應用java的原因是java裡面的map非常靈活,eclipse編譯器更是給力,而且ctrl可以追蹤函數等,詳見java map的排序(3)應用java的另一個原因是java裡面的string類的字符串處理非常靈活,各種函數是應用盡有。
  • Java【IO系列】基礎篇—1. IO框架
    而到了java 1.1,為了與國際化進行接軌,在java io中添加了許多以字符(Unicode)為單位進行操作的類。在java io的稱呼中,我們經常會提到「輸入流」、「輸出流」等等概念。首先,什麼是流呢?所謂「流」,就是一種抽象的數據的總稱,它的本質是能夠進行傳輸。     a) 按照「流」的數據流向,可以將其化分為:輸入流和輸出流。
  • 【編碼】C++異常處理 - try,catch,throw,finally的用法
    在繼續之前,回顧一下使用結束處理程序的理由:• 簡化錯誤處理,因所有的清理工作都在一個位置並且保證被執行。• 提高程序的可讀性。• 使代碼更容易維護。• 如果使用得當,具有最小的系統開銷。異常處理程序異常是我們不希望有的事件。在編寫程序的時候,程式設計師不會想去存取一個無效的內存地址或用0來除一個數值。
  • Python程序的異常處理和檢測
    處理程序出現的異常在前面學習Python語言的過程中,你一定遇到了程序崩潰或因未解決的錯誤而終止的情況。你會看到Python解釋器向你提供的出錯信息,包括錯誤名稱、原因和發生錯誤的行號。這就是程序在執行過程中發生的異常。我們來看幾個Python程序異常的例子。
  • Android JNI中的異常處理 與Log日誌使用2步驟
    結果:JNI異常處理異常處理是java 程序設計中的重要功能,java 中 拋出一個異常,虛擬機停止執行代碼並且調用棧反向檢查能處理特定的異常類型處理程序代碼塊,叫做捕獲異常。所以要 就有了捕獲異常。結果:輸出實際就是 jni 中 new 了一個異常, 然後就捕獲,然後就處理,防止崩潰。這個demo 實際就是 通過jni 調用了 java 的 空異常類,獲取 異常類之後就 拋出異常, 拋出異常,之後就處理 異常。
  • Java程式設計師必備:異常的十個關鍵知識點
    Error表示編譯時或者系統錯誤,如虛擬機相關的錯誤,OutOfMemoryError等,error是無法處理的。Exception代碼異常,Java程式設計師關心的基類型通常是Exception。它能被程序本身可以處理,這也是它跟Error的區別。它可以分為RuntimeException(運行時異常)和CheckedException(可檢查的異常)。
  • Java 異常處理的 10 個良心建議!
    ");}try{ // do what you want }catch(Exception e){ log.info("你的程序有異常啦,{}",e);}反例中,並沒有把exception出來,到時候排查問題就不好查了啦,到底是SQl寫錯的異常還是IO異常,還是其他呢?
  • 異常處理的其他3個小技巧
    這是菜鳥學python的第35篇原創文章閱讀本文大概需要3分鐘        異常處理前面已經講了有3篇了,前面3篇文章基本把異常的主要內容都講了,想來想去還有一小塊遺漏了,今天我們就把這3點補上吧要點:1)主動拋出異常2)利用斷言發現問題3)如何處理多個異常
  • c++ fstream + string處理大數據
    (2)應用java的原因是java裡面的map非常靈活,eclipse編譯器更是給力,而且ctrl可以追蹤函數等,詳見java map的排序(3)應用java的另一個原因是java裡面的string類的字符串處理非常靈活,各種函數是應用盡有。
  • c++簡介及順序結構
    介紹Dev-C++是一個Windows環境下的一個適合於初學者使用的輕量級 C/C++ 集成開發環境(IDE),實現對c++程序的編輯、編譯、運行和調試等工作。2.2. 調整編輯器 3.2. 新建源程序
  • Python程序控制結構概述及異常處理
    程序的異常處理就是基礎程序控制結構的拓展。在分支結構原理的基礎上,Python增加了異常處理,使用try-except保留字。異常處理以程序是否異常為判斷條件,根據一段代碼執行的正確性進行程序邏輯選擇。例如在一段要求用戶輸入數字的程序中,用戶輸入了非數字字符,程序並不會因此停止,此時程序就是異常執行狀態。
  • php7異常與錯誤處理和自定義異常
    7.2版本異常與錯誤的概述什麼叫做異常?
  • C語言代碼中異常的處理機制
    C++的異常機制為我們提供了更好的解決方法。異常處理的基本思想是:當出現錯誤時拋出一個異常,希望它的調用者能捕獲並處理這個異常。如果調用者也不能處理這個異常,那麼異常會傳遞給上級調用,直到被捕獲處理為止。如果程序始終沒有處理這個異常,最終它會被傳到C++運行環境,運行環境捕獲後通常只是簡單地終止這個程序。
  • 夯實Java基礎系列16:一文讀懂Java IO流和常見面試題
    一個應用程式的輸入往往是另外一個應用程式的輸出那麼OutputStream流到底是一個輸出到目的地的流呢,還是一個產生輸出的流?InputStream流到底會不會輸出它的數據給讀取數據的程序呢?就我個人而言,在第一天學習Java IO的時候我就感覺到了一絲疑惑。為了消除這個疑惑,我試著給輸入和輸出起一些不一樣的別名,讓它們從概念上與數據的來源和數據的流向相聯繫。
  • c++的輸入與輸出
    c++輸入與輸出C++ 標準庫提供了一組豐富的輸入/輸出功能,本章將討論 C++ 編程中最基本和最常見的 I/O 操作。輸入輸出並不是c++語言的正式組成成分,c和c++沒有為輸入輸出提供專門的結構。在c語言中輸入輸出是通過調用scanf和printf 實現的,在c++中是通過調用流對象cin和cout實現的。