国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

【C++ Primer plus 第6版】學習筆記二十八——文件輸入/輸出

2019-11-08 01:35:40
字體:
來源:轉載
供稿:網友

文件輸入輸出

文本I/O和文本文件

  使用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。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 麦盖提县| 老河口市| 昌黎县| 苍溪县| 临江市| 博湖县| 西昌市| 宁武县| 平谷区| 柳州市| 灯塔市| 宜兴市| 邵武市| 庄河市| 枞阳县| 赣州市| 汝州市| 江孜县| 高阳县| 马鞍山市| 北宁市| 香格里拉县| 延川县| 玉树县| 文登市| 沁阳市| 海城市| 舒兰市| 江达县| 阜宁县| 太和县| 天峻县| 镇康县| 峡江县| 邻水| 密云县| 周至县| 铅山县| 奉新县| 新丰县| 闸北区|