getline(input, state, '#') charilishi (23-qator) orqali, shtatmassiviga belgilar # belgisiga yoki fayl so`ngiga kelgunicha o`qiladi.
Ko`p qo`llaniluvchi, qolgan ikkita funksiyalar – get va put. Kiritish ob’yektida bitta belgini o`qish uchun get funksiyasini, bitta belgini yozish uchun esa, put funksiyasini chaqirishimiz mumkin.
get funksiyasining ikki xil versiyasi mavjud:
char get() //Belgi qaytarish ifstream* get(char& ch) // Belgini ch ga o`qish Birinchi versiya kiritish ob’yektidan belgini qaytaradi. Ikkinchi versiyasi belgili argumentning havolasini yuboradi, belgini kiritish ob’yektidan o`qiydi va uni ch ga yozadi. Shuningdek bu funksiya, kiritish (input) ob’yekti ishlatganda, unga havolani yuboradi.
put funksiyasining sarlavha qismi quyidagicha:
void put(charch)
U ma’lum bir belgini chiqarish (output) ob’yektiga yozadi.
8.7-kodli ro`yxatda bu ikki funksiyadan foydalanishga doir misol berilgan. Dastur foydalanuvchidan faylni kiritishni so`raydi va uni yangi faylga nusxalaydi.
8.7-kodli ro`yxat. CopyFile.cpp 1 #include 2 #include 3 #include 4 using namespace std;
5
6 int main()
7 {
8 // Manbaa faylni kiritish 9 cout << " Manbaa fayl nomini kiriting: ";
10 string kirishFaylNomi;
11 cin >> kirishFaylNomi;
12
13 // Ko`zlangan faylni kiritish 14 cout << "Ko`zlangan fayl nomini kiriting: ";
15 string chiqishFaylNomi;
16 cin >> chiqishFaylNomi;
17
18 // Kirish va chiqish oqimlarini hosil qilish 19 ifstream input(kirishFaylNomi.c_str());
20 ofstream output(chiqishFaylNomi.c_str());
21
22 if(input.fail())
23 {
24 cout << kirishFaylNomi << " mavjud emas!"<< endl;
25 cout << "Dasturdan chiqish..."<< endl;
26 return 0;
27 }
28
29 char ch = input.get();
30 while(!input.eof()) // Agar fayl so`ngi bo`lmasa davom etish 31 {
32 output.put(ch);
33 ch = input.get(); // Keyingi belgini o`qish 34 }
35
36 input.close();
37 output.close();
38
39 cout << "\nNusxalandi!"<< endl;
40
41 return 0;
42 }
Natija:
Manbaa fayl nomini kiriting: c:\example\CopyFile.cpp
Ko`zlangan fayl nomini kiriting: c:\example\temp.txt
Nusxalandi!
Dastur foydalanuvchini mavjud manbaa fayl nomini (11qator) va ko`zlangan fayl nomini (16-qator) kiritishga undaydi. 19-qatorda kirishFaylNomi uchun kiritish ob’yekti – input yaratiladi va 20-qatorda chiqishFaylNomi uchun chiqarish ob’yekti – output hosil qilinadi. Fayl nomlari C-satrlar bo`lishi lozim. kirishFaylNomi.c_str() kirishFaylNomi dan C-satr qaytaradi.
22-27-qatorlar kiritish fayli mavjudligi yoki yo`qligini tekshiradi. 30-34-satrlar get funksiyasidan foydalangan paytda qaytadan belgilarni o`qiydi va putfunksiyasidan foydalanib, belgilarni chiquvchi faylga yozadi.
Faraz qilaylik, 29-34-qatorlar quyidagi kod bilan almashtirilgan:
while(!input.eof()) // Agar fayl so`ngi bo`lmasa davom etish {
output.put(input.get());
}
Nima yuz beradi? Agar dasturimizni ushbu yangi kod bilan ishga tushirsak, yangi fayl originaliga nisbatan bir bayt kattaroq bo`lganini ko`rishimiz mumkin. Ya’ni, yangi fayl o`zining so`ngida qo`shimcha, keraksiz belgiga ega bo`lib qoladi. Buning sababi shundaki, kiruvchi fayldan input.get()dan foydalangan holda, oxirgi belgi o`qilganda, input.eof() false ko`rinishga o`tadi. So`ngra dastur boshqa belgini o`qishga undaydi; input.eof() endi true ga aylanadi. Shunday bo`lsada, ortiqcha keraksiz belgi chiquvchi faylga yuborilib bo`lgan bo`ladi.
8.7-kodli ro`yxatdagi to`g`ri tuzilgan dastur belgini o`qiydi (29-qator) va eof() ni tekshiradi (30-qator). Agar eof() true bo`lsa, belgi output ga yozilmaydi, boshqa hollarda u nusxalanadi (32-qator). Bu jarayon eof()funksiyasi true qiymat qaytarguniga qadar davom etadi.