使用cin進行輸入時,程式將輸入視為一系列的位元組,其中每個位元組都被解釋為字元編碼。不管目標資料型別是什麼,輸入一開始都是字元資料——文字資料。然後,cin物件負責將文字轉換為其他型別。
假設有如下示例輸入行:
38.5 19.2
來看一下使用不同資料型別的變數來儲存時,cin是如何處理輸入行的。
char型別:
char ch;
cin >> ch;
輸入行中的第乙個字元被賦給ch。在這裡,第乙個字元是數字3,其字元編碼(二進位制)被儲存在變數ch中。輸入和目標變數都是字元,因此不需要進行轉換。注意這裡儲存的是字元3的編碼。執行上述輸入語句後,輸入佇列中的下乙個字元為字元8,下乙個輸入操作將對其進行處理。
int型別:
int n;
cin >> n;
在這種情況下,cin將不斷讀取,直到遇到非數字字元。也就是說,它將讀取3和8,這樣句點將成為輸入佇列中的下乙個字元。cin通過計算發現,這兩個字元對應數值38,因此將38的二進位制字元複製到變數n中。
double型別:
double x;
cin >> x;
在這種情況下,cin將不斷讀取,直到遇到第乙個不屬於浮點數的字元。也就是說,cin讀取3、8、句點和5,使得空格成為輸入佇列中的下乙個字元。cin通過計算發現,這四個字元對應於數值38.5,因此將38.5的二進位制編碼(浮點格式)複製到變數x中。
char陣列:
char word[50];
cin >> word;
在這種情況下,cin將不斷讀取,直到遇到空白字元。也就是說,它讀取3、8、句點和5,使得空格成為輸入佇列中下乙個字元。然後,cin將這4個字元的編碼儲存到陣列word中,並在末尾加上乙個空字元。這裡不需要進行任何轉換。
最後,來看一下另一種使用char陣列來儲存輸入的情況:
char word[50];
cin.getline(word,50);
在這種情況下,cin將不斷讀取,直到遇到換行符(示例輸入行少於50個字元)。所有字元都被儲存到陣列word中,並在末尾加上乙個空字元。換行符被丟棄,輸入佇列中的下乙個字元是下一行中的第乙個字元。這裡不需要進行任何轉換。
本文討論的檔案i/o僅適用於文字檔案。
對於檔案輸入,c++使用類似於cout的東西。使用cout要注意以下幾點:
宣告物件:
ofstream outfile;
ofstream fout;
將這種物件與特定的檔案關聯起來:
outfile.open("fish.txt"); //outfile用於寫入fish.txt
char filename[50];
cin >> filename; //使用者指定乙個名字
fout.open(filename); //fout用於讀取特定檔案
注意,方法open()接受乙個c-風格字串作為引數,這可以是乙個字面字串,也可以是儲存在陣列中的字串。
下面演示了如何使用這種物件:
double wt = 125.8;
outfile << wt; //將乙個數字寫入fish.txt
fout << line << endl; //寫入一行文字
重要的是,宣告乙個ofstream物件並將其同檔案關聯起來後,便可以像使用cout那樣使用它。所有可用於cout的操作和方法(如<<、endl和setf())都可用於ofstream物件(如前述示例中的outfile和fout)。
使用檔案輸出的主要步驟如下:
包含標頭檔案fstream
建立乙個ofstream物件
將該ofstream物件同乙個檔案關聯起來
像使用cout那樣使用該ofstream物件
程式6.15
#include
#include
int main()
程式使用完檔案後,應使用close()將其關閉。close()不需要檔名作為引數,因為outfile已經同特定的檔案關聯起來。
程式執行之前,carinfo.txt並不存在,這種情況下,open()將新建乙個名為carinfo.txt的檔案。如果檔案carinfo.txt已經存在,open()將清空該檔案,再將新的輸出寫入到該檔案中。
檔案輸出:
宣告ifstream物件:
ifstream infile;
ifstream fin;
將ifstream物件與特定的檔案關聯起來:
infile.open("bowling.txt");
char filename[50];
cin >> filename;
fin.open(filename);
注意,方法open()接受乙個c-風格字串作為引數,這可以是乙個字面字串,也可以是儲存在陣列中的字串。
使用ifstream物件:
double wt;
infile >> wt;
char
line
[81];
fin.getline(line, 81);
重要的是,宣告乙個ifstream物件並將其同檔案關聯起來後,便可以像使用cin那樣使用它。所有可用於cin的操作和方法都可用於ifstream物件(如前述示例中的infile和fin)。
如果試圖開啟乙個不存在的檔案作為輸入,將導致後面使用ifstream物件進行輸入時失敗。檢查檔案是否被成功開啟的方法是使用is_open():
infile.open("bowling.txt");
if (!infile.is_open())
函式exit()的原型是在標頭檔案cstdlib中定義的,在該標頭檔案中,還定義了乙個用於同作業系統通訊的引數值exit_failure。函式exit()終止程式。
程式6.16
#include
#include
#include
const
int size = 60;
int main()
double value;
double sum = 0.0;
int count = 0;
infile >> value;
while (infile.good())
if (infile.eof())
cout
<< "end of file reached.\n";
else
if (infile.fail())
cout
<< "input terminated by data mismatch.\n";
else
cout
<< "input terminated for unknown reson.\n";
if (count == 0)
cout
<< "no data processed.\n";
else
infile.close();
system("pause");
return
0;}
檢查檔案是否被成功開啟至關重要。
good()在沒有任何錯誤發生時返回true。
C 學習筆記(二十八) 變數Field
變數是程式執行時儲存在記憶體中的資料。1.區域性變數 在方法的作用域儲存的臨時資料 2.欄位 儲存和型別或型別例項相關的資料 3.引數 用於從乙個方法到另乙個方法傳遞資料的臨時變數 4.陣列元素 資料項構成的有序集合的成員 變數的作用域是可以訪問該變數的 區域。確定作用域遵循規則 1.欄位在類的作用...
c學習筆記 檔案輸入 輸出 20210315
第一步 呼叫fopen 開啟檔案,fopen 在開啟檔案的同時建立了乙個緩衝區 讀寫模式下兩個 以及乙個包含檔案和緩衝區的結構,同時返回乙個指向該結構的指標,若把指標賦給乙個指標變數fp,文字模式下開啟,獲得乙個文字流 二進位制模式則為二進位製流。fopen 建立的結構通常包含乙個指定流中當前位置的...
C 學習筆記 輸入輸出
一 資料的輸入和輸出 1 字元輸入函式 getchar 例如 1 include2 include3 intmain 4 2 字元輸出 putchar 語法格式 1 putchar ch 其中,ch為乙個字元變數或常量。3 通過cout流輸出資料 格式1 cout 表示式 格式2 cout 表示式1...