Lab 2-1: Using cin/cout, fstream, 與 namespace

 
實習目標 1. 使用 ios, iostream, fstream 類別物件所提供的輸出入功能
2. 使用 C++ 標準輸出入函式庫中所提供物件的界面
3. 熟悉透過物件界面描述物件功能的抽象化描述物件的方法
 
步驟一 請找出上個星期實習課程所得到的程式, 修改其中的 printf() 敘述, 使用 cout, 以及 I/O manipulator 完成相同的 Console 輸出功能, 修改其中的 scanf() 敘述, 使用 cin 來完成相同的 Console 輸入功能, 請一步一步地編譯, 執行, 並檢查結果

如果你擔心一次通通改好再編譯, 執行會發生很多錯誤的話, (尤其是你現在還不太熟悉 cin 和 cout 的用法,) 你可以一點一點地修改, 修改一個敘述以後就立刻編譯, 執行, 檢查結果 (檢查結果是否正確的工作如果能夠交給 assert 敘述就好了, 想一想這該怎麼做?, 助教會問你喔!!)

請注意 stdio 和 iostream 共用時應該要在 main() 函式一開始的時候呼叫ios::sync_with_stdio(), 以避免 iostream 和 stdio 各用各的緩衝區的問題, 最後的目標是完全用 iostream 函式庫來達成原來程式的功能

另外, 你也許會有一個疑問, 就是為什麼不把 cin 和 cout 所有的用法都完整交代清楚以後再叫你練習, 這樣子不是有點浪費時間?? )*(&(*^%...

  1. 想要看完整的 cin 和 cout 的用法的人可以查 MSDN Library , 例如你要查 cin 用法的話應該要查 istream 類別, 要查 cout 用法的話應該要查 ostream 類別
  2. 看過以後你應該會覺得更無助
  3. 我想你在這裡也許學習一下怎樣投射你以前的經驗吧!!
你在寫 C 程式的時候天天用到螢幕和鍵盤輸出入的功能, 你應該知道基本上能夠有什麼功能, cin 和 cout 一定都可以提供你想要的功能, 對照你所看到的範例, 還有你在 MSDN Library 裡所查到的資料, 你就可以比較快使用 cin 和 cout 了, 至於其它 cin 和 cout 中你不曉得的功能的話, 不要太貪心嘛..., 暫時先忽略那些細節吧, 真的有用的時候你自然會看到!!
步驟二 繼續步驟一的修改, 程式中 ReadFile() 函式使用 stdio 中的檔案輸出入函式, 請將其改為使用 ifstream 來完成相同的檔案輸入功能

C++ 標準函式庫中基本的檔案存取功能範例如下:

  #include <fstream>
  #include <string>
  using namespace std;

  ifstream in("Scopy.cpp");   // 開啟輸入檔案
  if (!in) 
  {
    cerr << "fail in opening scopy.cpp for reading";
	  exit(1);
  }
  ofstream out("Scopy2.cpp"); // 開啟輸出檔案
  if (!out) 
  {
    cerr << "fail in opening scopy2.cpp for writing";
	  exit(1);
  }

  string s;
  while (getline(in, s)) // delimiter '\n' deleted automatically
      out << s << "\n";
請注意上面這段程式是運用 getline() 函式由檔案串流 in 中依序讀取字串 到 s 這個 string 型態的變數中, 由於檔案和鍵盤在 iostream / fstream 函式庫中都看成是資料串流, 所以由檔案中讀取數字的方法和由鍵盤讀取數字的方法是一樣的, 例如:
  int x;
  double y;
  in >> x >> y;
步驟三 如果我現在有一個新的資料檔案 raw4.dat, 檔案內容的格式稍微修改如下:
99   number of data item
6    first item
7    second item
8       the score
9   ...
8
每一筆資料都在一列上, 但是後面有一些文字的註解, 在資料後會有至少一格的空白字元來區隔, 請修改 ReadFile() 函式來讀取新的資料檔案格式

提示: 試看看 infile >> data; infile.getline(buf, sizeof(buf)); 不要照抄, 瞭解為什麼要這樣做以後再試看看, 這段程式的變數的資料型態要自己定義喔?!?!

步驟四 請再製作一個 WriteFile() 函式將剛才由 raw4.dat 檔案內讀到的 資料依照舊的資料格式 (raw1.dat, raw2.dat, raw3.dat 的格式) 寫到 raw4a.dat 中
步驟五 請助教檢查後, 將所完成的 project (去掉 debug/ 資料匣下的所有內容) 壓縮起來, 選擇 Lab2-1 上傳, 後面的實習課程可能需要使用這裡所完成的程式

C++ 物件導向程式設計課程 首頁

製作日期: 02/16/2004 by 丁培毅 (Pei-yih Ting)
E-mail: pyting@mail.ntou.edu.tw TEL: 02 24622192x6615
海洋大學 電機資訊學院 資訊工程系 Lagoon