╤σ≡Γσ≡ ╚φ⌠ε≡∞α÷Φεφφ√⌡ ╥σ⌡φεδεπΦΘ ±εΣσ≡µΦ≥ ∞ε≡σ(!) αφαδΦ≥Φ≈σ±ΩεΘ Φφ⌠ε≡∞α÷ΦΦ |
╤σ≡Γσ≡ ∩εΣΣσ≡µΦΓασ≥± |
---|
▀τ√Ω C++ φσ εßσ±∩σ≈ΦΓασ≥ ±≡σΣ±≥Γ Σδ ΓΓεΣα/Γ√ΓεΣα. ┼∞≤ ²≥ε Φ φσ φ≤µφε; ≥αΩΦσ ±≡σΣ±≥Γα δσπΩε Φ ²δσπαφ≥φε ∞εµφε ±ετΣα≥ⁿ ± ∩ε∞ε∙ⁿ■ ±α∞επε τ√Ωα. ╬∩Φ±αφφα τΣσ±ⁿ ±≥αφΣα≡≥φα ßΦßδΦε≥σΩα ∩ε≥εΩεΓεπε ΓΓεΣα/Γ√ΓεΣα εßσ±∩σ≈ΦΓασ≥ πΦßΩΦΘ Φ ²⌠⌠σΩ≥ΦΓφ√Θ ± πα≡αφ≥ΦσΘ ≥Φ∩α ∞σ≥εΣ εß≡αßε≥ΩΦ ±Φ∞Γεδⁿφεπε ΓΓεΣα ÷σδ√⌡ ≈Φ±σδ, ≈Φ±σδ ± ∩δαΓα■∙σΘ ≥ε≈ΩεΘ Φ ±Φ∞Γεδⁿφ√⌡ ±≥≡εΩ, α ≥αΩµσ ∩≡ε±≥≤■ ∞εΣσδⁿ σσ ≡α±°Φ≡σφΦ Σδ εß≡αßε≥ΩΦ ≥Φ∩εΓ, ε∩≡σΣσδ σ∞√⌡ ∩εδⁿτεΓα≥σδσ∞. ┼σ ∩εδⁿτεΓα≥σδⁿ±ΩΦΘ Φφ≥σ≡⌠σΘ± φα⌡εΣΦ≥± Γ . ┬ ²≥εΘ πδαΓσ ε∩Φ±√Γασ≥± ±α∞α ßΦßδΦε≥σΩα, φσΩε≥ε≡√σ ±∩ε±εß√ σσ ∩≡Φ∞σφσφΦ Φ ∞σ≥εΣ√, Ωε≥ε≡√σ Φ±∩εδⁿτεΓαδΦ±ⁿ ∩≡Φ σσ ≡σαδΦτα÷ΦΦ.
╨ατ≡αßε≥Ωα Φ ≡σαδΦτα÷Φ ±≥αφΣα≡≥φ√⌡ ±≡σΣ±≥Γ ΓΓεΣα/Γ√ΓεΣα Σδ
τ√Ωα ∩≡επ≡α∞∞Φ≡εΓαφΦ τα≡σΩε∞σφΣεΓαδα ±σß ΩαΩ ταΓσΣε∞ε ≥≡≤Σφα
≡αßε≥α. ╥≡αΣΦ÷Φεφφε ±≡σΣ±≥Γα ΓΓεΣα/Γ√ΓεΣα ≡ατ≡αßα≥√ΓαδΦ±ⁿ
Φ±Ωδ■≈Φ≥σδⁿφε Σδ φσßεδⁿ°επε ≈Φ±δα Γ±≥≡εσφφ√⌡ ≥Φ∩εΓ Σαφφ√⌡. ╬ΣφαΩε
Γ C++ ∩≡επ≡α∞∞α⌡ εß√≈φε Φ±∩εδⁿτ≤σ≥± ∞φεπε ≥Φ∩εΓ, ε∩≡σΣσδσφφ√⌡
∩εδⁿτεΓα≥σδσ∞, Φ φ≤µφε εß≡αßα≥√Γα≥ⁿ ΓΓεΣ Φ Γ√ΓεΣ ≥αΩµσ Φ τφα≈σφΦΘ
²≥Φ⌡ ≥Φ∩εΓ. ╬≈σΓΦΣφε, ±≡σΣ±≥Γε ΓΓεΣα/Γ√ΓεΣα Σεδµφε ß√≥ⁿ ∩≡ε±≥√∞,
≤Σεßφ√∞, φαΣσµφ√∞ Γ ≤∩ε≥≡σßδσφΦΦ, ²⌠⌠σΩ≥ΦΓφ√∞ Φ πΦßΩΦ∞, Φ Ωε Γ±σ∞≤
∩≡ε≈σ∞≤ ∩εδφ√∞. ═Φ≈ⁿσ ≡σ°σφΦσ σ∙σ φσ ±∞επδε ≤πεΣΦ≥ⁿ Γ±σ∞, ∩ε²≥ε∞≤ ≤
∩εδⁿτεΓα≥σδ Σεδµφα ß√≥ⁿ Γετ∞εµφε±≥ⁿ ταΣαΓα≥ⁿ αδⁿ≥σ≡φα≥ΦΓφ√σ
±≡σΣ±≥Γα ΓΓεΣα/Γ√ΓεΣα Φ ≡α±°Φ≡ ≥ⁿ ±≥αφΣα≡≥φ√σ ±≡σΣ±≥Γα ΓΓεΣα/Γ√ΓεΣα
∩≡Φ∞σφΦ≥σδⁿφε Ω ≥≡σßεΓαφΦ ∞ ∩≡ΦδεµσφΦ .
C++ ≡ατ≡αßε≥αφ ≥αΩ, ≈≥εß√ ≤ ∩εδⁿτεΓα≥σδ ß√δα Γετ∞εµφε±≥ⁿ
ε∩≡σΣσδ ≥ⁿ φεΓ√σ ≥Φ∩√ ±≥εδⁿ µσ ²⌠⌠σΩ≥ΦΓφ√σ Φ ≤Σεßφ√σ, ±Ωεδⁿ Φ
Γ±≥≡εσφφ√σ ≥Φ∩√. ╧ε²≥ε∞≤ εßε±φεΓαφφ√∞ Γδ σ≥± ≥≡σßεΓαφΦσ ≥επε, ≈≥ε
±≡σΣ±≥Γα ΓΓεΣα/Γ√ΓεΣα Σδ C++ Σεδµφ√ εßσ±∩σ≈ΦΓα≥ⁿ± Γ C++ ±
∩≡Φ∞σφσφΦσ∞ ≥εδⁿΩε ≥σ⌡ ±≡σΣ±≥Γ, Ωε≥ε≡√σ Σε±≥≤∩φ√ ΩαµΣε∞≤
∩≡επ≡α∞∞Φ±≥≤. ╬∩Φ±√Γασ∞√σ τΣσ±ⁿ ±≡σΣ±≥Γα ΓΓεΣα/Γ√ΓεΣα ∩≡σΣ±≥αΓδ ■≥
±εßεΘ ∩ε∩√≥Ω≤ ε≥Γσ≥Φ≥ⁿ φα ²≥ε≥ Γ√τεΓ.
╤≡σΣ±≥Γα ΓΓεΣα/Γ√ΓεΣα ±Γ ταφ√ Φ±Ωδ■≈Φ≥σδⁿφε ±
εß≡αßε≥ΩεΘ ∩≡σεß≡ατεΓαφΦ ≥Φ∩ΦτΦ≡εΓαφφ√⌡ εß·σΩ≥εΓ Γ
∩ε±δσΣεΓα≥σδⁿφε±≥Φ ±Φ∞ΓεδεΓ Φ εß≡α≥φε. ┼±≥ⁿ Φ Σ≡≤πΦσ ±⌡σ∞√
ΓΓεΣα/Γ√ΓεΣα, φε ²≥α Γδ σ≥± ε±φεΓε∩εδαπα■∙σΘ Γ ±Φ±≥σ∞σ UNIX, Φ
ßεδⁿ°α ≈α±≥ⁿ ΓΦΣεΓ ßΦφα≡φεπε ΓΓεΣα/Γ√ΓεΣα εß≡αßα≥√Γασ≥± ≈σ≡στ
≡α±±∞ε≥≡σφΦσ ±Φ∞Γεδα ∩≡ε±≥ε ΩαΩ φαßε≡ ßΦ≥, ∩≡Φ ²≥ε∞ σπε
εß∙σ∩≡Φφ ≥α ±Γ τⁿ ± αδ⌠αΓΦ≥ε∞ Φπφε≡Φ≡≤σ≥± . ╥επΣα Σδ ∩≡επ≡α∞∞Φ±≥α
Ωδ■≈σΓα ∩≡εßδσ∞α ταΩδ■≈ασ≥± Γ ταΣαφΦΦ ±εε≥Γσ≥±≥ΓΦ ∞σµΣ≤
≥Φ∩ΦτΦ≡εΓαφφ√∞ εß·σΩ≥ε∞ Φ ∩≡Φφ÷Φ∩Φαδⁿφε φσ ≥Φ∩ΦτΦ≡εΓαφφεΘ ±≥≡εΩεΘ.
╬ß≡αßε≥Ωα Φ Γ±≥≡εσφφ√⌡ Φ ε∩≡σΣσδσφφ√⌡ ∩εδⁿτεΓα≥σδσ∞ ≥Φ∩εΓ
εΣφε≡εΣφ√∞ εß≡ατε∞ Φ ± πα≡αφ≥ΦσΘ ≥Φ∩α Σε±≥Φπασ≥± ± ∩ε∞ε∙ⁿ■ εΣφεπε
∩σ≡σπ≡≤µσφφεπε Φ∞σφΦ ⌠≤φΩ÷ΦΦ Σδ φαßε≡α ⌠≤φΩ÷ΦΘ Γ√ΓεΣα. ═α∩≡Φ∞σ≡:
put(cerr,"x = "); // cerr - ∩ε≥εΩ Γ√ΓεΣα ε°ΦßεΩ put(cerr,x); put(cerr,"\n");
cerr << "x = " << x << "\n";
x = 123
x = 1,2.4)
8.2.1 ┬√ΓεΣ ┬±≥≡εσφφ√⌡ ╥Φ∩εΓ | |
8.2.2 ═σΩε≥ε≡√σ ╧εΣ≡εßφε±≥Φ ╨ατ≡αßε≥ΩΦ | |
8.2.3 ╘ε≡∞α≥Φ≡εΓαφφ√Θ ┬√ΓεΣ | |
8.2.4 ┬Φ≡≥≤αδⁿφα ╘≤φΩ÷Φ ┬√ΓεΣα |
┬ ²≥ε∞ ≡ατΣσδσ ±φα≈αδα εß±≤µΣα■≥± ±≡σΣ±≥Γα ⌠ε≡∞α≥φεπε Φ ßσ±⌠ε≡∞α≥φεπε Γ√ΓεΣα Γ±≥≡εσφφ√⌡ ≥Φ∩εΓ, ∩ε≥ε∞ ∩≡ΦΓεΣΦ≥± ±≥αφΣα≡≥φ√Θ ±∩ε±εß ±∩σ÷Φ⌠ΦΩα÷ΦΦ ΣσΘ±≥ΓΦΘ Γ√ΓεΣα Σδ ε∩≡σΣσδ σ∞√⌡ ∩εδⁿτεΓα≥σδσ∞ ≥Φ∩εΓ.
╩δα±± ostream ε∩≡σΣσδ σ≥± Γ∞σ±≥σ ± ε∩σ≡α÷ΦσΘ << ("∩ε∞σ±≥Φ≥ⁿ Γ") Σδ εß≡αßε≥ΩΦ Γ√ΓεΣα Γ±≥≡εσφφ√⌡ ≥Φ∩εΓ:
class ostream { // ... public: ostream& operator<<(char*); ostream& operator<<(int i) { return *this<
╬∩σ≡α÷Φ Γ√ΓεΣα Φ±∩εδⁿτ≤σ≥± , ≈≥εß√ Φτßσµα≥ⁿ ≥εΘ ∞φεπε±δεΓφε±≥Φ,
Ωε≥ε≡≤■ Σαδε ß√ Φ±∩εδⁿτεΓαφΦσ ⌠≤φΩ÷ΦΦ Γ√ΓεΣα. ═ε ∩ε≈σ∞≤ < ┬ετ∞εµφε±≥Φ Φτεß≡σ±≥Φ φεΓ√Θ δσΩ±Φ≈σ±ΩΦΘ ±Φ∞Γεδ φσ≥ (#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<
╧εΩα << ∩≡Φ∞σφ δα±ⁿ ≥εδⁿΩε Σδ φσ⌠ε≡∞α≥Φ≡εΓαφφεπε Γ√ΓεΣα, Φ φα ±α∞ε∞ Σσδσ Γ ≡σαδⁿφ√⌡ ∩≡επ≡α∞∞α⌡ εφα Φ∞σφφε Σδ ²≥επε πδαΓφ√∞ εß≡ατε∞ Φ ∩≡Φ∞σφ σ≥± . ╧ε∞Φ∞ε ²≥επε ±≤∙σ±≥Γ≤σ≥ ≥αΩµσ φσ±ΩεδⁿΩε ⌠ε≡∞α≥Φ≡≤■∙Φ⌡ ⌠≤φΩ÷ΦΘ, ±ετΣα■∙Φ⌡ ∩≡σΣ±≥αΓδσφΦσ ±Γεσπε ∩α≡α∞σ≥≡α Γ ΓΦΣσ ±≥≡εΩΦ, Ωε≥ε≡α Φ±∩εδⁿτ≤σ≥± Σδ Γ√ΓεΣα. ╚⌡ Γ≥ε≡εΘ (φσεß τα≥σδⁿφ√Θ) ∩α≡α∞σ≥≡ ≤Ωατ√Γασ≥, ±ΩεδⁿΩε ±Φ∞Γεδⁿφ√⌡ ∩ετΦ÷ΦΘ Σεδµφε Φ±∩εδⁿτεΓα≥ⁿ± .
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) << ")";
dec(15) = oct( 17) = hex( f);
char* form(char* format ...); cout<
╚φεπΣα ⌠≤φΩ÷Φ Γ√ΓεΣα Σεδµφα ß√≥ⁿ 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; }
while ( p = next() ) cout << p;
8.3.1 ╚φΦ÷ΦαδΦτα÷Φ ╧ε≥εΩεΓ ┬√ΓεΣα | |
8.3.2 ╟αΩ≡√≥Φσ ╧ε≥εΩεΓ ┬√ΓεΣα | |
8.3.3 ╬≥Ω≡√≥Φσ ╘αΘδεΓ | |
8.3.4 ╩ε∩Φ≡εΓαφΦσ ╧ε≥εΩεΓ |
╧ε≥εΩΦ εß√≈φε ±Γ ταφ√ ± ⌠αΘδα∞Φ. ┴ΦßδΦε≥σΩα ∩ε≥εΩεΓ ±ετΣασ≥ ±≥αφΣα≡≥φ√Θ ∩ε≥εΩ ΓΓεΣα cin, ±≥αφΣα≡≥φ√Θ ∩ε≥εΩ Γ√ΓεΣα cout Φ ±≥αφΣα≡≥φ√Θ ∩ε≥εΩ ε°ΦßεΩ cerr. ╧≡επ≡α∞∞Φ±≥ ∞εµσ≥ ε≥Ω≡√Γα≥ⁿ Σ≡≤πΦσ ⌠αΘδ√ Φ ±ετΣαΓα≥ⁿ Σδ φΦ⌡ ∩ε≥εΩΦ.
ostream Φ∞σσ≥ Ωεφ±≥≡≤Ω≥ε≡√:
class ostream { // ... ostream(streambuf* s); // ±Γ τ√Γασ≥ ± ß≤⌠σ≡ε∞ ∩ε≥εΩα ostream(int fd); // ±Γ τ√ΓαφΦσ Σδ ⌠αΘδα ostream(int size, char* p); // ±Γ τ√Γσ≥ ± ΓσΩ≥ε≡ε∞ };
// ε∩Φ±α≥ⁿ ∩εΣ⌡εΣ ∙σσ ∩≡ε±≥≡αφ±≥Γε ß≤⌠σ≡α 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 ±ß≡α±√Γασ≥ ß≤⌠σ≡ ± ∩ε∞ε∙ⁿ■ ε≥Ω≡√≥επε ≈δσφα ⌠≤φΩ÷ΦΦ ostream::flush():
ostream::~ostream() { flush(); // ±ß≡ε± }
cout.flush();
╥ε≈φ√σ Σσ≥αδΦ ≥επε, ΩαΩ ε≥Ω≡√Γα■≥± Φ ταΩ≡√Γα■≥± ⌠αΘδ√, ≡ατδΦ≈α■≥± Γ ≡ατφ√⌡ ε∩σ≡α÷Φεφφ√⌡ ±Φ±≥σ∞α⌡ Φ τΣσ±ⁿ ∩εΣ≡εßφε φσ ε∩Φ±√Γα■≥± . ╧ε±ΩεδⁿΩ≤ ∩ε±δσ ΓΩδ■≈σφΦ ±≥αφεΓ ≥± Σε±≥≤∩φ√ 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("±δ≤≈Φδε±ⁿ φσ≈≥ε ±≥≡αφφεσ",""); }
enum open_mode { input, output };
┼±≥ⁿ Γετ∞εµφε±≥ⁿ Ωε∩Φ≡εΓα≥ⁿ ∩ε≥εΩΦ. ═α∩≡Φ∞σ≡:
cout = cerr;
8.4.1 ┬ΓεΣ ┬±≥≡εσφφ√⌡ ╥Φ∩εΓ | |
8.4.2 ╤ε±≥ε φΦ ╧ε≥εΩα | |
8.4.3 ┬ΓεΣ ╥Φ∩εΓ, ╬∩≡σΣσδ σ∞√⌡ ╧εδⁿτεΓα≥σδσ∞ | |
8.4.4 ╚φΦ÷ΦαδΦτα÷Φ ╧ε≥εΩεΓ ┬ΓεΣα |
┬ΓεΣ αφαδεπΦ≈σφ Γ√ΓεΣ≤. ╚∞σσ≥± Ωδα±± istream, Ωε≥ε≡√Θ ∩≡σΣε±≥αΓδ σ≥ ε∩σ≡α÷Φ■ >> ("Γτ ≥ⁿ Φτ") Σδ φσßεδⁿ°επε ∞φεµσ±≥Γα ±≥αφΣα≡≥φ√⌡ ≥Φ∩εΓ. ╘≤φΩ÷Φ operator>> ∞εµσ≥ ε∩≡σΣσδ ≥ⁿ± Σδ ≥Φ∩α, ε∩≡σΣσδ σ∞επε ∩εδⁿτεΓα≥σδσ∞.
╩δα±± 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; }
class istream { // ... istream& get(char& c); // char istream& get(char* p, int n, int ='\n'); // ±≥≡εΩα };
cin.get(buf,256,'\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; }
(('a'<=c && c<='z') || ('A'<=c && c<='Z')) // αδ⌠αΓΦ≥φ√Θ
isalpha(c)
╩αµΣ√Θ ∩ε≥εΩ (istream ΦδΦ ostream) Φ∞σσ≥ α±±ε÷ΦΦ≡εΓαφφεσ ± φΦ∞
±ε±≥ε φΦσ, Φ εß≡αßε≥Ωα ε°ΦßεΩ Φ φσ±≥αφΣα≡≥φ√⌡ ≤±δεΓΦΘ
ε±≤∙σ±≥Γδ σ≥± ± ∩ε∞ε∙ⁿ■ ±εε≥Γσ≥±≥Γ≤■∙σΘ ≤±≥αφεΓΩΦ Φ ∩≡εΓσ≡ΩΦ ²≥επε
±ε±≥ε φΦ .
╧ε≥εΩ ∞εµσ≥ φα⌡εΣΦ≥ⁿ± Γ εΣφε∞ Φτ ±δσΣ≤■∙Φ⌡ ±ε±≥ε φΦΘ:
enum stream_state { _good, _eof, _fail, _bad };
switch (cin.rdstate()) { case _good: // ∩ε±δσΣφ ε∩σ≡α÷Φ φαΣ cin ∩≡ε°δα ≤±∩σ°φε break; case _eof: // Ωεφσ÷ ⌠αΘδα break; case _fail: // φσΩεσπε ≡εΣα ε°ΦßΩα ⌠ε≡∞α≥Φ≡εΓαφΦ // Γετ∞εµφε, φσ ±δΦ°Ωε∞ ∩δε⌡α break; case _bad: // Γετ∞εµφε, ±Φ∞Γεδ√ cin ∩ε≥σ≡ φ√ break; }
while (cin>>z) cout << z << "\n";
┬ΓεΣ Σδ ∩εδⁿτεΓα≥σδⁿ±Ωεπε ≥Φ∩α ∞εµσ≥ ε∩≡σΣσδ ≥ⁿ± ≥ε≈φε ≥αΩ µσ, ΩαΩ Γ√ΓεΣ, τα ≥σ∞ Φ±Ωδ■≈σφΦσ∞, ≈≥ε Σδ ε∩σ≡α÷ΦΦ ΓΓεΣα Γαµφε, ≈≥εß√ Γ≥ε≡εΘ ∩α≡α∞σ≥≡ ß√δ ±±√δε≈φεπε ≥Φ∩α. ═α∩≡Φ∞σ≡:
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; }
┼±≥σ±≥Γσφφε, ≥Φ∩ 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); };
cout.flush(); // ∩Φ°σ≥ ß≤⌠σ≡ Γ√ΓεΣα
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 << "ΦτΓΦφΦ≥σ, ∩ε∩≡εß≤Θ≥σ σ∙σ ≡ατ: "; } } }
╠εµφε ε±≤∙σ±≥Γδ ≥ⁿ ΣσΘ±≥ΓΦ , ∩εΣεßφ√σ ΓΓεΣ≤/Γ√ΓεΣ≤, φαΣ ±Φ∞Γεδⁿφ√∞ ΓσΩ≥ε≡ε∞, ∩≡ΦΩ≡σ∩δ Ω φσ∞≤ 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"; }
char* p = new char[message_size]; ostream ost(message_size,p); do_something(arguments,ost); display(p);
╧≡Φ ταΣαφΦΦ ε∩σ≡α÷ΦΘ ΓΓεΣα/Γ√ΓεΣα ∞√ φΦΩαΩ φσ Ωα±αδΦ±ⁿ ≥Φ∩εΓ ⌠αΘδεΓ, φε ΓσΣⁿ φσ Γ±σ ≤±≥≡εΘ±≥Γα ∞εµφε ≡α±±∞α≥≡ΦΓα≥ⁿ εΣΦφαΩεΓε ± ≥ε≈ΩΦ τ≡σφΦ ±≥≡α≥σπΦΦ ß≤⌠σ≡Φτα÷ΦΦ. ═α∩≡Φ∞σ≡, Σδ 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() { /* ... */} };
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; }
╠εµφε ß√δε ß√ εµΦΣα≥ⁿ, ≈≥ε ≡ατ ΓΓεΣ/Γ√ΓεΣ ε∩≡σΣσδσφ ± ∩ε∞ε∙ⁿ■ εß∙σΣε±≥≤∩φ√⌡ ±≡σΣ±≥Γ τ√Ωα, εφ ß≤Σσ≥ ∞σφσσ ²⌠⌠σΩ≥ΦΓσφ, ≈σ∞ Γ±≥≡εσφφεσ ±≡σΣ±≥Γε. ═α ±α∞ε∞ Σσδσ ²≥ε φσ ≥αΩ. ─δ ΣσΘ±≥ΓΦΘ Γ≡εΣσ "∩ε∞σ±≥Φ≥ⁿ ±Φ∞Γεδ Γ ∩ε≥εΩ" Φ±∩εδⁿτ≤■≥± inline-⌠≤φΩ÷ΦΦ, σΣΦφ±≥Γσφφ√σ φσεß⌡εΣΦ∞√σ φα ²≥ε∞ ≤≡εΓφσ Γ√τεΓ√ ⌠≤φΩ÷ΦΘ ΓετφΦΩα■≥ Φτ-τα ∩σ≡σ∩εδφσφΦ ±Γσ≡⌡≤ Φ ±φΦτ≤. ─δ ∩≡ε±≥√⌡ εß·σΩ≥εΓ (÷σδεσ, ±≥≡εΩα Φ ≥.∩.) ≥≡σß≤σ≥± ∩ε εΣφε∞≤ Γ√τεΓ≤ φα ΩαµΣ√Θ. ╩αΩ Γ√ ±φ σ≥± , ²≥ε φσ ε≥δΦ≈ασ≥± ε≥ ∩≡ε≈Φ⌡ ±≡σΣ±≥Γ ΓΓεΣα/Γ√ΓεΣα, ≡αßε≥α■∙Φ⌡ ± εß·σΩ≥α∞Φ φα ²≥ε∞ ≤≡εΓφσ.