Функції get() та put()
istream &get(char &ch);
ostream & put(char ch);
Функція get() зчитує один символ з потоку та записує його значення в ch. Вона повертає посилання на потік. Функція put() записує ch у потік та повертає посилання на цей потік.
Функції використовують для текстових та бінарних файлів. При роботі з бінарними файлами необхідно відкрити їх в режимі ios::binary.
Приклад здійснює зчитування файла в бінарному ркежимі будь-який файл.
#include <iostream> #include <fstream> using namespace std; int main() { char sf[40]; char ch; | |
fstream F; | //повязуємо змінну F з потоком для режиму зчитування |
printf("Введіть ім_я файлу: "); gets(sf); | |
F.open(sf, ios::in | ios::binary); | //відкриття файлу для зчитування в бінарному режимі |
if (F) { | |
//варіант зчитування №1 /* while (F) { F.get (ch); cout << ch; } */ | // цикл зчитує посимвольно відкритий файл |
//варіант зчитування №2 while (F.get(ch)) cout << ch; | |
F.close(); } else | |
cout<<"Помилка відкриття файлу "<<endl; return 0; } |
Приклад ілюструє запис у файл по одному символу введеного символьного рядка.
|
|
#include <string.h> #include <iostream> #include <fstream> using namespace std; int main() { | |
int i=0; char sf[80], str[80]; char ch; | |
ofstream F; | //повязуємо змінну F з потоком для режиму запису |
printf("Введіть ім_я файлу: "); gets(sf); | |
F.open(sf, ios::out | ios::binary); | // відкриваємо файл для запису в бінарному режимі |
if (F) { | |
printf("Введіть символьний рядок: "); gets(str); | |
for(int i=0;i < strlen(str);i++) F.put(str[i]); | //посимвольно записуємо введений рядок |
F.close(); } | |
else cout<<"Виникла помилка "<<endl; return 0; } |
Результат виконання:
Введіть ім_я файлу: c:\dat.txt
Введіть символьний рядок: I love C++.
Результат запису у файл:
Функції read() та write()
istream &read(unsigned char *buf, int num);
ostream &write(const unsigned char *buf, int num);
Функція read() зчитує num байт з потоку у буфер buf.
Функция write() записує num байт в потік з буферу buf.
Буфер buf представляє собою масив символів, тому для запису будь-яких даних необхідно перетворити до масиву символів.
Якщо кінець файлу досягається до того, як буде зчитано задане число символів, функція read() зупиниться, а у буфері буде знаходитись кількість зчитаних символі. Для визначення кількості зчитаних символів використовують функцію int gcount().
Приклад ілюструє використання цих функцій для запису та зчитування цілого одновимірного масиву:
#include <string.h> #include <iostream> #include <fstream> using namespace std; int main() { int n[5] = {1, 2, 3, 4, 5}; int i; | |
ofstream Fzap; | //оголошення змінної, пов’язаною з потоком введення |
Fzap.open("c:\\priklad.dat", ios::out | ios::binary); | //відкриваємо файл в бінарному режимі для запису даних |
if (!Fzap) { cout<<"Помилка відкриття файлу "<<endl; return 0; } | //перевіряємо чи файл відкрився, якщо ні то дати повідомлення на екран та вийти з програми |
Fzap.write((char *) &n, sizeof(n)); | //записуємо змінну n розміром sizeof(n) |
Fzap.close(); | //зачиняємо файл |
for (i=0; i<5; i++) n[i] = 0; | //очищуємо масив шляхом обнулінням кожного елемента |
ifstream Fread; | //оголошення змінної, пов’язаною з потоком виведення |
Fread.open("c:\\priklad.dat", ios::in | ios::binary); | //відкриваємо файл в бінарному режимі для зчитування даних |
if (!Fread) { cout<<"Помилка відкриття файлу "<<endl; return 0; } | //перевіряємо чи файл відкрився, якщо ні то дати повідомлення на екран та вийти з програми |
Fread.read((char *) &n, sizeof(n)); | //зчитування інформації в змінну n розміром sizeof(n) |
Fread.close(); | //зачиняємо файл |
printf("Зчитаний вектор: "); for (i=0; i<5; i++) cout << n[i] << " "; | //виводимо на екран зчитаний масив |
return 0; } |
Результат запису у файл
|
|
Результат виконання програми
Зчитаний вектор: 1 2 3 4 5