C 學習筆記二十八 檔案輸入 輸出

2021-07-26 06:49:44 字數 3919 閱讀 3669

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