int peek();
此函數返回輸入流中的下一個字元,但是並不將該字元從輸入流中取走——相當於只是看了一眼下一個字元,因此叫 peek。
Dec 3 1990
2011.2.3
458.12.1
Nov 4 1998
Feb 12 2011
12-03-1990
02-03-2011
12-01-0458
11-04-1998
02-12-2011
2011.12.24
的情況下,讀取第一個字元2
後就知道是格式一,問題是輸入流中的已經被讀取了,剩下的表示年份的部分只有011
,如何將這個011
和前面讀取的2
奏成一個整數 2011,也是頗費周折的事情。使用 peek() 函數很容易解決這個問題。#include <iostream> #include <iomanip> #include <string> using namespace std; string Months[12] = { "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug", "Sep","Oct","Nov","Dec" }; int main() { int c; while((c = cin.peek()) != EOF) { //取輸入流中的第一個字元進行檢視 int year,month,day; if(c >= 'A' && c <= 'Z') { //美國日期格式 string sMonth; cin >> sMonth >> day >> year; for(int i = 0;i < 12; ++i) //查詢月份 if(sMonth == Months[i]) { month = i + 1; break; } } else { //中國日期格式 cin >> year ; cin.ignore() >> month ; //用ignore跳過 "2011.12.3"中的'.' cin.ignore() >> day; } cin.ignore(); //跳過行末 'n' cout<< setfill('0') << setw(2) << month ;//設定填充字元'',輸出寬度2 cout << "-" << setw(2) << day << "-" << setw(4) << year << endl; } return 0; }istream 還有一個成員函數 istream & putback(char c),可以將一個字元插入輸入流的最前面。對於上面的例題,也可以在用 get() 函數讀取一個字元並判斷是中式格式還是西式格式時,將剛剛讀取的字元再用 putback() 成員函數放回流中,然後再根據判斷結果進行不同方式的讀入。