- •Лекція № 11 обмін даними з файлами
- •1. Файли і потоки, буферизація даних
- •2. Групи функцій для роботи з потоками
- •3. Відкриття/закриття потоків
- •3.1. Відкриття потоків.
- •4. Стандартні потоки, перескерування потоків
- •5. Функції потокового введення/виведення даних
- •5.1. Посимвольний обмін даними
- •5.2. Файловий обмін рядками символів
- •5.3. Обмін блоками даних
- •5.4. Форматне введення/виведення даних
- •6. Встановлення поточної позиції файлу
- •7. Функції аналізу помилок
- •8. Керування буферизацією даних
- •9. Витирання та перейменування файлів
- •10. Інші засоби для роботи з файлами
- •10.2. Низькорівневе звертання до файлів
4. Стандартні потоки, перескерування потоків
Стандартні потоки С. На початку виконання кожної С-програми автоматично відкриваються три стандартні потоки:
-
stdin - стандартний потік введення, який за правилами замовчування пов'язується з клавіатурою;
-
stdout - стандартний потік виведення, який найчастіше пов'язується з виведенням даних на екран;
-
stderr - стандартний потік повідомлень про помилки, який теж здебільшого скеровується на екран.
Ці потоки мають визначені імена, поза цим вони нічим не відрізняються від інших потоків, їх можна використовувати в усіх операціях файлового введення/виведення.
Перескерування потоку. Важливо, що стандартні потоки можна перескеровувати (перепризначати), тобто пов'язувати їх зі заданим файлом чи пристроєм. Перескерування підтримується не всіма операційними системами, але воно реалізоване в MS DOS, Windows, Unix, OS/2. Застосовуючи перескерування, можна простим способом записати в файл всі дані, які в програмі передаються у стандартний потік виведення, чи організувати зчитування з файлу тих даних, які згідно з алгоритмом програми повинні надходити зі стандартного потоку введення.
Перескерування потоків виконує функція
FILE* freopen (char* fname, char* fmode, FILE* fp);
Ця функція пов'язує потік fp з файлом, ім'я якого задає параметр fname, а режим доступу до даних - параметр fmode. Значення та форми задання параметрів fname і fmode такі ж, як і у відповідних параметрів функції fopen (). За умови успішного виконання функція freopen () повертає вказівник на створений потік, а в разі помилки - константу NULL.
Слід пам'ятати, що після перескерування stdout всі операції виведення (зокрема, виведення підказок) будуть виконуватись не на екран, а в заданий файл. Аналогічно, в разі перескерування потоку введення stdin, всі дані, які за замовчуванням вводяться з клавіатури, будуть зчитуватись зі заданого файлу. Стандартні потоки не треба ні відкривати, ні закривати - ці дії виконуються автоматично.
Приклад перескерування стандартного потоку виведення подано в наступній короткій програмі, де перше звертання до функції puts () викликає виведення повідомлення на екран, а друге - у файл example.out.
/***************************************************************************/
/* Приклад перескерування стандартного потоку виведення */
/*******************************************************************************/
#include <stdio.h>
int main (void)
{
puts("\n\t” Це повідомлення виводиться на екран. \n");
freopen ("example.out", "w", stdout); /* потік скеровано в файл */
puts("Дане повідомлення буде записане в файл. \n ");
return 0;
}
MS DOS дозволяє також здійснювати перескерування стандартних потоків з командного рядка. Для цього використовують символи < та >, за якими вказують ім'я файла перескерування. Наприклад, запуск виконавчого коду програми countmax.exe з командного рядка у формі:
countmax.exe < numbers.dat > results.dat
вказує, що в процесі роботи програми countmax.exe дані, які мають вводитись зі стандартного вхідного потоку, будуть зчитуватись з файла numbers.dat, а дані, які виводяться у стандартний потік виведення, будуть записуватись у файл results.dat.
