┴ⁿ ≡φ ╤≥≡α≤±≥≡α∩. ┬ΓσΣσφΦσ Γ  τ√Ω ╤Φ++, ╧ε≥εΩΦ
Server for Information Technologies ╤σ≡Γσ≡ ╚φ⌠ε≡∞α÷Φεφφ√⌡ ╥σ⌡φεδεπΦΘ
±εΣσ≡µΦ≥ ∞ε≡σ(!) αφαδΦ≥Φ≈σ±ΩεΘ Φφ⌠ε≡∞α÷ΦΦ

╤σ≡Γσ≡ ∩εΣΣσ≡µΦΓασ≥± 
╓σφ≥≡ε∞ ╚φ⌠ε≡∞α÷Φεφφ√⌡ ╥σ⌡φεδεπΦΘ
(095) 932-9212, 932-9213, 939-0783
E-mail: info@citforum.ru


├δαΓα 8

╧ε≥εΩΦ

▀τ√Ω C++ φσ εßσ±∩σ≈ΦΓασ≥ ±≡σΣ±≥Γ Σδ  ΓΓεΣα/Γ√ΓεΣα. ┼∞≤ ²≥ε Φ φσ φ≤µφε; ≥αΩΦσ ±≡σΣ±≥Γα δσπΩε Φ ²δσπαφ≥φε ∞εµφε ±ετΣα≥ⁿ ± ∩ε∞ε∙ⁿ■ ±α∞επε  τ√Ωα. ╬∩Φ±αφφα  τΣσ±ⁿ ±≥αφΣα≡≥φα  ßΦßδΦε≥σΩα ∩ε≥εΩεΓεπε ΓΓεΣα/Γ√ΓεΣα εßσ±∩σ≈ΦΓασ≥ πΦßΩΦΘ Φ ²⌠⌠σΩ≥ΦΓφ√Θ ± πα≡αφ≥ΦσΘ ≥Φ∩α ∞σ≥εΣ εß≡αßε≥ΩΦ ±Φ∞Γεδⁿφεπε ΓΓεΣα ÷σδ√⌡ ≈Φ±σδ, ≈Φ±σδ ± ∩δαΓα■∙σΘ ≥ε≈ΩεΘ Φ ±Φ∞Γεδⁿφ√⌡ ±≥≡εΩ, α ≥αΩµσ ∩≡ε±≥≤■ ∞εΣσδⁿ σσ ≡α±°Φ≡σφΦ  Σδ  εß≡αßε≥ΩΦ ≥Φ∩εΓ, ε∩≡σΣσδ σ∞√⌡ ∩εδⁿτεΓα≥σδσ∞. ┼σ ∩εδⁿτεΓα≥σδⁿ±ΩΦΘ Φφ≥σ≡⌠σΘ± φα⌡εΣΦ≥±  Γ . ┬ ²≥εΘ πδαΓσ ε∩Φ±√Γασ≥±  ±α∞α ßΦßδΦε≥σΩα, φσΩε≥ε≡√σ ±∩ε±εß√ σσ ∩≡Φ∞σφσφΦ  Φ ∞σ≥εΣ√, Ωε≥ε≡√σ Φ±∩εδⁿτεΓαδΦ±ⁿ ∩≡Φ σσ ≡σαδΦτα÷ΦΦ.

8.1 ┬ΓσΣσφΦσ

╨ατ≡αßε≥Ωα Φ ≡σαδΦτα÷Φ  ±≥αφΣα≡≥φ√⌡ ±≡σΣ±≥Γ ΓΓεΣα/Γ√ΓεΣα Σδ   τ√Ωα ∩≡επ≡α∞∞Φ≡εΓαφΦ  τα≡σΩε∞σφΣεΓαδα ±σß  ΩαΩ ταΓσΣε∞ε ≥≡≤Σφα  ≡αßε≥α. ╥≡αΣΦ÷Φεφφε ±≡σΣ±≥Γα ΓΓεΣα/Γ√ΓεΣα ≡ατ≡αßα≥√ΓαδΦ±ⁿ Φ±Ωδ■≈Φ≥σδⁿφε Σδ  φσßεδⁿ°επε ≈Φ±δα Γ±≥≡εσφφ√⌡ ≥Φ∩εΓ Σαφφ√⌡. ╬ΣφαΩε Γ C++ ∩≡επ≡α∞∞α⌡ εß√≈φε Φ±∩εδⁿτ≤σ≥±  ∞φεπε ≥Φ∩εΓ, ε∩≡σΣσδσφφ√⌡ ∩εδⁿτεΓα≥σδσ∞, Φ φ≤µφε εß≡αßα≥√Γα≥ⁿ ΓΓεΣ Φ Γ√ΓεΣ ≥αΩµσ Φ τφα≈σφΦΘ ²≥Φ⌡ ≥Φ∩εΓ. ╬≈σΓΦΣφε, ±≡σΣ±≥Γε ΓΓεΣα/Γ√ΓεΣα Σεδµφε ß√≥ⁿ ∩≡ε±≥√∞, ≤Σεßφ√∞, φαΣσµφ√∞ Γ ≤∩ε≥≡σßδσφΦΦ, ²⌠⌠σΩ≥ΦΓφ√∞ Φ πΦßΩΦ∞, Φ Ωε Γ±σ∞≤ ∩≡ε≈σ∞≤ ∩εδφ√∞. ═Φ≈ⁿσ ≡σ°σφΦσ σ∙σ φσ ±∞επδε ≤πεΣΦ≥ⁿ Γ±σ∞, ∩ε²≥ε∞≤ ≤ ∩εδⁿτεΓα≥σδ  Σεδµφα ß√≥ⁿ Γετ∞εµφε±≥ⁿ ταΣαΓα≥ⁿ αδⁿ≥σ≡φα≥ΦΓφ√σ ±≡σΣ±≥Γα ΓΓεΣα/Γ√ΓεΣα Φ ≡α±°Φ≡ ≥ⁿ ±≥αφΣα≡≥φ√σ ±≡σΣ±≥Γα ΓΓεΣα/Γ√ΓεΣα ∩≡Φ∞σφΦ≥σδⁿφε Ω ≥≡σßεΓαφΦ ∞ ∩≡ΦδεµσφΦ .
C++ ≡ατ≡αßε≥αφ ≥αΩ, ≈≥εß√ ≤ ∩εδⁿτεΓα≥σδ  ß√δα Γετ∞εµφε±≥ⁿ ε∩≡σΣσδ ≥ⁿ φεΓ√σ ≥Φ∩√ ±≥εδⁿ µσ ²⌠⌠σΩ≥ΦΓφ√σ Φ ≤Σεßφ√σ, ±Ωεδⁿ Φ Γ±≥≡εσφφ√σ ≥Φ∩√. ╧ε²≥ε∞≤ εßε±φεΓαφφ√∞  Γδ σ≥±  ≥≡σßεΓαφΦσ ≥επε, ≈≥ε ±≡σΣ±≥Γα ΓΓεΣα/Γ√ΓεΣα Σδ  C++ Σεδµφ√ εßσ±∩σ≈ΦΓα≥ⁿ±  Γ C++ ± ∩≡Φ∞σφσφΦσ∞ ≥εδⁿΩε ≥σ⌡ ±≡σΣ±≥Γ, Ωε≥ε≡√σ Σε±≥≤∩φ√ ΩαµΣε∞≤ ∩≡επ≡α∞∞Φ±≥≤. ╬∩Φ±√Γασ∞√σ τΣσ±ⁿ ±≡σΣ±≥Γα ΓΓεΣα/Γ√ΓεΣα ∩≡σΣ±≥αΓδ ■≥ ±εßεΘ ∩ε∩√≥Ω≤ ε≥Γσ≥Φ≥ⁿ φα ²≥ε≥ Γ√τεΓ.
╤≡σΣ±≥Γα ΓΓεΣα/Γ√ΓεΣα ±Γ ταφ√ Φ±Ωδ■≈Φ≥σδⁿφε ± εß≡αßε≥ΩεΘ ∩≡σεß≡ατεΓαφΦ  ≥Φ∩ΦτΦ≡εΓαφφ√⌡ εß·σΩ≥εΓ Γ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ±Φ∞ΓεδεΓ Φ εß≡α≥φε. ┼±≥ⁿ Φ Σ≡≤πΦσ ±⌡σ∞√ ΓΓεΣα/Γ√ΓεΣα, φε ²≥α  Γδ σ≥±  ε±φεΓε∩εδαπα■∙σΘ Γ ±Φ±≥σ∞σ UNIX, Φ ßεδⁿ°α  ≈α±≥ⁿ ΓΦΣεΓ ßΦφα≡φεπε ΓΓεΣα/Γ√ΓεΣα εß≡αßα≥√Γασ≥±  ≈σ≡στ ≡α±±∞ε≥≡σφΦσ ±Φ∞Γεδα ∩≡ε±≥ε ΩαΩ φαßε≡ ßΦ≥, ∩≡Φ ²≥ε∞ σπε εß∙σ∩≡Φφ ≥α  ±Γ τⁿ ± αδ⌠αΓΦ≥ε∞ Φπφε≡Φ≡≤σ≥± . ╥επΣα Σδ  ∩≡επ≡α∞∞Φ±≥α Ωδ■≈σΓα  ∩≡εßδσ∞α ταΩδ■≈ασ≥±  Γ ταΣαφΦΦ ±εε≥Γσ≥±≥ΓΦ  ∞σµΣ≤ ≥Φ∩ΦτΦ≡εΓαφφ√∞ εß·σΩ≥ε∞ Φ ∩≡Φφ÷Φ∩Φαδⁿφε φσ ≥Φ∩ΦτΦ≡εΓαφφεΘ ±≥≡εΩεΘ.
╬ß≡αßε≥Ωα Φ Γ±≥≡εσφφ√⌡ Φ ε∩≡σΣσδσφφ√⌡ ∩εδⁿτεΓα≥σδσ∞ ≥Φ∩εΓ εΣφε≡εΣφ√∞ εß≡ατε∞ Φ ± πα≡αφ≥ΦσΘ ≥Φ∩α Σε±≥Φπασ≥±  ± ∩ε∞ε∙ⁿ■ εΣφεπε ∩σ≡σπ≡≤µσφφεπε Φ∞σφΦ ⌠≤φΩ÷ΦΦ Σδ  φαßε≡α ⌠≤φΩ÷ΦΘ Γ√ΓεΣα. ═α∩≡Φ∞σ≡:

  put(cerr,"x = "); // cerr - ∩ε≥εΩ Γ√ΓεΣα ε°ΦßεΩ
  put(cerr,x);
  put(cerr,"\n");

╥Φ∩ ∩α≡α∞σ≥≡α ε∩≡σΣσδ σ≥ ≥ε, ΩαΩα  Φτ ⌠≤φΩ÷ΦΘ put ß≤Σσ≥ Γ√τ√Γα≥ⁿ±  Σδ  ΩαµΣεπε ∩α≡α∞σ≥≡α. ▌≥ε ≡σ°σφΦσ ∩≡Φ∞σφ δε±ⁿ Γ φσ±ΩεδⁿΩΦ⌡  τ√Ωα⌡. ╬ΣφαΩε σ∞≤ φσΣε±≥ασ≥ δαΩεφΦ≈φε±≥Φ. ╧σ≡σπ≡≤τΩα ε∩σ≡α÷ΦΦ << τφα≈σφΦσ∞ "∩ε∞σ±≥Φ≥ⁿ Γ" Σασ≥ ßεδσσ ⌡ε≡ε°≤■ τα∩Φ±ⁿ Φ ∩ετΓεδ σ≥ ∩≡επ≡α∞∞Φ±≥≤ Γ√ΓεΣΦ≥ⁿ ≡ Σ εß·σΩ≥εΓ εΣφΦ∞ ε∩σ≡α≥ε≡ε∞. ═α∩≡Φ∞σ≡:
  cerr << "x = " << x << "\n";

πΣσ cerr - ±≥αφΣα≡≥φ√Θ ∩ε≥εΩ Γ√ΓεΣα ε°ΦßεΩ. ╧ε²≥ε∞≤, σ±δΦ x  Γδ σ≥±  int ±ε τφα≈σφΦσ∞ 123, ≥ε ²≥ε≥ ε∩σ≡α≥ε≡ φα∩σ≈α≥ασ≥ Γ ±≥αφΣα≡≥φ√Θ ∩ε≥εΩ Γ√ΓεΣα ε°ΦßεΩ
  x = 123

Φ ±Φ∞Γεδ φεΓεΘ ±≥≡εΩΦ. └φαδεπΦ≈φε, σ±δΦ X ∩≡ΦφαΣδσµΦ≥ ε∩≡σΣσδσφφε∞≤ ∩εδⁿτεΓα≥σδσ∞ ≥Φ∩≤ complex Φ Φ∞σσ≥ τφα≈σφΦσ (1,2.4), ≥ε ∩≡ΦΓσΣσφφ√Θ Γ√°σ ε∩σ≡α≥ε≡ φα∩σ≈α≥ασ≥ Γ cerr
  x = 1,2.4)

▌≥ε≥ ∞σ≥εΣ ∞εµφε ∩≡Φ∞σφ ≥ⁿ Γ±σπΣα, ΩεπΣα Σδ  x ε∩≡σΣσδσφα ε∩σ≡α÷Φ  <<, Φ ∩εδⁿτεΓα≥σδⁿ ∞εµσ≥ ε∩≡σΣσδ ≥ⁿ ε∩σ≡α÷Φ■ << Σδ  φεΓεπε ≥Φ∩α.

8.2 ┬√ΓεΣ

8.2.1 ┬√ΓεΣ ┬±≥≡εσφφ√⌡ ╥Φ∩εΓ
8.2.2 ═σΩε≥ε≡√σ ╧εΣ≡εßφε±≥Φ ╨ατ≡αßε≥ΩΦ
8.2.3 ╘ε≡∞α≥Φ≡εΓαφφ√Θ ┬√ΓεΣ
8.2.4 ┬Φ≡≥≤αδⁿφα  ╘≤φΩ÷Φ  ┬√ΓεΣα

┬ ²≥ε∞ ≡ατΣσδσ ±φα≈αδα εß±≤µΣα■≥±  ±≡σΣ±≥Γα ⌠ε≡∞α≥φεπε Φ ßσ±⌠ε≡∞α≥φεπε Γ√ΓεΣα Γ±≥≡εσφφ√⌡ ≥Φ∩εΓ, ∩ε≥ε∞ ∩≡ΦΓεΣΦ≥±  ±≥αφΣα≡≥φ√Θ ±∩ε±εß ±∩σ÷Φ⌠ΦΩα÷ΦΦ ΣσΘ±≥ΓΦΘ Γ√ΓεΣα Σδ  ε∩≡σΣσδ σ∞√⌡ ∩εδⁿτεΓα≥σδσ∞ ≥Φ∩εΓ.

8.2.1 ┬√ΓεΣ ┬±≥≡εσφφ√⌡ ╥Φ∩εΓ

╩δα±± ostream ε∩≡σΣσδ σ≥±  Γ∞σ±≥σ ± ε∩σ≡α÷ΦσΘ << ("∩ε∞σ±≥Φ≥ⁿ Γ") Σδ  εß≡αßε≥ΩΦ Γ√ΓεΣα Γ±≥≡εσφφ√⌡ ≥Φ∩εΓ:

  class ostream {
      // ...
  public:
      ostream& operator<<(char*);
      ostream& operator<<(int i) { return *this<

8.2.2 ═σΩε≥ε≡√σ ╧εΣ≡εßφε±≥Φ ╨ατ≡αßε≥ΩΦ

╬∩σ≡α÷Φ  Γ√ΓεΣα Φ±∩εδⁿτ≤σ≥± , ≈≥εß√ Φτßσµα≥ⁿ ≥εΘ ∞φεπε±δεΓφε±≥Φ, Ωε≥ε≡≤■ Σαδε ß√ Φ±∩εδⁿτεΓαφΦσ ⌠≤φΩ÷ΦΦ Γ√ΓεΣα. ═ε ∩ε≈σ∞≤ < ┬ετ∞εµφε±≥Φ Φτεß≡σ±≥Φ φεΓ√Θ δσΩ±Φ≈σ±ΩΦΘ ±Φ∞Γεδ φσ≥ (#6.2). ╬∩σ≡α÷Φ  ∩≡Φ±ΓαΦΓαφΦ  ß√δα ΩαφΣΦΣα≥ε∞ εΣφεΓ≡σ∞σφφε Φ φα ΓΓεΣ, Φ φα Γ√ΓεΣ, φε εΩατ√Γασ≥± , ßεδⁿ°Φφ±≥Γε δ■ΣσΘ ∩≡σΣ∩ε≈Φ≥α■≥, ≈≥εß√ ε∩σ≡α÷Φ  ΓΓεΣα ε≥δΦ≈αδα±ⁿ ε≥ ε∩σ≡α÷ΦΦ Γ√ΓεΣα. ╩≡ε∞σ ≥επε, = φσ Γ ≥≤ ±≥ε≡εφ≤ ±Γ τ√Γασ≥±  (α±±ε÷ΦΦ≡≤σ≥± ), ≥ε σ±≥ⁿ cout=a=b ετφα≈ασ≥ cout=(a=b).
─σδαδΦ±ⁿ ∩ε∩√≥ΩΦ Φ±∩εδⁿτεΓα≥ⁿ ε∩σ≡α÷ΦΦ < Φ >, φε τφα≈σφΦ  "∞σφⁿ°σ" Φ "ßεδⁿ°σ" φα±≥εδⁿΩε ∩≡ε≈φε Γ≡ε±δΦ Γ ±ετφαφΦσ δ■ΣσΘ, ≈≥ε φεΓ√σ ε∩σ≡α÷ΦΦ ΓΓεΣα/Γ√ΓεΣα Γε Γ±σ⌡ ≡σαδⁿφ√⌡ ±δ≤≈α ⌡ εΩαταδΦ±ⁿ φσ≈Φ≥ασ∞√∞Φ. ╧ε∞Φ∞ε ²≥επε, "<" φα⌡εΣΦ≥±  φα ßεδⁿ°Φφ±≥Γσ ΩδαΓΦα≥≤≡ ΩαΩ ≡ατ φα ",", Φ ≤ δ■ΣσΘ ∩εδ≤≈α■≥±  ε∩σ≡α≥ε≡√ Γ≡εΣσ ≥αΩεπε:

  cout < x , y , z;

─δ  ≥αΩΦ⌡ ε∩σ≡α≥ε≡εΓ φσ∩≡ε±≥ε Γ√Σα≥ⁿ ⌡ε≡ε°Φσ ±εεß∙σφΦ  εß ε°ΦßΩα⌡.
╬∩σ≡α÷ΦΦ << Φ >> Ω ≥αΩεπε ≡εΣα ∩≡εßδσ∞α∞ φσ ∩≡ΦΓεΣ ≥, εφΦ α±Φ∞∞σ≥≡Φ≈φ√ Γ ≥ε∞ ±∞√±δσ, ≈≥ε Φ⌡ ∞εµφε ∩≡εα±±ε÷ΦΦ≡εΓα≥ⁿ ± "Γ" Φ "Φτ", α ∩≡Φε≡Φ≥σ≥ << Σε±≥α≥ε≈φε φΦτεΩ, ≈≥εß√ ∞εµφε ß√δε φσ Φ±∩εδⁿτεΓα≥ⁿ ±ΩεßΩΦ Σδ  α≡Φ⌠∞σ≥Φ≈σ±ΩΦ⌡ Γ√≡αµσφΦΘ Γ ≡εδΦ ε∩σ≡αφΣεΓ. ═α∩≡Φ∞σ≡:
  cout << "a*b+c=" << a*b+c << "\n";

┼±≥σ±≥Γσφφε, ∩≡Φ φα∩Φ±αφΦΦ Γ√≡αµσφΦΘ, Ωε≥ε≡√σ ±εΣσ≡µα≥ ε∩σ≡α÷ΦΦ ± ßεδσσ φΦτΩΦ∞Φ ∩≡Φε≡Φ≥σ≥α∞Φ, ±ΩεßΩΦ Φ±∩εδⁿτεΓα≥ⁿ φαΣε. ═α∩≡Φ∞σ≡:
  cout << "a^b|c=" << (a^b|c) << "\n";

╬∩σ≡α÷Φ■ δσΓεπε ±ΣΓΦπα ≥εµσ ∞εµφε ∩≡Φ∞σφ ≥ⁿ Γ ε∩σ≡α≥ε≡σ Γ√ΓεΣα:
  cout << "a<

8.2.3 ╘ε≡∞α≥Φ≡εΓαφφ√Θ ┬√ΓεΣ

╧εΩα << ∩≡Φ∞σφ δα±ⁿ ≥εδⁿΩε Σδ  φσ⌠ε≡∞α≥Φ≡εΓαφφεπε Γ√ΓεΣα, Φ φα ±α∞ε∞ Σσδσ Γ ≡σαδⁿφ√⌡ ∩≡επ≡α∞∞α⌡ εφα Φ∞σφφε Σδ  ²≥επε πδαΓφ√∞ εß≡ατε∞ Φ ∩≡Φ∞σφ σ≥± . ╧ε∞Φ∞ε ²≥επε ±≤∙σ±≥Γ≤σ≥ ≥αΩµσ φσ±ΩεδⁿΩε ⌠ε≡∞α≥Φ≡≤■∙Φ⌡ ⌠≤φΩ÷ΦΘ, ±ετΣα■∙Φ⌡ ∩≡σΣ±≥αΓδσφΦσ ±Γεσπε ∩α≡α∞σ≥≡α Γ ΓΦΣσ ±≥≡εΩΦ, Ωε≥ε≡α  Φ±∩εδⁿτ≤σ≥±  Σδ  Γ√ΓεΣα. ╚⌡ Γ≥ε≡εΘ (φσεß τα≥σδⁿφ√Θ) ∩α≡α∞σ≥≡ ≤Ωατ√Γασ≥, ±ΩεδⁿΩε ±Φ∞Γεδⁿφ√⌡ ∩ετΦ÷ΦΘ Σεδµφε Φ±∩εδⁿτεΓα≥ⁿ± .

  char* oct(long, int =0);    // Γε±ⁿ∞σ≡Φ≈φεσ ∩≡σΣ±≥αΓδσφΦσ
  char* dec(long, int =0);    // Σσ± ≥Φ≈φεσ ∩≡σΣ±≥αΓδσφΦσ
  char* hex(long, int =0);    // °σ±≥φαΣ÷α≥Φ≡Φ≈φεσ ∩≡σΣ±≥αΓδσφΦσ
  char* chr(int, int =0);     // ±Φ∞Γεδ
  char* str(char*, int =0);   // ±≥≡εΩα

┼±δΦ φσ ταΣαφε ∩εδσ φ≤δσΓεΘ ΣδΦφ√, ≥ε ß≤Σσ≥ ∩≡εΦτΓεΣΦ≥ⁿ±  ≤±σ≈σφΦσ ΦδΦ Σε∩εδφσφΦσ; Φφα≈σ ß≤Σσ≥ Φ±∩εδⁿτεΓα≥ⁿ±  ±≥εδⁿΩε ±Φ∞ΓεδεΓ (≡εΓφε), ±ΩεδⁿΩε φ≤µφε. ═α∩≡Φ∞σ≡:
  cout << "dec(" << x
       << ") = oct(" << oct(x,6)
       << ") = hex(" << hex(x,4)
       << ")";

┼±δΦ x==15, ≥ε Γ ≡στ≤δⁿ≥α≥σ ∩εδ≤≈Φ≥± :
  dec(15) = oct(    17) = hex(   f);

╠εµφε ≥αΩµσ Φ±∩εδⁿτεΓα≥ⁿ ±≥≡εΩ≤ Γ εß∙σ∞ ⌠ε≡∞α≥σ:
  char* form(char* format ...);
  cout<

8.2.4 ┬Φ≡≥≤αδⁿφα  ╘≤φΩ÷Φ  ┬√ΓεΣα

╚φεπΣα ⌠≤φΩ÷Φ  Γ√ΓεΣα Σεδµφα ß√≥ⁿ virtual. ╨α±±∞ε≥≡Φ∞ ∩≡Φ∞σ≡ Ωδα±±α shape, Ωε≥ε≡√Θ Σασ≥ ∩εφ ≥Φσ ⌠Φπ≤≡√ (#1.18):

  class shape {
      // ...
  public:
      // ...
      virtual void draw(ostream& s); // ≡Φ±≤σ≥ "this" φα "s"
  };

  class circle : public shape {
      int radius;
  public:
      // ...
      void draw(ostream&);
  };

╥ε σ±≥ⁿ, Ω≡≤π Φ∞σσ≥ Γ±σ ∩≡ΦτφαΩΦ ⌠Φπ≤≡√ Φ ∞εµσ≥ εß≡αßα≥√Γα≥ⁿ±  ΩαΩ ⌠Φπ≤≡α, φε Φ∞σσ≥ ≥αΩµσ Φ φσΩε≥ε≡√σ ±∩σ÷Φαδⁿφ√σ ±ΓεΘ±≥Γα, Ωε≥ε≡√σ Σεδµφ√ ≤≈Φ≥√Γα≥ⁿ±  ∩≡Φ σπε εß≡αßε≥Ωσ.
╫≥εß√ ∩εΣΣσ≡µΦΓα≥ⁿ Σδ  ≥αΩΦ⌡ Ωδα±±εΓ ±≥αφΣα≡≥φ≤■ ∩α≡αΣΦπ∞≤ Γ√ΓεΣα, ε∩σ≡α÷Φ  << ε∩≡σΣσδ σ≥±  ≥αΩ:
  ostream& operator<<(ostream& s, shape* p)
  {
      p->draw(s);
      return s;
  }

┼±δΦ next - Φ≥σ≡α≥ε≡ ≥Φ∩α ε∩≡σΣσδσφφεπε Γ #7.3.3, ≥ε ±∩Φ±εΩ ⌠Φπ≤≡ ≡α±∩σ≈α≥√Γασ≥±  φα∩≡Φ∞σ≡ ≥αΩ:
  while ( p = next() ) cout << p;

8.3 ╘αΘδ√ Φ ╧ε≥εΩΦ

8.3.1 ╚φΦ÷ΦαδΦτα÷Φ  ╧ε≥εΩεΓ ┬√ΓεΣα
8.3.2 ╟αΩ≡√≥Φσ ╧ε≥εΩεΓ ┬√ΓεΣα
8.3.3 ╬≥Ω≡√≥Φσ ╘αΘδεΓ
8.3.4 ╩ε∩Φ≡εΓαφΦσ ╧ε≥εΩεΓ

╧ε≥εΩΦ εß√≈φε ±Γ ταφ√ ± ⌠αΘδα∞Φ. ┴ΦßδΦε≥σΩα ∩ε≥εΩεΓ ±ετΣασ≥ ±≥αφΣα≡≥φ√Θ ∩ε≥εΩ ΓΓεΣα cin, ±≥αφΣα≡≥φ√Θ ∩ε≥εΩ Γ√ΓεΣα cout Φ ±≥αφΣα≡≥φ√Θ ∩ε≥εΩ ε°ΦßεΩ cerr. ╧≡επ≡α∞∞Φ±≥ ∞εµσ≥ ε≥Ω≡√Γα≥ⁿ Σ≡≤πΦσ ⌠αΘδ√ Φ ±ετΣαΓα≥ⁿ Σδ  φΦ⌡ ∩ε≥εΩΦ.

8.3.1 ╚φΦ÷ΦαδΦτα÷Φ  ╧ε≥εΩεΓ ┬√ΓεΣα

ostream Φ∞σσ≥ Ωεφ±≥≡≤Ω≥ε≡√:

  class ostream {
      // ...
      ostream(streambuf* s);      // ±Γ τ√Γασ≥ ± ß≤⌠σ≡ε∞ ∩ε≥εΩα
      ostream(int fd);            // ±Γ τ√ΓαφΦσ Σδ  ⌠αΘδα
      ostream(int size, char* p); // ±Γ τ√Γσ≥ ± ΓσΩ≥ε≡ε∞
  };

├δαΓφα  ≡αßε≥α ²≥Φ⌡ Ωεφ±≥≡≤Ω≥ε≡εΓ - ±Γ τ√Γα≥ⁿ ± ∩ε≥εΩε∞ ß≤⌠σ≡. streambuf - Ωδα±±, ≤∩≡αΓδ ■∙ΦΘ ß≤⌠σ≡α∞Φ; εφ ε∩Φ±√Γασ≥±  Γ
#8.6, ΩαΩ Φ Ωδα±± filebuf, ≤∩≡αΓδ ■∙ΦΘ streambuf Σδ  ⌠αΘδα. ╩δα±± filebuf  Γδ σ≥±  ∩≡εΦτΓεΣφ√∞ ε≥ Ωδα±±α streambuf.
╬∩Φ±αφΦσ ±≥αφΣα≡≥φ√⌡ ∩ε≥εΩεΓ Γ√ΓεΣα cout Φ cerr, Ωε≥ε≡εσ φα⌡εΣΦ≥±  Γ Φ±⌡εΣφ√⌡ ΩεΣα⌡ ßΦßδΦε≥σΩΦ ∩ε≥εΩεΓ ΓΓεΣα/Γ√ΓεΣα, Γ√πδ ΣΦ≥ ≥αΩ:
      // ε∩Φ±α≥ⁿ ∩εΣ⌡εΣ ∙σσ ∩≡ε±≥≡αφ±≥Γε ß≤⌠σ≡α
  char cout_buf[BUFSIZE]

      // ±Σσδα≥ⁿ "filebuf" Σδ  ≤∩≡αΓδσφΦ  ²≥Φ∞ ∩≡ε±≥≡αφ±≥Γε∞
      // ±Γ τα≥ⁿ σπε ± UNIX'εΓ±ΩΦ∞ ∩ε≥εΩε∞ Γ√ΓεΣα 1 (≤µσ ε≥Ω≡√≥√∞)
  filebuf cout_file(1,cout_buf,BUFSIZE);

      // ±Σσδα≥ⁿ ostream, εßσ±∩σ≈ΦΓα  ∩εδⁿτεΓα≥σδⁿ±ΩΦΘ Φφ≥σ≡⌠σΘ±
  ostream cout(&cout_file);

  char cerr_buf[1];

      // ΣδΦφα 0, ≥ε σ±≥ⁿ, φσß≤⌠σ≡ΦτεΓαφφ√Θ
      // UNIX'εΓ±ΩΦΘ ∩ε≥εΩ Γ√ΓεΣα 2 (≤µσ ε≥Ω≡√≥√Θ)
  filebuf cerr_file()2,cerr_buf,0;

  ostream cerr(&cerr_file);

╧≡Φ∞σ≡√ ΣΓ≤⌡ Σ≡≤πΦ⌡ Ωεφ±≥≡≤Ω≥ε≡εΓ ostream ∞εµφε φαΘ≥Φ Γ #8.3.3 Φ #8.5.

8.3.2 ╟αΩ≡√≥Φσ ╧ε≥εΩεΓ ┬√ΓεΣα

─σ±≥≡≤Ω≥ε≡ Σδ  ostream ±ß≡α±√Γασ≥ ß≤⌠σ≡ ± ∩ε∞ε∙ⁿ■ ε≥Ω≡√≥επε ≈δσφα ⌠≤φΩ÷ΦΦ ostream::flush():

  ostream::~ostream()
  {
      flush();       // ±ß≡ε±
  }

╤ß≡ε±Φ≥ⁿ ß≤⌠σ≡ ∞εµφε ≥αΩµσ Φ  Γφε. ═α∩≡Φ∞σ≡:
  cout.flush();

8.3.3 ╬≥Ω≡√≥Φσ ╘αΘδεΓ

╥ε≈φ√σ Σσ≥αδΦ ≥επε, ΩαΩ ε≥Ω≡√Γα■≥±  Φ ταΩ≡√Γα■≥±  ⌠αΘδ√, ≡ατδΦ≈α■≥±  Γ ≡ατφ√⌡ ε∩σ≡α÷Φεφφ√⌡ ±Φ±≥σ∞α⌡ Φ τΣσ±ⁿ ∩εΣ≡εßφε φσ ε∩Φ±√Γα■≥± . ╧ε±ΩεδⁿΩ≤ ∩ε±δσ ΓΩδ■≈σφΦ  ±≥αφεΓ ≥±  Σε±≥≤∩φ√ cin, cout Φ cerr, Γε ∞φεπΦ⌡ (σ±δΦ φσ Γε Γ±σ⌡) ∩≡επ≡α∞∞α⌡ φσ φ≤µφε Σσ≡µα≥ⁿ ΩεΣ Σδ  ε≥Ω≡√≥Φ  ⌠αΘδεΓ. ┬ε≥, εΣφαΩε, ∩≡επ≡α∞∞α, Ωε≥ε≡α  ε≥Ω≡√Γασ≥ ΣΓα ⌠αΘδα, ταΣαφφ√σ ΩαΩ ∩α≡α∞σ≥≡√ Ωε∞αφΣφεΘ ±≥≡εΩΦ, Φ Ωε∩Φ≡≤σ≥ ∩σ≡Γ√Θ Γε Γ≥ε≡εΘ:

  #include

  void error(char* s, char* s2)
  {
      cerr << s << " " << s2 << "\n";
      exit(1);
  }

  main(int argc, char* argv[])
  {
      if (argc != 3) error("φσΓσ≡φεσ ≈Φ±δε ∩α≡α∞σ≥≡εΓ","");

      filebuf f1;
      if (f1.open(argv[1],input) == 0)
          error("φσ ∞επ≤ ε≥Ω≡√≥ⁿ Γ⌡εΣφεΘ ⌠αΘδ",argv[1]);
      istream from(&f1);

      filebuf f2;
      if (f2.open(argv[2],output) == 0)
          error("φσ ∞επ≤ ±ετΣα≥ⁿ Γ√⌡εΣφεΘ ⌠αΘδ",argv[2]);
      ostream to(&f2);

      char ch;
      while (from.get(ch)) to.put(ch);

      if (!from.eof() !! to.bad())
          error("±δ≤≈Φδε±ⁿ φσ≈≥ε ±≥≡αφφεσ","");
  }

╧ε±δσΣεΓα≥σδⁿφε±≥ⁿ ΣσΘ±≥ΓΦΘ ∩≡Φ ±ετΣαφΦΦ ostream Σδ  Φ∞σφεΓαφφεπε ⌠αΘδα ≥α µσ, ≈≥ε Φ±∩εδⁿτ≤σ≥±  Σδ  ±≥αφΣα≡≥φ√⌡ ∩ε≥εΩεΓ: (1) ±φα≈αδα ±ετΣασ≥±  ß≤⌠σ≡ (τΣσ±ⁿ ²≥ε Σσδασ≥±  ∩ε±≡σΣ±≥Γε∞ ε∩Φ±αφΦ  filebuf); (2) τα≥σ∞ Ω φσ∞≤ ∩εΣ±εσΣΦφ σ≥±  ⌠αΘδ (τΣσ±ⁿ ²≥ε Σσδασ≥±  ∩ε±≡σΣ±≥Γε∞ ε≥Ω≡√≥Φ  ⌠αΘδα ± ∩ε∞ε∙ⁿ■ ⌠≤φΩ÷ΦΦ filebuf::open()); Φ, φαΩεφσ÷, (3) ±ετΣασ≥±  ±α∞ ostream ± filebuf Γ Ωα≈σ±≥Γσ ∩α≡α∞σ≥≡α. ╧ε≥εΩΦ ΓΓεΣα εß≡αßα≥√Γα■≥±  αφαδεπΦ≈φε.
╘αΘδ ∞εµσ≥ ε≥Ω≡√Γα≥ⁿ±  Γ εΣφεΘ Φτ ΣΓ≤⌡ ∞εΣ:
  enum open_mode { input, output };

─σΘ±≥ΓΦσ filebuf::open() ΓετΓ≡α∙ασ≥ 0, σ±δΦ φσ ∞εµσ≥ ε≥Ω≡√≥ⁿ ⌠αΘδ Γ ±εε≥Γσ≥±≥ΓΦσ ± ≥≡σßεΓαφΦσ∞. ┼±δΦ ∩εδⁿτεΓα≥σδⁿ ∩√≥ασ≥±  ε≥Ω≡√≥ⁿ ⌠αΘδ, Ωε≥ε≡επε φσ ±≤∙σ±≥Γ≤σ≥ Σδ  output, εφ ß≤Σσ≥ ±ετΣαφ.
╧σ≡σΣ ταΓσ≡°σφΦσ∞ ∩≡επ≡α∞∞α ∩≡εΓσ≡ σ≥, φα⌡εΣ ≥±  δΦ ∩ε≥εΩΦ Γ ∩≡Φσ∞δσ∞ε∞ ±ε±≥ε φΦΦ (±∞.
#8.4.2). ╧≡Φ ταΓσ≡°σφΦΦ ∩≡επ≡α∞∞√ ε≥Ω≡√≥√σ ⌠αΘδ√ φσ Γφε ταΩ≡√Γα■≥± .
╘αΘδ ∞εµφε ≥αΩµσ ε≥Ω≡√≥ⁿ εΣφεΓ≡σ∞σφφε Σδ  ≈≥σφΦ  Φ τα∩Φ±Φ, φε Γ ≥σ⌡ ±δ≤≈α ⌡, ΩεπΣα ²≥ε εΩατ√Γασ≥±  φσεß⌡εΣΦ∞ε, ∩α≡αΣΦπ∞α ∩ε≥εΩεΓ ≡σΣΩε εΩατ√Γασ≥±  ΦΣσαδⁿφεΘ. ╫α±≥ε δ≤≈°σ ≡α±±∞α≥≡ΦΓα≥ⁿ ≥αΩεΘ ⌠αΘδ ΩαΩ ΓσΩ≥ε≡ (πΦπαφ≥±ΩΦ⌡ ≡ατ∞σ≡εΓ). ╠εµφε ε∩≡σΣσδΦ≥ⁿ ≥Φ∩, Ωε≥ε≡√Θ ∩ετΓεδ σ≥ ∩≡επ≡α∞∞σ εß≡αßα≥√Γα≥ⁿ ⌠αΘδ ΩαΩ ΓσΩ≥ε≡; ±∞. ╙∩≡αµφσφΦ  8- 10.

8.3.4 ╩ε∩Φ≡εΓαφΦσ ╧ε≥εΩεΓ

┼±≥ⁿ Γετ∞εµφε±≥ⁿ Ωε∩Φ≡εΓα≥ⁿ ∩ε≥εΩΦ. ═α∩≡Φ∞σ≡:

  cout = cerr;

┬ ≡στ≤δⁿ≥α≥σ ²≥επε ∩εδ≤≈α■≥±  ΣΓσ ∩σ≡σ∞σφφ√σ, ±±√δα■∙Φσ±  φα εΣΦφ Φ ≥ε≥ µσ ∩ε≥εΩ. ├δαΓφ√∞ εß≡ατε∞ ²≥ε ß√Γασ≥ ∩εδστφε Σδ  ≥επε, ≈≥εß√ ±Σσδα≥ⁿ ±≥αφΣα≡≥φεσ Φ∞  Γ≡εΣσ cin ±±√δα■∙Φ∞±  φα ≈≥ε-≥ε Σ≡≤πεσ (∩≡Φ∞σ≡ ²≥επε ±∞. Γ
#3.1.6)

8.4 ┬ΓεΣ

8.4.1 ┬ΓεΣ ┬±≥≡εσφφ√⌡ ╥Φ∩εΓ
8.4.2 ╤ε±≥ε φΦ  ╧ε≥εΩα
8.4.3 ┬ΓεΣ ╥Φ∩εΓ, ╬∩≡σΣσδ σ∞√⌡ ╧εδⁿτεΓα≥σδσ∞
8.4.4 ╚φΦ÷ΦαδΦτα÷Φ  ╧ε≥εΩεΓ ┬ΓεΣα

┬ΓεΣ αφαδεπΦ≈σφ Γ√ΓεΣ≤. ╚∞σσ≥±  Ωδα±± istream, Ωε≥ε≡√Θ ∩≡σΣε±≥αΓδ σ≥ ε∩σ≡α÷Φ■ >> ("Γτ ≥ⁿ Φτ") Σδ  φσßεδⁿ°επε ∞φεµσ±≥Γα ±≥αφΣα≡≥φ√⌡ ≥Φ∩εΓ. ╘≤φΩ÷Φ  operator>> ∞εµσ≥ ε∩≡σΣσδ ≥ⁿ±  Σδ  ≥Φ∩α, ε∩≡σΣσδ σ∞επε ∩εδⁿτεΓα≥σδσ∞.

8.4.1 ┬ΓεΣ ┬±≥≡εσφφ√⌡ ╥Φ∩εΓ

╩δα±± istream ε∩≡σΣσδ σ≥±  ≥αΩ:

class istream {
      // ...
  public:
      istream& operator>>(char*);      // ±≥≡εΩα
      istream& operator>>(char&);      // ±Φ∞Γεδ
      istream& operator>>(short&);
      istream& operator>>(int&);
      istream& operator>>(long&);
      istream& operator>>(float&);
      istream& operator>>(double&);
      // ...
  };

╘≤φΩ÷ΦΦ ΓΓεΣα ε∩≡σΣσδ ■≥±  Γ ≥αΩε∞ Σ≤⌡σ:
  istream& istream::operator>>(char& c);
  {
          // ∩≡ε∩≤±Ωασ≥ ∩≡ε∩≤±ΩΦ
      int a;
          // φσΩΦ∞ εß≡ατε∞ ≈Φ≥ασ≥ ±Φ∞Γεδ Γ "a"
      c = a;
  }

╧≡ε∩≤±Ω ε∩≡σΣσδ σ≥±  ΩαΩ ±≥αφΣα≡≥φ√Θ ∩≡ε∩≤±Ω Γ C, ≈σ≡στ Γ√τεΓ isspase() Γ ≥ε∞ ΓΦΣσ, ΩαΩ εφα ε∩≡σΣσδσφα Γ (∩≡εßσδ, ≥αß≤δ ÷Φ , ±Φ∞Γεδ φεΓεΘ ±≥≡εΩΦ, ∩σ≡σΓεΣ ⌠ε≡∞α≥α Φ ΓετΓ≡α≥ Ωα≡σ≥ΩΦ).
┬ Ωα≈σ±≥Γσ αδⁿ≥σ≡φα≥ΦΓ√ ∞εµφε Φ±∩εδⁿτεΓα≥ⁿ ⌠≤φΩ÷ΦΦ get():
  class istream {
      // ...
      istream& get(char& c);                    // char
      istream& get(char* p, int n, int ='\n');  // ±≥≡εΩα
  };

╬φΦ εß≡αßα≥√Γα■≥ ±Φ∞Γεδ√ ∩≡ε∩≤±Ωα ≥αΩ µσ, ΩαΩ ε±≥αδⁿφ√σ ±Φ∞Γεδ√. ╘≤φΩ÷Φ  istream::get(char) ≈Φ≥ασ≥ εΣΦφ Φ ≥ε≥ µσ ±Φ∞Γεδ Γ ±ΓεΘ ∩α≡α∞σ≥≡; Σ≡≤πα  istream::get ≈Φ≥ασ≥ φσ ßεδσσ n ±Φ∞ΓεδεΓ Γ ΓσΩ≥ε≡ ±Φ∞ΓεδεΓ, φα≈Φφα■∙ΦΘ±  Γ p. ═σεß τα≥σδⁿφ√Θ ≥≡σ≥ΦΘ ∩α≡α∞σ≥≡ Φ±∩εδⁿτ≤σ≥±  Σδ  ταΣαφΦ  ±Φ∞Γεδα ε±≥αφεΓΩΦ (Φφα≈σ, ≥σ≡∞Φφα≥ε≡α ΦδΦ επ≡αφΦ≈Φ≥σδ ), ≥ε σ±≥ⁿ ²≥ε≥ ±Φ∞Γεδ ≈Φ≥α≥ⁿ±  φσ ß≤Σσ≥. ┼±δΦ ß≤Σσ≥ Γ±≥≡σ≈σφ ±Φ∞Γεδ επ≡αφΦ≈Φ≥σδⁿ, εφ ε±≥αφσ≥±  ΩαΩ ∩σ≡Γ√Θ ±Φ∞Γεδ ∩ε≥εΩα. ╧ε ≤∞εδ≈αφΦ■ Γ≥ε≡α  ⌠≤φΩ÷Φ  get ß≤Σσ≥ ≈Φ≥α≥ⁿ ±α∞εσ ßεδⁿ°σσ n ±Φ∞ΓεδεΓ, φε φσ ßεδⁿ°σ ≈σ∞ εΣφ≤ ±≥≡εΩ≤, '\n'  Γδ σ≥±  επ≡αφΦ≈Φ≥σδσ∞ ∩ε ≤∞εδ≈αφΦ■. ═σεß τα≥σδⁿφ√Θ ≥≡σ≥ΦΘ ∩α≡α∞σ≥≡ ταΣασ≥ ±Φ∞Γεδ, Ωε≥ε≡√Θ ≈Φ≥α≥ⁿ±  φσ ß≤Σσ≥. ═α∩≡Φ∞σ≡:
  cin.get(buf,256,'\t');

ß≤Σσ≥ ≈Φ≥α≥ⁿ Γ buf φσ ßεδσσ 256 ±Φ∞ΓεδεΓ, α σ±δΦ Γ±≥≡σ≥Φ≥±  ≥αß≤δ ÷Φ  ('\t'), ≥ε ²≥ε ∩≡ΦΓσΣσ≥ Ω ΓετΓ≡α≥≤ Φτ get. ┬ ²≥ε∞ ±δ≤≈ασ ±δσΣ≤■∙Φ∞ ±Φ∞Γεδε∞, Ωε≥ε≡√Θ ß≤Σσ≥ ±≈Φ≥αφ Φτ cin, ß≤Σσ≥ '\t'.
╤≥αφΣα≡≥φ√Θ ταπεδεΓε≈φ√Θ ⌠αΘδ ε∩≡σΣσδ σ≥ φσ±ΩεδⁿΩε ⌠≤φΩ÷ΦΘ, Ωε≥ε≡√σ ∞επ≤≥ εΩατα≥ⁿ±  ∩εδστφ√∞Φ ∩≡Φ ε±≤∙σ±≥ΓδσφΦΦ ΓΓεΣα:
  int isalpha(char)    // 'a'..'z' 'A'..'Z'
  int isupper(char)    // 'A'..'Z'
  int islower(char)    // 'a'..'z'
  int isdigit(char)    // '0'..'9'
  int isxdigit(char)   // '0'..'9' 'a'..'f' 'A'..'F'
  int isspase(char)    // ' ' '\t' ΓετΓ≡α≥ φεΓα  ±≥≡εΩα
                       // ∩σ≡σΓεΣ ⌠ε≡∞α≥α
  int iscntrl(char)    // ≤∩≡αΓδ ■∙ΦΘ ±Φ∞Γεδ
                       // (ASCII 0..31 Φ 127)
  int ispunct(char)    // ∩≤φΩ≥≤α÷Φ : φΦεΣΦφ Φτ Γ√°σ∩σ≡σ≈Φ±δσφφ√⌡
  int isalnum(char)    // isalpha() | isdigit()
  int isprint(char)    // ∩σ≈α≥ασ∞√Θ: ascii ' '..'-'
  int isgraph(char)    // isalpha() | isdigit() | ispunct()
  int isascii(char c)  { return 0<=c &&c<=127; }

┬±σ Ω≡ε∞σ isascii() ≡σαδΦτ≤■≥±  Γφσ°φσ εΣΦφαΩεΓε, ± ∩≡Φ∞σφσφΦσ∞ ±Φ∞Γεδα Γ Ωα≈σ±≥Γσ ΦφΣσΩ±α Γ ≥αßδΦ÷σ α≥≡Φß≤≥εΓ ±Φ∞ΓεδεΓ. ╧ε²≥ε∞≤ ≥αΩΦσ Γ√≡αµσφΦ , ΩαΩ
  (('a'<=c && c<='z') || ('A'<=c && c<='Z')) // αδ⌠αΓΦ≥φ√Θ

φσ ≥εδⁿΩε ≤≥ε∞Φ≥σδⁿφε ∩Φ°≤≥±  Φ ≈≡σΓα≥√ ε°ΦßΩα∞Φ (φα ∞α°Φφσ ± φαßε≡ε∞ ±Φ∞ΓεδεΓ EBCDIC εφε ß≤Σσ≥ ∩≡ΦφΦ∞α≥ⁿ φσαδ⌠αΓΦ≥φ√σ ±Φ∞Γεδ√), εφΦ ≥αΩµσ Φ ∞σφσσ ²⌠⌠σΩ≥ΦΓφ√, ≈σ∞ ∩≡Φ∞σφσφΦσ ±≥αφΣα≡≥φεΘ ⌠≤φΩ÷ΦΦ:
  isalpha(c)

8.4.2 ╤ε±≥ε φΦ  ╧ε≥εΩα

╩αµΣ√Θ ∩ε≥εΩ (istream ΦδΦ ostream) Φ∞σσ≥ α±±ε÷ΦΦ≡εΓαφφεσ ± φΦ∞ ±ε±≥ε φΦσ, Φ εß≡αßε≥Ωα ε°ΦßεΩ Φ φσ±≥αφΣα≡≥φ√⌡ ≤±δεΓΦΘ ε±≤∙σ±≥Γδ σ≥±  ± ∩ε∞ε∙ⁿ■ ±εε≥Γσ≥±≥Γ≤■∙σΘ ≤±≥αφεΓΩΦ Φ ∩≡εΓσ≡ΩΦ ²≥επε ±ε±≥ε φΦ .
╧ε≥εΩ ∞εµσ≥ φα⌡εΣΦ≥ⁿ±  Γ εΣφε∞ Φτ ±δσΣ≤■∙Φ⌡ ±ε±≥ε φΦΘ:

  enum stream_state { _good, _eof, _fail, _bad };

┼±δΦ ±ε±≥ε φΦσ _good ΦδΦ _eof, τφα≈Φ≥ ∩ε±δσΣφ   ε∩σ≡α÷Φ  ΓΓεΣα ∩≡ε°δα ≤±∩σ°φε. ┼±δΦ ±ε±≥ε φΦσ _good, ≥ε ±δσΣ≤■∙α  ε∩σ≡α÷Φ  ΓΓεΣα ∞εµσ≥ ∩≡εΘ≥Φ ≤±∩σ°φε, Γ ∩≡ε≥ΦΓφε∞ ±δ≤≈ασ εφα ταΩεφ≈Φ≥±  φσ≤Σα≈σΘ. ─≡≤πΦ∞Φ ±δεΓα∞Φ, ∩≡Φ∞σφσφΦσ ε∩σ≡α÷ΦΦ ΓΓεΣα Ω ∩ε≥εΩ≤, Ωε≥ε≡√Θ φσ φα⌡εΣΦ≥±  Γ ±ε±≥ε φΦΦ _good,  Γδ σ≥±  ∩≤±≥εΘ ε∩σ≡α÷ΦσΘ. ┼±δΦ Σσδασ≥±  ∩ε∩√≥Ωα ≈Φ≥α≥ⁿ Γ ∩σ≡σ∞σφφ≤■ v, Φ ε∩σ≡α÷Φ  εΩαφ≈ΦΓασ≥±  φσ≤Σα≈σΘ, τφα≈σφΦσ v Σεδµφε ε±≥α≥ⁿ±  φσΦτ∞σφφ√∞ (εφε ß≤Σσ≥ φσΦτ∞σφφ√∞, σ±δΦ v Φ∞σσ≥ εΣΦφ Φτ ≥σ⌡ ≥Φ∩εΓ, Ωε≥ε≡√σ εß≡αßα≥√Γα■≥±  ⌠≤φΩ÷Φ ∞Φ ≈δσφα∞Φ istream ΦδΦ ostream). ╬≥δΦ≈Φ  ∞σµΣ≤ ±ε±≥ε φΦ ∞Φ _fail Φ _bad ε≈σφⁿ φστφα≈Φ≥σδⁿφε Φ ∩≡σΣ±≥αΓδ σ≥ Φφ≥σ≡σ± ≥εδⁿΩε Σδ  ≡ατ≡αßε≥≈ΦΩεΓ ε∩σ≡α÷ΦΘ ΓΓεΣα. ┬ ±ε±≥ε φΦΦ _fail ∩≡σΣ∩εδαπασ≥± , ≈≥ε ∩ε≥εΩ φσ Φ±∩ε≡≈σφ Φ φΦΩαΩΦσ ±Φ∞Γεδ√ φσ ∩ε≥σ≡ φ√. ┬ ±ε±≥ε φΦΦ _bad ∞εµσ≥ ß√≥ⁿ Γ±σ ≈≥ε ≤πεΣφε.
╤ε±≥ε φΦσ ∩ε≥εΩα ∞εµφε ∩≡εΓσ≡ ≥ⁿ φα∩≡Φ∞σ≡ ≥αΩ:
switch (cin.rdstate()) {
  case _good:
      // ∩ε±δσΣφ   ε∩σ≡α÷Φ  φαΣ cin ∩≡ε°δα ≤±∩σ°φε
      break;
  case _eof:
      // Ωεφσ÷ ⌠αΘδα
      break;
  case _fail:
      // φσΩεσπε ≡εΣα ε°ΦßΩα ⌠ε≡∞α≥Φ≡εΓαφΦ 
      // Γετ∞εµφε, φσ ±δΦ°Ωε∞ ∩δε⌡α 
      break;
  case _bad:
      // Γετ∞εµφε, ±Φ∞Γεδ√ cin ∩ε≥σ≡ φ√
      break;
  }

─δ  δ■ßεΘ ∩σ≡σ∞σφφεΘ z ≥Φ∩α, Σδ  Ωε≥ε≡επε ε∩≡σΣσδσφ√ ε∩σ≡α÷ΦΦ << Φ >>, Ωε∩Φ≡≤■∙ΦΘ ÷ΦΩδ ∞εµφε φα∩Φ±α≥ⁿ ≥αΩ:
  while (cin>>z) cout << z << "\n";

═α∩≡Φ∞σ≡, σ±δΦ z - ΓσΩ≥ε≡ ±Φ∞ΓεδεΓ, ²≥ε≥ ÷ΦΩδ ß≤Σσ≥ ß≡α≥ⁿ ±≥αφΣα≡≥φ√Θ ΓΓεΣ Φ ∩ε∞σ∙α≥ⁿ σπε Γ ±≥αφΣα≡≥φ√Θ Γ√ΓεΣ ∩ε εΣφε∞≤ ±δεΓ≤ (≥ε σ±≥ⁿ, ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ±Φ∞ΓεδεΓ ßστ ∩≡εßσδα) φα ±≥≡εΩ≤.
╩επΣα Γ Ωα≈σ±≥Γσ ≤±δεΓΦ  Φ±∩εδⁿτ≤σ≥±  ∩ε≥εΩ, ∩≡εΦ±⌡εΣΦ≥ ∩≡εΓσ≡Ωα ±ε±≥ε φΦ  ∩ε≥εΩα Φ ²≥α ∩≡εΓσ≡Ωα ∩≡ε⌡εΣΦ≥ ≤±∩σ°φε (≥ε σ±≥ⁿ, τφα≈σφΦσ ≤±δεΓΦ  φσ φεδⁿ) ≥εδⁿΩε σ±δΦ ±ε±≥ε φΦσ _good. ┬ ≈α±≥φε±≥Φ, Γ ∩≡σΣ√Σ≤∙σ∞ ÷ΦΩδσ ∩≡εΓσ≡ δε±ⁿ ±ε±≥ε φΦσ istream, Ωε≥ε≡εσ ΓετΓ≡α∙ασ≥ cin>>z. ╫≥εß√ εßφα≡≤µΦ≥ⁿ, ∩ε≈σ∞≤ ÷ΦΩδ ΦδΦ ∩≡εΓσ≡Ωα ταΩεφ≈ΦδΦ±ⁿ φσ≤Σα≈φε, ∞εµφε Φ±±δσΣεΓα≥ⁿ ±ε±≥ε φΦσ. ╥αΩα  ∩≡εΓσ≡Ωα ∩ε≥εΩα ≡σαδΦτ≤σ≥±  ε∩σ≡α÷ΦσΘ ∩≡σεß≡ατεΓαφΦ  (
#6.3.2).
─σδα≥ⁿ ∩≡εΓσ≡Ω≤ φα φαδΦ≈Φσ ε°ΦßεΩ ΩαµΣεπε ΓΓεΣα ΦδΦ Γ√ΓεΣα ΣσΘ±≥ΓΦ≥σδⁿφε φσ ε≈σφⁿ ≤Σεßφε, Φ εß√≈φε Φ±≥ε≈φΦΩε∞ ε°ΦßεΩ ±δ≤µΦ≥ ∩≡επ≡α∞∞Φ±≥, φσ ±ΣσδαΓ°ΦΘ ²≥επε Γ ≥ε∞ ∞σ±≥σ, πΣσ ²≥ε ±≤∙σ±≥Γσφφε. ═α∩≡Φ∞σ≡, ε∩σ≡α÷ΦΦ Γ√ΓεΣα εß√≈φε φσ ∩≡εΓσ≡ ■≥± , φε εφΦ ∞επ≤≥ ±δ≤≈αΘφε φσ ±≡αßε≥α≥ⁿ. ╧α≡αΣΦπ∞α ∩ε≥εΩα ΓΓεΣα/Γ√ΓεΣα ∩ε±≥≡εσφα ≥αΩ, ≈≥εß√ ΩεπΣα Γ C++ ∩ε ΓΦ≥±  (σ±δΦ ²≥ε ∩≡εΦτεΘΣσ≥) ∞σ⌡αφΦτ∞ εß≡αßε≥ΩΦ Φ±Ωδ■≈Φ≥σδⁿφ√⌡ ±Φ≥≤α÷ΦΘ (ΩαΩ ±≡σΣ±≥Γε  τ√Ωα ΦδΦ ΩαΩ ±≥αφΣα≡≥φα  ßΦßδΦε≥σΩα) σπε ß≤Σσ≥ δσπΩε ∩≡Φ∞σφΦ≥ⁿ Σδ  ≤∩≡ε∙σφΦ  Φ ±≥αφΣα≡≥Φτα÷ΦΦ εß≡αßε≥ΩΦ ε°ΦßεΩ Γ ∩ε≥εΩα⌡ ΓΓεΣα/Γ√ΓεΣα.

8.4.3 ┬ΓεΣ ╥Φ∩εΓ, ╬∩≡σΣσδ σ∞√⌡ ╧εδⁿτεΓα≥σδσ∞

┬ΓεΣ Σδ  ∩εδⁿτεΓα≥σδⁿ±Ωεπε ≥Φ∩α ∞εµσ≥ ε∩≡σΣσδ ≥ⁿ±  ≥ε≈φε ≥αΩ µσ, ΩαΩ Γ√ΓεΣ, τα ≥σ∞ Φ±Ωδ■≈σφΦσ∞, ≈≥ε Σδ  ε∩σ≡α÷ΦΦ ΓΓεΣα Γαµφε, ≈≥εß√ Γ≥ε≡εΘ ∩α≡α∞σ≥≡ ß√δ ±±√δε≈φεπε ≥Φ∩α. ═α∩≡Φ∞σ≡:

  istream& operator>>(istream& s, complex& a)
  /*
      ⌠ε≡∞α≥√ ΓΓεΣα Σδ  complex; "f" εßετφα≈ασ≥ float:
      f
      ( f )
      ( f , f )
  */
  {
      double re = 0, im = 0;
      char c = 0;

      s >> c;
      if (c == '(') {
          s >> re >> c;
          if (c == ',') s >> im >> c;
          if (c != ')') s.clear(_bad);    // ≤±≥αφεΓΦ≥ⁿ state
      }
      else {
          s.putback(c);
          s >> re;
      }

      if (s) a = complex(re,im);
      return s;
  }

═σ±∞ε≥≡  φα ≥ε, ≈≥ε φσ ⌡Γα≥ασ≥ ΩεΣα εß≡αßε≥ΩΦ ε°ΦßεΩ, ßεδⁿ°≤■ ≈α±≥ⁿ ΓΦΣεΓ ε°ΦßεΩ ²≥ε φα ±α∞ε∞ Σσδσ εß≡αßα≥√Γα≥ⁿ ß≤Σσ≥. ╦εΩαδⁿφα  ∩σ≡σ∞σφφα  c ΦφΦ÷ΦαδΦτΦ≡≤σ≥± , ≈≥εß√ σσ τφα≈σφΦσ φσ εΩαταδε±ⁿ ±δ≤≈αΘφε '(' ∩ε±δσ ≥επε, ΩαΩ ε∩σ≡α÷Φ  εΩεφ≈Φ≥±  φσ≤Σα≈φε. ╟αΓσ≡°α■∙α  ∩≡εΓσ≡Ωα ±ε±≥ε φΦ  ∩ε≥εΩα πα≡αφ≥Φ≡≤σ≥, ≈≥ε τφα≈σφΦσ ∩α≡α∞σ≥≡α a ß≤Σσ≥ Φτ∞σφ ≥ⁿ±  ≥εδⁿΩε Γ ≥ε∞ ±δ≤≈ασ, σ±δΦ Γ±σ ΦΣσ≥ ⌡ε≡ε°ε.
╬∩σ≡α÷Φ  ≤±≥αφεΓΩΦ ±ε±≥ε φΦ  φατΓαφα clear() (ε≈Φ±≥Φ≥ⁿ), ∩ε≥ε∞≤ ≈≥ε εφα ≈α∙σ Γ±σπε Φ±∩εδⁿτ≤σ≥±  Σδ  ≤±≥αφεΓΩΦ ±ε±≥ε φΦ  ∩ε≥εΩα ταφεΓε ΩαΩ _good. _good  Γδ σ≥±  τφα≈σφΦσ∞ ∩α≡α∞σ≥≡α ∩ε ≤∞εδ≈αφΦ■ Φ Σδ  istream::clear(), Φ Σδ  ostream::clear().
═αΣ ε∩σ≡α÷Φ ∞Φ ΓΓεΣα φαΣε ∩ε≡αßε≥α≥ⁿ σ∙σ. ┴√δε ß√, Γ ≈α±≥φε±≥Φ, τα∞σ≈α≥σδⁿφε, σ±δΦ ß√ ∞εµφε ß√δε ταΣαΓα≥ⁿ ΓΓεΣ Γ ≥σ≡∞Φφα⌡ °αßδεφα (ΩαΩ Γ  τ√Ωα⌡ ╤φεßεδ Φ ╚Ωεφ), α ∩ε≥ε∞ ∩≡εΓσ≡ ≥ⁿ, ∩≡ε°δα δΦ ≤±∩σ°φα Γ±  ε∩σ≡α÷Φ  ΓΓεΣα. ╥αΩΦσ ε∩σ≡α÷ΦΦ Σεδµφ√ ß√δΦ ß√, Ωεφσ≈φε, εßσ±∩σ≈ΦΓα≥ⁿ φσΩε≥ε≡≤■ Σε∩εδφΦ≥σδⁿφ≤■ ß≤⌠σ≡Φτα÷Φ■, ≈≥εß√ εφΦ ∞επδΦ Γε±±≥αφαΓδΦΓα≥ⁿ ∩ε≥εΩ ΓΓεΣα Γ σπε Φ±⌡εΣφεσ ±ε±≥ε φΦσ ∩ε±δσ φσ≤Σα≈φεΘ ∩ε∩√≥ΩΦ ≡α±∩ετφαΓαφΦ .

8.4.4 ╚φΦ÷ΦαδΦτα÷Φ  ╧ε≥εΩεΓ ┬ΓεΣα

┼±≥σ±≥Γσφφε, ≥Φ∩ istream, ≥αΩ µσ ΩαΩ Φ ostream, ±φαßµσφ Ωεφ±≥≡≤Ω≥ε≡ε∞:

  class istream {
      // ...
      istream(streambuf* s, int sk =1, ostream* t =0);
      istream(int size, char* p, int sk =1);
      istream(int fd, int sk =1, ostream* t =0);
  };

╧α≡α∞σ≥≡ sk ταΣασ≥, Σεδµφ√ ∩≡ε∩≤±Ωα≥ⁿ±  ∩≡ε∩≤±ΩΦ ΦδΦ φσ≥. ╧α≡α∞σ≥≡ t (φσεß τα≥σδⁿφ√Θ) ταΣασ≥ ≤Ωατα≥σδⁿ φα ostream, Ω Ωε≥ε≡ε∞≤ ∩≡ΦΩ≡σ∩δσφ istream. ═α∩≡Φ∞σ≡, cin ∩≡ΦΩ≡σ∩δσφ Ω cout; ²≥ε τφα≈Φ≥, ≈≥ε ∩σ≡σΣ ≥σ∞, ΩαΩ ∩ε∩√≥α≥ⁿ±  ≈Φ≥α≥ⁿ ±Φ∞Γεδ√ Φτ ±Γεσπε ⌠αΘδα, cin Γ√∩εδφ σ≥
  cout.flush(); // ∩Φ°σ≥ ß≤⌠σ≡ Γ√ΓεΣα

╤ ∩ε∞ε∙ⁿ■ ⌠≤φΩ÷ΦΦ istream::tie() ∞εµφε ∩≡ΦΩ≡σ∩Φ≥ⁿ (ΦδΦ ε≥Ω≡σ∩Φ≥ⁿ, ± ∩ε∞ε∙ⁿ■ tie(0)) δ■ßεΘ ostream Ω δ■ßε∞≤ istream. ═α∩≡Φ∞σ≡:
  int y_or_n(ostream& to, istream& from)
  /*
       "to", ∩εδ≤≈ασ≥ ε≥ΩδΦΩ Φτ "from"
  */
  {
      ostream* old = from.tie(&to);
      for (;;) {
          cout << "φαßσ≡Φ≥σ Y ΦδΦ N: ";
          char ch = 0;
          if (!cin.get(ch)) return 0;

          if (ch != '\n') { // ∩≡ε∩≤±Ωασ≥ ε±≥α≥εΩ ±≥≡εΩΦ
              char ch2 = 0;
              while (cin.get(ch2) && ch2 != '\n') ;
          }
          switch (ch) {
          case 'Y':
          case 'y':
          case '\n':
              from.tie(old);        // Γε±±≥αφαΓδΦΓασ≥ ±≥α≡√Θ tie
              return 1;
          case 'N':
          case 'n':
              from.tie(old);        // Γε±±≥αφαΓδΦΓασ≥ ±≥α≡√Θ tie
              return 0;
          default:
              cout << "ΦτΓΦφΦ≥σ, ∩ε∩≡εß≤Θ≥σ σ∙σ ≡ατ: ";
          }
      }
  }

╩επΣα Φ±∩εδⁿτ≤σ≥±  ß≤⌠σ≡ΦτεΓαφφ√Θ ΓΓεΣ (ΩαΩ ²≥ε ∩≡εΦ±⌡εΣΦ≥ ∩ε ≤∞εδ≈αφΦ■), ∩εδⁿτεΓα≥σδⁿ φσ ∞εµσ≥ φαß≡αΓ ≥εδⁿΩε εΣφ≤ ß≤ΩΓ≤ εµΦΣα≥ⁿ ε≥ΩδΦΩα. ╤Φ±≥σ∞α µΣσ≥ ∩ε ΓδσφΦ  ±Φ∞Γεδα φεΓεΘ ±≥≡εΩΦ. y_or_n() ±∞ε≥≡Φ≥ φα ∩σ≡Γ√Θ ±Φ∞Γεδ ±≥≡εΩΦ, α ε±≥αδⁿφ√σ Φπφε≡Φ≡≤σ≥.
╤Φ∞Γεδ ∞εµφε Γσ≡φ≤≥ⁿ Γ ∩ε≥εΩ ± ∩ε∞ε∙ⁿ■ ⌠≤φΩ÷ΦΦ istream::putback(char). ▌≥ε ∩ετΓεδ σ≥ ∩≡επ≡α∞∞σ "ταπδ Σ√Γα≥ⁿ Γ∩σ≡σΣ" Γ ∩ε≥εΩ ΓΓεΣα.

8.5 ╨αßε≥α ±ε ╤≥≡εΩα∞Φ

╠εµφε ε±≤∙σ±≥Γδ ≥ⁿ ΣσΘ±≥ΓΦ , ∩εΣεßφ√σ ΓΓεΣ≤/Γ√ΓεΣ≤, φαΣ ±Φ∞Γεδⁿφ√∞ ΓσΩ≥ε≡ε∞, ∩≡ΦΩ≡σ∩δ   Ω φσ∞≤ istream ΦδΦ ostream. ═α∩≡Φ∞σ≡, σ±δΦ ΓσΩ≥ε≡ ±εΣσ≡µΦ≥ εß√≈φ≤■ ±≥≡εΩ≤, ταΓσ≡°α■∙≤■±  φ≤δσ∞, Σδ  ∩σ≈α≥Φ ±δεΓ Φτ ²≥επε ΓσΩ≥ε≡α ∞εµφε Φ±∩εδⁿτεΓα≥ⁿ ∩≡ΦΓσΣσφφ√Θ Γ√°σ Ωε∩Φ≡≤■∙ΦΘ ÷ΦΩδ:

  void word_per_line(char v[], int sz)
  /*
      ∩σ≈α≥σ≥ "v" ≡ατ∞σ≡α "sz" ∩ε εΣφε∞≤ ±δεΓ≤ φα ±≥≡εΩσ
  */
  {
      istream ist(sz,v); // ±Σσδα≥ⁿ istream Σδ  v
      char b2[MAX];      // ßεδⁿ°σ φαΦßεδⁿ°σπε ±δεΓα
      while (ist>>b2) cout << b2 << "\n";
  }

╟αΓσ≡°α■∙ΦΘ φ≤δσΓεΘ ±Φ∞Γεδ Γ ²≥ε∞ ±δ≤≈ασ Φφ≥σ≡∩≡σ≥Φ≡≤σ≥±  ΩαΩ ±Φ∞Γεδ Ωεφ÷α ⌠αΘδα.
┬ ∩ε∞ε∙ⁿ■ ostream ∞εµφε ε≥⌠ε≡∞α≥Φ≡εΓα≥ⁿ ±εεß∙σφΦ , Ωε≥ε≡√σ φσ φ≤µφε ∩σ≈α≥α≥ⁿ ≥ε≥≈α± µσ:
  char* p = new char[message_size];
  ostream ost(message_size,p);
  do_something(arguments,ost);
  display(p);

╥αΩα  ε∩σ≡α÷Φ , ΩαΩ do_something, ∞εµσ≥ ∩Φ±α≥ⁿ Γ ∩ε≥εΩ ost, ∩σ≡σΣαΓα≥ⁿ ost ±ΓεΦ∞ ∩εΣε∩σ≡α÷Φ ∞ Φ ≥.Σ. ± ∩ε∞ε∙ⁿ■ ±≥αφΣα≡≥φ√⌡ ε∩σ≡α÷ΦΘ Γ√ΓεΣα. ═σ≥ φσεß⌡εΣΦ∞ε±≥Φ Σσδα≥ⁿ ∩≡εΓσ≡Ω≤ φσ ∩σ≡σ∩εδφσφΦσ, ∩ε±ΩεδⁿΩ≤ ost τφασ≥ ±Γε■ ΣδΦφ≤ Φ ΩεπΣα εφ ß≤Σσ≥ ∩σ≡σ∩εδφ ≥ⁿ± , εφ ß≤Σσ≥ ∩σ≡σ⌡εΣΦ≥ⁿ Γ ±ε±≥ε φΦσ _fail. ╚, φαΩεφσ÷, display ∞εµσ≥ ∩Φ±α≥ⁿ ±εεß∙σφΦ  Γ "φα±≥ε ∙ΦΘ" ∩ε≥εΩ Γ√ΓεΣα. ▌≥ε≥ ∞σ≥εΣ ∞εµσ≥ εΩατα≥ⁿ±  φαΦßεδσσ ∩εδστφ√∞, ≈≥εß√ ±∩≡αΓδ ≥ⁿ±  ± ±Φ≥≤α÷Φ ∞Φ, Γ Ωε≥ε≡√⌡ εΩεφ≈α≥σδⁿφεσ ε≥εß≡αµσφΦσ Σαφφ√⌡ ΓΩδ■≈ασ≥ Γ ±σß  φσ≈≥ε ßεδσσ ±δεµφεσ, ≈σ∞ ≡αßε≥≤ ± ≥≡αΣΦ÷Φεφφ√∞ ∩ε±≥≡ε≈φ√∞ ≤±≥≡εΘ±≥Γε∞ Γ√ΓεΣα. ═α∩≡Φ∞σ≡, ≥σΩ±≥ Φτ ost ∞επ ß√ ∩ε∞σ∙α≥ⁿ±  Γ ≡α±∩εδαπα■∙≤■±  πΣσ-≥ε φα ²Ω≡αφσ εßδα±≥ⁿ ⌠ΦΩ±Φ≡εΓαφφεπε ≡ατ∞σ≡α.

8.6 ┴≤⌠σ≡Φτα÷Φ 

╧≡Φ ταΣαφΦΦ ε∩σ≡α÷ΦΘ ΓΓεΣα/Γ√ΓεΣα ∞√ φΦΩαΩ φσ Ωα±αδΦ±ⁿ ≥Φ∩εΓ ⌠αΘδεΓ, φε ΓσΣⁿ φσ Γ±σ ≤±≥≡εΘ±≥Γα ∞εµφε ≡α±±∞α≥≡ΦΓα≥ⁿ εΣΦφαΩεΓε ± ≥ε≈ΩΦ τ≡σφΦ  ±≥≡α≥σπΦΦ ß≤⌠σ≡Φτα÷ΦΦ. ═α∩≡Φ∞σ≡, Σδ  ostream, ∩εΣΩδ■≈σφφεπε Ω ±Φ∞ΓεδⁿφεΘ ±≥≡εΩσ, ≥≡σß≤σ≥±  ß≤⌠σ≡Φτα÷Φ  Σ≡≤πεπε ΓΦΣα, φσµσδΦ Σδ  ostream, ∩εΣΩδ■≈σφφεπε Ω ⌠αΘδ≤. ╤ ²≥Φ∞Φ ∩≡εßδσ∞α∞Φ ∞εµφε ±∩≡αΓΦ≥ⁿ± , ταΣαΓα  ≡ατδΦ≈φ√σ ß≤⌠σ≡φ√σ ≥Φ∩√ Σδ  ≡ατφ√⌡ ∩ε≥εΩεΓ Γ ∞ε∞σφ≥ ΦφΦ÷ΦαδΦτα÷ΦΦ (εß≡α≥Φ≥σ ΓφΦ∞αφΦσ φα ≥≡Φ Ωεφ±≥≡≤Ω≥ε≡α Ωδα±±α ostream). ┼±≥ⁿ ≥εδⁿΩε εΣΦφ φαßε≡ ε∩σ≡α÷ΦΘ φαΣ ²≥Φ∞Φ ß≤⌠σ≡φ√∞Φ ≥Φ∩α∞Φ, ∩ε²≥ε∞≤ Γ ⌠≤φΩ÷Φ ⌡ ostream φσ≥ ΩεΣα, Φ⌡ ≡ατδΦ≈α■∙σπε. ╬ΣφαΩε ⌠≤φΩ÷ΦΦ, Ωε≥ε≡√σ εß≡αßα≥√Γα■≥ ∩σ≡σ∩εδφσφΦσ ±Γσ≡⌡≤ Φ ±φΦτ≤, ΓΦ≡≥≤αδⁿφ√σ. ▌≥επε Σε±≥α≥ε≈φε, ≈≥εß√ ±∩≡αΓδ ≥ⁿ±  ± φσεß⌡εΣΦ∞εΘ Γ Σαφφεσ Γ≡σ∞  ±≥≡α≥σπΦσΘ ß≤⌠σ≡Φτα÷ΦΦ. ▌≥ε ≥αΩµσ ±δ≤µΦ≥ ⌡ε≡ε°Φ∞ ∩≡Φ∞σ≡ε∞ ∩≡Φ∞σφσφΦ  ΓΦ≡≥≤αδⁿφ√⌡ ⌠≤φΩ÷ΦΘ Σδ  ≥επε, ≈≥εß√ ±Σσδα≥ⁿ Γετ∞εµφεΘ εΣφε≡εΣφ≤■ εß≡αßε≥Ω≤ δεπΦ≈σ±ΩΦ ²ΩΓΦΓαδσφ≥φ√⌡ ±≡σΣ±≥Γ ± ≡ατδΦ≈φεΘ ≡σαδΦτα÷ΦσΘ. ╬∩Φ±αφΦσ ß≤⌠σ≡α ∩ε≥εΩα Γ Γ√πδ ΣΦ≥ ≥αΩ:

  struct streambuf {      // ≤∩≡αΓδσφΦσ ß≤⌠σ≡ε∞ ∩ε≥εΩα

      char* base;         // φα≈αδε ß≤⌠σ≡α
      char* pptr;         // ±δσΣ≤■∙ΦΘ ±ΓεßεΣφ√Θ char
      char* qptr;         // ±δσΣ≤■∙ΦΘ τα∩εδφσφφ√Θ char
      char* eptr;         // εΣΦφ Φτ Ωεφ÷εΓ ß≤⌠σ≡α
      char  alloc;        // ß≤⌠σ≡, Γ√Σσδσφφ√Θ ± ∩ε∞ε∙ⁿ■ new

          // ╬∩≤±≥ε°ασ≥ ß≤⌠σ≡:
          // ┬ετΓ≡α∙ασ≥ EOF ∩≡Φ ε°ΦßΩσ Φ 0 Γ ±δ≤≈ασ ≤±∩σ⌡α
      virtual int overflow(int c =EOF);

          // ╟α∩εδφ σ≥ ß≤⌠σ≡
          // ┬ετΓ≡α∙σ≥ EOF ∩≡Φ ε°ΦßΩσ ΦδΦ Ωεφ÷σ ΓΓεΣα,
          // Φφα≈σ ±δσΣ≤■∙ΦΘ char
      virtual int underflow();

      int snextc()        // ßσ≡σ≥ ±δσΣ≤■∙ΦΘ char
      {
          return (++qptr==pptr) ? underflow() : *qptr&0377;
      }

      // ...

      int allocate()      // Γ√Σσδ σ≥ φσΩε≥ε≡εσ ∩≡ε±≥≡αφ±≥Γε ß≤⌠σ≡α

      streambuf() { /* ... */}
      streambuf(char* p, int l) { /* ... */}
      ~streambuf() { /* ... */}
  };

╬ß≡α≥Φ≥σ ΓφΦ∞αφΦσ, ≈≥ε τΣσ±ⁿ ε∩≡σΣσδ ■≥±  ≤Ωατα≥σδΦ, φσεß⌡εΣΦ∞√σ Σδ  ≡αßε≥√ ± ß≤⌠σ≡ε∞, ∩ε²≥ε∞≤ εß√≈φ√σ ∩ε±Φ∞Γεδⁿφ√σ ΣσΘ±≥ΓΦ  ∞εµφε ε∩≡σΣσδΦ≥ⁿ (≥εδⁿΩε εΣΦφ ≡ατ) Γ ΓΦΣσ ∞αΩ±Φ∞αδⁿφε ²⌠⌠σΩ≥ΦΓφ√⌡ inline- ⌠≤φΩ÷ΦΘ. ─δ  ΩαµΣεΘ ΩεφΩ≡σ≥φεΘ ±≥≡α≥σπΦΦ ß≤⌠σ≡Φτα÷ΦΦ φσεß⌡εΣΦ∞ε ε∩≡σΣσδ ≥ⁿ ≥εδⁿΩε ⌠≤φΩ÷ΦΦ ∩σ≡σ∩εδφσφΦ  overflow() Φ underflow(). ═α∩≡Φ∞σ≡:
  struct filebuf : public streambuf {

      int fd;              // Σσ±Ω≡Φ∩≥ε≡ ⌠αΘδα
      char opened;         // ⌠αΘδ ε≥Ω≡√≥

      int overflow(int c =EOF);
      int underflow();

      // ...

          // ╬≥Ω≡√Γασ≥ ⌠αΘδ:
          // σ±δΦ φσ ±≡αßα≥√Γασ≥, ≥ε ΓετΓ≡α∙ασ≥ 0,
          // Γ ±δ≤≈ασ ≤±∩σ⌡α ΓετΓ≡α∙ασ≥ "this"
      filebuf* open(char *name, open_mode om);
      int close() { /* ... */ }

      filebuf() { opened = 0; }
      filebuf(int nfd) { /* ... */ }
      filebuf(int nfd, char* p, int l) : (p,l) { /* ... */ }
      ~filebuf() { close(); }
  };

  int filebuf::underflow()         // τα∩εδφ σ≥ ß≤⌠σ≡ Φτ fd
  {
      if (!opened || allocate()==EOF) return EOF;

      int count = read(fd, base, eptr-base);
      if (count < 1) return EOF;

      qptr = base;
      pptr = base + count;
      return *qptr & 0377;
  }

8.7 ▌⌠⌠σΩ≥ΦΓφε±≥ⁿ

╠εµφε ß√δε ß√ εµΦΣα≥ⁿ, ≈≥ε ≡ατ ΓΓεΣ/Γ√ΓεΣ ε∩≡σΣσδσφ ± ∩ε∞ε∙ⁿ■ εß∙σΣε±≥≤∩φ√⌡ ±≡σΣ±≥Γ  τ√Ωα, εφ ß≤Σσ≥ ∞σφσσ ²⌠⌠σΩ≥ΦΓσφ, ≈σ∞ Γ±≥≡εσφφεσ ±≡σΣ±≥Γε. ═α ±α∞ε∞ Σσδσ ²≥ε φσ ≥αΩ. ─δ  ΣσΘ±≥ΓΦΘ Γ≡εΣσ "∩ε∞σ±≥Φ≥ⁿ ±Φ∞Γεδ Γ ∩ε≥εΩ" Φ±∩εδⁿτ≤■≥±  inline-⌠≤φΩ÷ΦΦ, σΣΦφ±≥Γσφφ√σ φσεß⌡εΣΦ∞√σ φα ²≥ε∞ ≤≡εΓφσ Γ√τεΓ√ ⌠≤φΩ÷ΦΘ ΓετφΦΩα■≥ Φτ-τα ∩σ≡σ∩εδφσφΦ  ±Γσ≡⌡≤ Φ ±φΦτ≤. ─δ  ∩≡ε±≥√⌡ εß·σΩ≥εΓ (÷σδεσ, ±≥≡εΩα Φ ≥.∩.) ≥≡σß≤σ≥±  ∩ε εΣφε∞≤ Γ√τεΓ≤ φα ΩαµΣ√Θ. ╩αΩ Γ√ ±φ σ≥± , ²≥ε φσ ε≥δΦ≈ασ≥±  ε≥ ∩≡ε≈Φ⌡ ±≡σΣ±≥Γ ΓΓεΣα/Γ√ΓεΣα, ≡αßε≥α■∙Φ⌡ ± εß·σΩ≥α∞Φ φα ²≥ε∞ ≤≡εΓφσ.

8.8 ╙∩≡αµφσφΦ 

  1. (*1.5) ╤≈Φ≥αΘ≥σ ⌠αΘδ ≈Φ±σδ ± ∩δαΓα■∙σΘ ≥ε≈ΩεΘ, ±ε±≥αΓⁿ≥σ Φτ ∩α≡ ±≈Φ≥αφφ√⌡ ≈Φ±σδ Ωε∞∩δσΩ±φ√σ ≈Φ±δα Φ Γ√ΓσΣΦ≥σ Ωε∞∩δσΩ±φ√σ ≈Φ±δα.
  2. (*1.5) ╬∩≡σΣσδΦ≥σ ≥Φ∩ name_and_address (Φ∞ _Φ_αΣ≡σ±). ╬∩≡σΣσδΦ≥σ Σδ  φσπε << Φ >>. ╤Ωε∩Φ≡≤Θ≥σ ∩ε≥εΩ εß·σΩ≥εΓ name_and_address.
  3. (*2) ╧ε±≥≡εΘ≥σ φσ±ΩεδⁿΩε ⌠≤φΩ÷ΦΘ Σδ  τα∩≡ε±α Φ ≈≥σφΦ  ≡ατδΦ≈φεπε ΓΦΣα Φφ⌠ε≡∞α÷ΦΦ. ╧≡ε±≥σΘ°ΦΘ ∩≡Φ∞σ≡ - ⌠≤φΩ÷Φ  y_or_n() Γ #8.4.4. ╚ΣσΦ: ÷σδεσ, ≈Φ±δε ± ∩δαΓα■∙σΘ ≥ε≈ΩεΘ, Φ∞  ⌠αΘδα, ∩ε≈≥εΓ√Θ αΣ≡σ±, Σα≥α, δΦ≈φ√σ Σαφφ√σ Φ ≥.Σ. ╧ε±≥α≡αΘ≥σ±ⁿ ±Σσδα≥ⁿ Φ⌡ τα∙Φ∙σφφ√∞Φ ε≥ Σ≤≡αΩα.
  4. (*1.5) ═α∩Φ°Φ≥σ ∩≡επ≡α∞∞≤, Ωε≥ε≡α  ∩σ≈α≥ασ≥ (1) Γ±σ ß≤ΩΓ√ Γ φΦµφσ∞ ≡σπΦ±≥≡σ, (2) Γ±σ ß≤ΩΓ√, (3) Γ±σ ß≤ΩΓ√ Φ ÷Φ⌠≡√, (4) Γ±σ ±Φ∞Γεδ√, Ωε≥ε≡√σ ∞επ≤≥ Γ±≥≡σ≈α≥ⁿ±  Γ ΦΣσφ≥Φ⌠ΦΩα≥ε≡α⌡ C++ φα Γα°σΘ ±Φ±≥σ∞σ, (5) Γ±σ ±Φ∞Γεδ√ ∩≤φΩ≥≤α÷ΦΦ, (6) ÷σδ√σ τφα≈σφΦ  Γ±σ⌡ ≤∩≡αΓδ ■∙Φ⌡ ±Φ∞ΓεδεΓ, (7) Γ±σ ±Φ∞Γεδ√ ∩≡ε∩≤±Ωα, (8) ÷σδ√σ τφα≈σφΦ  Γ±σ⌡ ±Φ∞ΓεδεΓ ∩≡ε∩≤±Ωα, Φ (9) Γ±σ ∩σ≈α≥ασ∞√σ ±Φ∞Γεδ√.
  5. (*4) ╨σαδΦτ≤Θ≥σ ±≥αφΣα≡≥φ≤■ ßΦßδΦε≥σΩ≤ ΓΓεΣα/Γ√ΓεΣα C () ± ∩ε∞ε∙ⁿ■ ±≥αφΣα≡≥φεΘ ßΦßδΦε≥σΩΦ ΓΓεΣα/Γ√ΓεΣα C++ ().
  6. (*4) ╨σαδΦτ≤Θ≥σ ±≥αφΣα≡≥φ≤■ ßΦßδΦε≥σΩ≤ ΓΓεΣα/Γ√ΓεΣα C++ () ± ∩ε∞ε∙ⁿ■ ±≥αφΣα≡≥φεΘ ßΦßδΦε≥σΩΦ ΓΓεΣα/Γ√ΓεΣα C ().
  7. (*4) ╨σαδΦτ≤Θ≥σ ±≥αφΣα≡≥φ√σ ßΦßδΦε≥σΩΦ C Φ C++ ≥αΩ, ≈≥εß√ εφΦ ∞επδΦ Φ±∩εδⁿτεΓα≥ⁿ±  εΣφεΓ≡σ∞σφφε.
  8. (*2) ╨σαδΦτ≤Θ≥σ Ωδα±±, Σδ  Ωε≥ε≡επε [] ∩σ≡σπ≡≤µσφε Σδ  ≡σαδΦτα÷ΦΦ ±δ≤≈αΘφεπε ≈≥σφΦ  ±Φ∞ΓεδεΓ Φτ ⌠αΘδα.
  9. (*3) ╩αΩ ╙∩≡αµφσφΦσ 8, ≥εδⁿΩε ±ΣσδαΘ≥σ, ≈≥εß√ [] ≡αßε≥αδε Φ Σδ  ≈≥σφΦ , Φ Σδ  τα∩Φ±Φ. ╧εΣ±ΩατΩα: ±ΣσδαΘ≥σ, ≈≥εß√ [] ΓετΓ≡α∙αδε εß·σΩ≥ "Σσ±Ω≡Φ∩≥ε≡φεπε ≥Φ∩α", Σδ  Ωε≥ε≡επε ∩≡Φ±ΓαΦΓαφΦσ ετφα≈αδε ß√ ∩≡Φ±ΓεΦ≥ⁿ ⌠αΘδ≤ ≈σ≡στ Σσ±Ω≡Φ∩≥ε≡, α φσ Γφεσ ∩≡σεß≡ατεΓαφΦσ Γ char ετφα≈αδε ß√ ≈≥σφΦσ Φτ ⌠αΘδα ≈σ≡στ Σσ±Ω≡Φ∩≥ε≡.
  10. (*2) ╩αΩ ╙∩≡αµφσφΦσ 9, ≥εδⁿΩε ≡ατ≡σ°Φ≥σ [] ΦφΣσΩ±Φ≡εΓα≥ⁿ τα∩Φ±Φ φσΩε≥ε≡επε ΓΦΣα, α φσ ±Φ∞Γεδ√.
  11. (*3) ╤ΣσδαΘ≥σ εßεß∙σφφ√Θ Γα≡Φαφ≥ Ωδα±±α, ε∩≡σΣσδσφφεπε Γ ╙∩≡αµφσφΦΦ 10.
  12. (*3.5) ╨ατ≡αßε≥αΘ≥σ Φ ≡σαδΦτ≤Θ≥σ ε∩σ≡α÷Φ■ ΓΓεΣα ∩ε ±ε∩ε±≥αΓδσφΦ■ ± εß≡ατ÷ε∞. ─δ  ±∩σ÷Φ⌠ΦΩα÷ΦΦ εß≡ατ÷α Φ±∩εδⁿτ≤Θ≥σ ±≥≡εΩΦ ⌠ε≡∞α≥α Γ Σ≤⌡σ printf. ─εδµφα ß√≥ⁿ Γετ∞εµφε±≥ⁿ ∩ε∩≡εßεΓα≥ⁿ ±ε∩ε±≥αΓΦ≥ⁿ ±ε ΓΓεΣε∞ φσ±ΩεδⁿΩε εß≡ατ÷εΓ Σδ  φα⌡εµΣσφΦ  ⌠αΩ≥Φ≈σ±Ωεπε ⌠ε≡∞α≥α. ╠εµφε ß√δε ß√ Γ√Γσ±≥Φ Ωδα±± ΓΓεΣα ∩ε εß≡ατ÷≤ Φτ istream.
  13. (*4) ╧≡ΦΣ≤∞αΘ≥σ (Φ ≡σαδΦτ≤Θ≥σ) ΓΦΣ εß≡ατ÷εΓ, Ωε≥ε≡√σ φα∞φεπε δ≤≈°σ.

[═αταΣ] [╤εΣσ≡µαφΦσ] [┬∩σ≡σΣ]

Copyright © CIT