1. 程式人生 > >C++ Primer Plus學習筆記(四)(輸入輸出錯誤處理、檔案輸入輸出)

C++ Primer Plus學習筆記(四)(輸入輸出錯誤處理、檔案輸入輸出)

1. 字元函式庫 cctype

cctype是字元函式庫,用於判斷是否為大寫字母、標點符號、空格等

#include<cctype>
char ch;
isalpha(ch)//如果ch是字母,返回非零值,否則返回0
ispunct(ch)//如果ch是標點符號,返回非零值
isdigit(ch)//判斷是否為數字
isa1num(ch)//數字或者字母
ch = tolower(ch)//轉換為小寫,如果為int值,先轉換為char再進行相應轉換。如 int ch;ch=tolower(ch),輸入67,輸出ch為99
ch = toupper(ch)//轉換為小寫

2. 錯誤輸入

2.1 基本介紹

採用cin方式進行輸入時,會發生型別不匹配的錯誤輸入,會報錯。

int n;
cin >> n;

例如,cin獲取int值,如果輸入字母值,會發生如下錯誤:
(1)n的值不變
(2)不匹配的輸入會存在輸入佇列中‘
(3)cin物件的一個錯誤標記會被設定//必須重置該標記才可以繼續輸入
(4)cin呼叫的方法會返回false
注:錯誤輸入和檔案尾都會導致cin返回false,需要用cin.clear()進行清除。

    int num[10] = { 0 };
    int value;
    for (int i = 0; i < 10; )
    {
        if
(cin >> value) { num[i] = value; i++; } else { cin.clear();//清除標記 cin.get();//讀取輸出錯誤型別的值,因其還在緩衝佇列中 cout << "input the right num" << endl; continue; } }

2.2 區別檔案尾和型別不匹配

如上所述,檔案尾和型別不匹配都會導致cin返回false(檔案物件方法返回false)
以檔案讀取為例,當讀取資料是遇到了檔案尾,方法eof()、方法fail()會返回true,當發生型別不匹配時,方法fail()返回true;發生上述兩種情況時,方法bad()會返回true,換個角度思考,正常讀取時,方法good()返回true(不發生任何錯誤)

while (!inFile.good())
{
    ...
}

判斷正常輸入的標準做法

inFile >> value;
while(inFile.good())
{
    inFile >> value;
}
//由於inFile >>value 返回inFile物件,而在需要bool型別時,
此時返回值inFile可以為inFile.good(),
因此上面程式碼可以化簡為:

while(inFile >> value)
{
    ...
}

3. 檔案輸入輸出

檔案輸入、輸出需要建立檔案物件,並將其與特定檔案聯絡起來,此後,類似於cin、cout的方法,檔案物件可以採用與之相同的方法進行相應的處理。

3.1 寫入檔案

(1)包含標頭檔案fstream
(2)標頭檔案定義了一個用於處理輸出的類ofstream,用這個類宣告物件
(3)檔案物件用方法.open()與特定檔案聯絡起來,並用 <<來輸出資料(寫入檔案)
(4)使用方法close()進行關閉

ofstream outFile;
ofstream fout;

outFile.open("1.txt");

char filename[50];
cin>>filename;
fout.open("2.txt");

outFile.close();
fout.close();

3.2 讀取檔案

(1)包含標頭檔案fstream
(2)標頭檔案定義了一個用於處理輸出的類ifstream,用這個類宣告物件
(3)檔案物件用方法.open()與特定檔案聯絡起來,並用 >>來讀取資料(讀取檔案)
(4)使用方法close()進行關閉

ifstream inFile;
ifstream fin;


inFile.open("1.txt")
char line[30];
inFile.getline(line,31);

3.2 檔案開啟、錯誤檢測

(1)檔案開啟
在開啟檔案後,務必進行檢測是否成功開啟,利用is_open()方法

inFile.open("1.txt");
if(!infile.is_open())//開啟失敗
{
    exit(EXIT_FAILURE);
}

(2)錯誤檢測
見上面2.2