使用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要注意以下幾點:
必須包含頭文件iostream頭文件iostream定義了一個用于處理輸出的ostream類頭文件iostream聲明了一個名為cout的ostream變量(對象)必須指明名稱空間std可以結合使用cout和運算符<<來顯示各種類型的數據
文件輸出與此極其類似:
必須包含頭文件fstream頭文件fstream定義了一個用于處理輸出的ofstream類需要聲明一個或多個ofstream類(對象),并以自己喜歡的方式對其進行命名,條件是遵守常用的命名規則必須指明名稱空間std需要將ofstream對象與文件關聯起來。為此,方法之一是使用open()方法使用完文件后,應使用方法close()將其關閉可結合使用ofstream對象和運算符<<來輸出各種類型的數據
注意:雖然頭文件iostream提供了一個預先定義好的名為cout的ostream對象,但我們必須聲明自己的ofstream對象,為其命名,并將其同文件關聯起來:
聲明對象:
ofstream outFile;ofstream fout;將這種對象與特定的文件關聯起來:
outFile.open("fish.txt"); //outFile用于寫入fish.txtchar filename[50];cin >> filename; //用戶指定一個名字fout.open(filename); //fout用于讀取特定文件注意,方法open()接受一個C-風格字符串作為參數,這可以是一個字面字符串,也可以是存儲在數組中的字符串。
下面演示了如何使用這種對象:
double wt = 125.8;outFile << wt; //將一個數字寫入fish.txtchar line[81] = "Objects are closer than they appear.";fout << line << endl; //寫入一行文本重要的是,聲明一個ofstream對象并將其同文件關聯起來后,便可以像使用cout那樣使用它。所有可用于cout的操作和方法(如<<、endl和setf())都可用于ofstream對象(如前述示例中的outFile和fout)。
使用文件輸出的主要步驟如下:
包含頭文件fstream創建一個ofstream對象將該ofstream對象同一個文件關聯起來像使用cout那樣使用該ofstream對象程序6.15
#include<iostream>#include<fstream>int main(){ using namespace std; char automobile[50]; int year; double a_PRice; double d_price; ofstream outFile; outFile.open("carinfo.txt"); cout << "Enter the make and model of automobile: "; cin.getline(automobile, 50); cout << "Enter the model year: "; cin >> year; cout << "Enter the orginal asking price: "; cin >> a_price; d_price = 0.913 * a_price; cout << fixed; cout.precision(2); cout.setf(ios_base::showpoint); cout << "Make and model: " << a_price << endl; cout << "Year: " << year << endl; cout << "Was asking $" << a_price << endl; cout << "Now asking $" << d_price << endl; outFile << fixed; outFile.precision(2); outFile.setf(ios_base::showpoint); outFile << "Make and model: " << a_price << endl; outFile << "Year: " << year << endl; outFile << "Was asking $" << a_price << endl; outFile << "Now asking $" << d_price << endl; outFile.close(); system("pause"); return 0;}程序使用完文件后,應使用close()將其關閉。close()不需要文件名作為參數,因為outFile已經同特定的文件關聯起來。
程序運行之前,carinfo.txt并不存在,這種情況下,open()將新建一個名為carinfo.txt的文件。如果文件carinfo.txt已經存在,open()將清空該文件,再將新的輸出寫入到該文件中。
讀取文本文件是基于控制臺輸入的。 控制臺輸入涉及以下方面:
必須包含頭文件iostream頭文件iostream定義了一個用于處理輸入的istream類頭文件iostream聲明了一個名為cin的istream對象必須指明名稱空間std,using namespace std可以結合使用cin和運算符>>來讀取各種類型的數據可以使用cin和get()來讀取一個字符,使用cin和getline()來讀取一行字符對象cin本身被用作測試條件時,如果最后一個讀取操作成功,將被轉換為bool值true,否則為false文件輸出:
必須包含頭文件fstream頭文件fstream定義了一個用于處理文件讀取的ifstream類需要聲明一個或多個ifstream對象,并以合法的方式對其進行命名必須指明名稱空間std,using namespace std需要將ifstream對象與文件關聯起來,一種方法是使用open()使用完文件后,應使用close()將文件關閉可以結合使用ifstream對象和運算符>>來讀取各種類型的數據可以使用ifstream對象和get()來讀取一個字符,使用ifstream對象和getline()來讀取一行字符可以結合使用ifstream對象和eof()、fail()等方法來判斷輸入是否成功ifstream對象本身被用作測試條件時,如果最后一個讀取操作成功,將被轉換為bool值true,否則為false聲明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(EXIT_FAILURE);}函數exit()的原型是在頭文件cstdlib中定義的,在該頭文件中,還定義了一個用于同操作系統通信的參數值EXIT_FAILURE。函數exit()終止程序。
程序6.16
#include<iostream>#include<fstream>#include<cstdlib>const int SIZE = 60;int main(){ using namespace std; char filename[SIZE]; ifstream inFile; cout << "Enter name of data file: "; cin.getline(filename, SIZE); inFile.open(filename); if (!inFile.is_open()) { cout << "Could not open the file " << filename << endl; cout << "Program terminating./n"; exit(EXIT_FAILURE); } double value; double sum = 0.0; int count = 0; inFile >> value; while (inFile.good()) { ++count; sum += value; inFile >> value; } 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 { cout << "Items read: " << count << endl; cout << "Sum: " << sum << endl; cout << "Average: " << sum / count << endl; } inFile.close(); system("pause"); return 0;}檢查文件是否被成功打開至關重要。
good()在沒有任何錯誤發生時返回true。
新聞熱點
疑難解答
圖片精選