英吋 C++

檔案輸入與輸出(上)


文章太長,分兩篇放

1. 開啟檔案

檔案物件.open(“檔案名稱”, ios::開啟模式);

例如:

 #include <fstream.h>

 ifstream 輸入物件;           // 建立輸入檔案物件
 ofstream 輸出物件;          // 建立輸出檔案物件
 fstream 輸出入物件;        // 建立輸入輸出檔案物件

也可以建立物件時順便開啟,例如:

 ifstream 輸入物件(“檔案名稱”, ios::開啟模式);

2. 開啟模式

 ios::開啟模式  說明
 in  開啟檔案準備輸入
 out  開啟檔案準備輸出
 app  將輸出的資料接續在檔案尾端
 ate  開啟檔案,並且移到檔案尾端
 binary  以二近位的方式輸入/輸出檔案
 trunc  如果檔案存在,複寫現存的檔案
 nocreate  如果檔案不存在,則開啟檔案失敗
 noreplace  如果檔案存在,則開啟檔案失敗

※ios::trunk => ios::trunc。感謝yammilk提醒。

3. 判斷開啟檔案成功或失敗

ifstream myFile;                                      // 建立輸入檔案物件
 myFile.open("a:\\textIn.txt", ios::in);      // 開啟輸入檔案
 if(!myFile)                                             // 測試檔案是否開啟成功
 cout << "開啟檔案失敗!\n";                    // 檔案代號錯誤

另一個類似的成員「is_open()」,用來判斷該檔案流是否已經開啟檔案,避免重複開檔。

 ifstream myFile;
 if(!myFile.is_open( ))                                      // 測試檔案是否開啟成功
 cout << "尚未開啟\n";
 ifstream myFile("a:\\textIn.txt", ios::in);       // 建立並開啟檔案
 if(myFile.is_open())                                       // 測試檔案是否開啟成功
 cout << "檔案已經開啟\n";

4. fstream::close

物件名稱.close();

例如:

 myFile.close();


關閉檔案後,物件仍然存在,可以繼續開啟其他檔案!
如果要這樣做,請記得和 clear() 搭配使用。

 ifstream myFile("text.txt");
 // 努力用myFile
 myFile.clear();
 myFile.close();
 myFile.open(text2.txt);


5. ostream::operator <<

物件名稱 << 輸出字串;    // 寫入檔案

例如:

 ofstream filePtr;                                      // 建立檔案物件filePtr
 filePtr.open("a:\\textIO.txt", ios::out);     // 開啟檔案a:\textIO.txt
 filePtr << "Life is not easy, but in the long run \n";
 filePtr << "it's easier than going to elaborate ends \n";
 filePtr << "to deny it.\n";                           // 寫入字串到檔案
 filePtr.close();                                          // 關閉filePtr檔案物件

6. istream::operator >>

物件名稱 >> 緩衝區1 >> 緩衝區2;    //讀取資料

例如:

 ifstream inFile;                                     // 建立檔案物件inFile
 int id;                                                   // 存放資料緩衝區
 char name[40];                                      // 存放資料緩衝區
 inFile.open("a:textIO.dat", ios::in);        // 開啟輸入檔a:\textIO.dat
 inFile >> id >> name;                               // 讀取檔案存入緩衝區
 
while(!inFile.eof())                                // 是否已到檔尾
 {
     cout << id << '\t' << name << endl;         // 顯示緩衝區資料
     inFile >> id >> name;                          // 讀取檔案存入緩衝區
 }

 inFile.close();                                       // 關閉檔案物件inFile

7. ostream::put

物件名稱.put(字元緩衝區);

例如:

 ofstream filePtr;                                         // 建立檔案物件filePtr
 char inData[ ] = "Life is not easy, but in the long run \n“;

 filePtr.open("a:\\textIO.txt", ios::out);        // 開啟輸入檔a:\textIO.txt
 int len = strlen(inData);                               // 取得inData陣列的長度

 for(int i=0; i<len; i++)                                  // 寫入字元迴圈
 {
     filePtr.put(inData[i]);                             // 寫入字元到textIO.txt
 }

 filePtr.close();                                           // 關閉檔案物件filePtr

8. istream::get

物件名稱.get(字元緩衝區);

例如:

 ifstream filePtr;                                         // 建立檔案物件filePtr
 char inData;                                               // 存放資料緩衝區

 filePtr.open("a:\\textIO.txt", ios::in);         // 開啟輸出檔a:\textIO.txt

 while(filePtr.get(inData))                            // 取得資料並存入緩衝區
 {
     cout << inData;                                        // 顯示資料
 }

 filePtr.close();                                            // 關閉檔案物件filePtr

9. iso::eof

輸入檔案物件.eof();

例如:

 ifstream filePtr;      // 建立檔案物件filePtr
 char inData;            // 存放資料緩衝區

 filePtr.open("a:\\textIO.txt", ios::in);


為了改一個字,竟然導致整個語法垮掉
所以重新整理了一次,下篇有空再遵照這篇的模式整理。

— Next

4則迴響

  1. 不好意思~ 我是vc++的超級新手~ 想請問你一下~ 如果我今天是要將一個序列~ 整個印在.dat檔裡頭… 那我該怎麼做丫!! 我有一點看不懂~ 真不好意思~

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.