Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 257

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

ΠžΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ошибкой программирования являСтся присвоСниС значСния,Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ get() ΠΈΠ»ΠΈ peek(), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΈΠΏ int, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° char, Π° Π½Π΅ int. Π­Ρ‚ΠΎ, бСзусловно, Π±ΡƒΠ΄Π΅Ρ‚ ошибкой, Π½ΠΎ компилятор Π΅Π΅ Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚. Π’ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ этой ошибки, зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. НапримСр, Ссли машина ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ символ ΠΊΠ°ΠΊ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ Ρ†ΠΈΠΊΠ» окаТСтся бСсконСчным.

char ch; // ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° char здСсь ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ катастрофС!

// Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ get() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с in,

// прСобразуСтся ΠΈΠ· int Π² char, Π° Π·Π°Ρ‚Π΅ΠΌ сравниваСтся с int

while ((ch = cin.get()) != EOF)

 cout.put(ch);

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° функция get() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ EOF, ΠΎΠ½ΠΎ прСобразуСтся Π² Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° unsigned char. Π­Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ цСлочислСнному Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ EOF, поэтому Ρ†ΠΈΠΊΠ» Π½Π΅ закончится Π½ΠΈΠΊΠΎΠ³Π΄Π°. Π’Π°ΠΊΠΈΠ΅ ошибки ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅.

Но нСльзя Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° Ρ‚Π΅Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…, Π³Π΄Π΅ символы ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΎΠΏ, ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π° Π±ΡƒΠ΄Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ. Π’Π΅Π΄ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ пСрСполнСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° зависит ΠΎΡ‚ компилятора. На Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ машин этот Ρ†ΠΈΠΊΠ» Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ встрСтится символ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ EOF. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π°ΠΊΠΈΠ΅ символы маловСроятны, Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ нСпосрСдствСнно ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ символам ΠΈ числовым значСниям. На машинС Π°Π²Ρ‚ΠΎΡ€Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ†ΠΈΠΊΠ» ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π² случаС Π²Π²ΠΎΠ΄Π° символа, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся '\377'. Когда Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ '\377' Π½Π° машинС Π°Π²Ρ‚ΠΎΡ€Π° прСобразуСтся Π² Ρ‚ΠΈΠΏ signed char, получаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1. Если Π²ΠΎ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… встрСтится это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ символ (ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ) ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°.

ΠŸΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΈ записи Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚Π°ΠΊΠΈΠ΅ ошибки Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠΎ возмоТности слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прСдоставляСмыС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ высокоуровнСвыС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Ρ‡Ρ‚ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ бСзопаснСй.

ΠœΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

НСкоторыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с порциями Π΄Π°Π½Π½Ρ‹Ρ… Π·Π° Ρ€Π°Π·. Π­Ρ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, Ссли Π²Π°ΠΆΠ½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ, Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΎΠ½ΠΈ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Ρ‹ ошибкам. Π’ частности эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ рСзСрвирования ΠΈ управлСния ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ массивами (см. Ρ€Π°Π·Π΄Π΅Π» 12.2), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ для сохранСния ΠΈ возвращСния Π΄Π°Π½Π½Ρ‹Ρ…. ΠœΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ пСрСчислСны Π² Ρ‚Π°Π±Π». 17.20.


Π’Π°Π±Π»ΠΈΡ†Π° 17.20. ΠœΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°

is.get(sink, size, delim) Π§ΠΈΡ‚Π°Π΅Ρ‚ Π΄ΠΎ size Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° is ΠΈ сохраняСт ΠΈΡ… Π² символьном массивС, начиная с адрСса, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ sink. Π§Ρ‚Π΅Π½ΠΈΠ΅ продолТаСтся, ΠΏΠΎΠΊΠ° Π½Π΅ встрСтится символ delim, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ size Π±Π°ΠΉΡ‚ΠΎΠ², Π»ΠΈΠ±ΠΎ ΠΏΠΎΠΊΠ° Π½Π΅ кончится Ρ„Π°ΠΉΠ». Если ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ delim присутствуСт, Ρ‚ΠΎ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ остаСтся Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΈ Π½Π΅ читаСтся Π² sink is.getline(sink, size, delim) To ΠΆΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get() с трСмя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, Π½ΠΎ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΈ отбрасываСт delim is.read(sink, size) Π§ΠΈΡ‚Π°Π΅Ρ‚ Π΄ΠΎ size Π±Π°ΠΉΡ‚ΠΎΠ² Π² ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ массив sink. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ is is.gcount() Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство Π±Π°ΠΉΡ‚ΠΎΠ², ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Ρ… ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° is ΠΏΡ€ΠΈ послСдним Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ чтСния os.write(source, size) ЗаписываСт size Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈΠ· символьного массива source Π² ΠΏΠΎΡ‚ΠΎΠΊ os is.ignore(size, delim) Π§ΠΈΡ‚Π°Π΅Ρ‚ ΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄ΠΎ size символов, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ delim. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π½Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ignore() ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: для size β€” 1 ΠΈ для delim β€” ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ get() ΠΈ getline() ΠΈΠΌΠ΅ΡŽΡ‚ схоТиС, Π½ΠΎ Π½Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ случаС sink β€” это ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ массив, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅. ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… условий:

β€’ ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ size - 1 символов.

β€’ Π’стрСтился ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°.

β€’ Π’стрСтился символ раздСлСния.

Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ раздСлитСля: функция get() оставляСт Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ символ ΠΏΠΎΡ‚ΠΎΠΊΠ° istream, Π° функция getline() Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΈ отбрасываСт Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ. Π’ любом случаС Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ Π½Π΅ сохраняСтся Π² массивС sink.

Π’Π΅ΡΡŒΠΌΠ° распространСнная ошибка: Π½Π°ΠΌΠ΅Ρ€Π΅Π²Π°Ρ‚ΡŒΡΡ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π½ΠΎ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ количСства Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹Ρ… символов

НСкоторыС ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ ΠΈΠ· Π²Π²ΠΎΠ΄Π° нСизвСстноС количСство Π±Π°ΠΉΡ‚ΠΎΠ². Для опрСдСлСния количСства символов, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Ρ… послСднСй ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Π½Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ gcount(). Π˜ΠΌΠ΅Π΅Ρ‚ смысл Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ gcount() ΠΏΠ΅Ρ€Π΅Π΄ Π»ΡŽΠ±Ρ‹ΠΌ Π²ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎΠΌ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°. Π’ частности, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΌΠΈ символами, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΈΡ… Π² ΠΏΠΎΡ‚ΠΎΠΊ, Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ опСрациями Π½Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°. Если Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ peek(), unget() ΠΈΠ»ΠΈ putback() Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Π½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gcount(), Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0.

УпраТнСния Ρ€Π°Π·Π΄Π΅Π»Π° 17.5.2

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.37. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π½Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getline() для чтСния Ρ„Π°ΠΉΠ»Π° ΠΏΠΎ строкС Π·Π° Ρ€Π°Π·. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ„Π°ΠΉΠ»Π° с пустыми строками, Π° Ρ‚Π°ΠΊΠΆΠ΅ со строками, Π΄Π»ΠΈΠ½Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… большС символьного массива, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getline().

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.38. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ упраТнСния Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½ΠΎΠ΅ слово Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ строкС.

17.5.3. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΡƒ

НСкоторыС ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Ρ… классов ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ связанного с Π½ΠΈΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°. ПолоТСниС Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ сначала послСднюю строку, Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΈ Ρ‚.Π΄. Для установки (seek) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈ сообщСния (tell) Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° прСдоставляСт ΠΏΠ°Ρ€Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ доступ для чтСния ΠΈ записи Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ зависит ΠΎΡ‚ систСмы. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ способ примСнСния этой возмоТности, слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π° систСму.

Π₯отя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ seek() ΠΈ tell() ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ для всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Ρ… классов, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ для Π½ΠΈΡ… дСйствия ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π²ΠΈΠ΄ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ связан ΠΏΠΎΡ‚ΠΎΠΊ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ систСм ΠΏΠΎΡ‚ΠΎΠΊ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ связан ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ cin, cout, cerr ΠΈΠ»ΠΈ clog, Π½Π΅ обСспСчиваСт возмоТности ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ доступа β€” Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° Π΄Π΅ΡΡΡ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, Ссли запись осущСствляСтся нСпосрСдствСнно Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ cout? ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ seek() ΠΈ tell(), ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ Π²ΠΎ врСмя выполнСния это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² нСдопустимоС состояниС.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ классы istream ΠΈ ostream ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ доступа, Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ части этого Ρ€Π°Π·Π΄Π΅Π»Π° Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎ классах fstream ΠΈ sstream.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ установки ΠΈ сообщСния

Для обСспСчСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ доступа Ρ‚ΠΈΠΏΡ‹ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ΠΎΠΌ (marker), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния ΠΈΠ»ΠΈ записи. Они ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ двумя функциями: ΠΎΠ΄Π½Π° устанавливаСт (seek) ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ Π² Π½ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Π° вторая сообщаСт (tell) Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π°. ЀактичСски Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π΄Π²Π΅ ΠΏΠ°Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ установки ΠΈ сообщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ описаны Π² Ρ‚Π°Π±Π». 17.21. Одна ΠΏΠ°Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π²Π²ΠΎΠ΄Π°, Π° вторая β€” ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°. ВСрсии для Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ суффиксом. Буффикс g (getting) ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… (Ρ‡Ρ‚Π΅Π½ΠΈΠ΅), Π° суффикс p (putting) β€” ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… (запись).


Π’Π°Π±Π»ΠΈΡ†Π° 17.21. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ установки ΠΈ сообщСния

tellg() tellp() Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π° (tellg()) ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Ρ‹Π²ΠΎΠ΄Π° (tellp()) seekg(pos) seekp(pos) ΠŸΠ΅Ρ€Π΅ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ pos Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ адрСс Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ pos ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ возвращаСтся ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tellg() ΠΈΠ»ΠΈ tellp() seekp(off, from) seekg(off, from) ΠŸΠ΅Ρ€Π΅ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° off символов Π²ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠ»ΠΈ Π½Π°Π·Π°Π΄ ΠΎΡ‚ значСния from, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ: beg β€” ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°; cur β€” ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°; end β€” ΠΎΡ‚ ΠΊΠΎΠ½Ρ†Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°

Π’ΠΏΠΎΠ»Π½Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, Ρ‡Ρ‚ΠΎ для класса istream, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΎΡ‚ Π½Π΅Π³ΠΎ классов ifstream ΠΈ istringstream (см. Ρ€Π°Π·Π΄Π΅Π» 8.1) ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ вСрсии g, Π° для классов ostream ΠΈ классов ofstream ΠΈ ostringstream, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΎΡ‚ Π½Π΅Π³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ вСрсии p. ΠšΠ»Π°ΡΡΡ‹ iostream, fstream ΠΈ stringstream способны Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΏΠΎΡ‚ΠΎΠΊ, поэтому для Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π΅ вСрсии, g ΠΈ p.