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