C установка IDE C структура програми C змінні C типи даних С функція printf C константи C арифметичні операції C операції порівняння і логічні операції C порозрядні операції C операції присвоювання C перетворення типів C умовні конструкції C цикли С масиви і рядки С функція scanf C препроцесор. Директива #include C #define директива C макроси C умовна компіляція C функції. Визначення та опис функцій C функції. Передача параметрів в функцію C функції. Повернення результату з функції C функції. Рекурсивні функції C область видимості змінних C зовнішні об'єкти C вказівники C вказівник. Операції з вказівниками C покажчики. Арифметика покажчиків C покажчики. Константи і покажчики C покажчики. Покажчики та масиви C покажчики. Масиви покажчиків, рядки і багаторівнева адресація C покажчики. Покажчики в параметрах функції C покажчики. Динамічна пам'ять C покажчики. Покажчик як результат функції C покажчики. Управління динамічної пам'яттю C покажчики. Покажчики на функцію C покажчики. Покажчики на функції як параметри і результати функцій C покажчики. Функції зі змінною кількістю параметрів C struct. Визначення структур C struct. Структури як елементи структур C struct. Покажчики на структури C struct. Масиви структур C struct. Структури і функції C struct. union об'єднання C struct. Бітові поля С file. Введення-виведення і робота з файлами C file. Читання і запис бінарних файлів C file. Читання і запис структур в файл C file. Читання і запис текстових файлів C file. Форматування вводу-виводу C file. Позиціонування в потоці C file. Консольне введення-виведення

С file. Введення-виведення і робота з файлами


Файл в мові Сі розглядається як неструктурована послідовність байтів. З цієї точки зору в мові програмування C файлом може бути як власне файл на жорсткому диску, так і принтер, дисплей і інші підключаються пристрої введення-виведення.

Як правило, взаємодія між додатком і файлами здійснюється за допомогою обміну блоків байт фіксованої довжини (зазвичай довжина становить ступінь двійки - 256 або 512 байт).

При читанні з файлу дані містяться в буфер операційної системи, а потім побайтно передаються з додатком.

При записи в файл дані накопичуються в буфері, а при заповненні буфера записуються на диск у вигляді єдиного блоку байт.

Буфери представляють ділянки пам'яті, тому передача даних між додатком і буфером відбувається досить швидко на відміну від взаємодії з фізичними пристроями типу принтера.

Файл разом з наданими коштами буферизації представляє потік .

Мова програмування Сі містить необхідний функціонал для роботи з файлами і пристроями введення-виведення. Для застосування його застосування в програмі необхідно підключити заголовний файл stdio.h .


Відкриття та закриття потоків

Щоб працювати з потоком, його необхідно відкрити. Для відкриття потоку застосовується функція fopen () , яка має наступний прототип:

FILE * fopen(імя_файла, режим_відкриття);

Перший параметр представляє ім'я файлу, а другий задає режим відкриття, від якого залежить, як файл може бути оброблений.

Функція повертає покажчик на структуру, яка має тип FILE , певний в тому ж файлі stdio.h. Цей покажчик ідентифікує потік в програмі і через нього ми зможемо звертатися до відкритого файлу.

При відкритті потік зв'язується зі структурою


режими відкриття

Кожен режим задається в вигляді набору символів. Зокрема, ми можемо використовувати такі режими:

  • "w" : текстовий файл відкривається для запису. Якщо файл раніше існував, то він пересоздается і записується заново

  • "r" : текстовий файл відкривається для читання

  • "a" : текстовий файл відкривається для додавання в нього нових даних. Якщо файл існував раніше, то дані просто додаються

  • "w +" : текстовий файл створюється для запису / запису. Якщо файл раніше існував, то при першому записі після відкриття він пересоздается і записується заново. А при наступних записах після відкриття дані додаються в нього без перезапису.

  • "r +" : текстовий файл відкривається для читання / запису. Запис допустима в будь-якому місці файлу, крім кінця файлу, тобто неприпустимо збільшення розмірів файлу.

  • "a +" : текстовий файл відкривається або створюється (при його відсутності) для читання / запису. На відміну від режиму w + файл, при відкритті пересоздается заново, а на відміну від режиму r + можна записувати дані в кінець файлу

  • "wb" : бінарний файл відкривається для запису

  • "rb" : бінарний файл відкривається для читання

  • "ab" : бінарний файл відкривається для дозаписи

  • "w + b" : бінарний файл створюється для запису / читання

  • "r + b" : бінарний файл відкривається для читання / запису

  • "a + b" : бінарний файл відкривається або створюється (при його відсутності) для читання / дозаписи

Режими дозволяють розмежувати доступ до файлу і відкрити його тільки для читання або тільки для запису або поєднати обидва варіанти. Крім того, на рівні режимів відбувається поділ файлів на текстові і бінарні. І програма буде обробляти файли певним чином, в залежності який режим буде обраний - для текстових або бінарних файлів. Неправильно заданий режим може привести до некоректної інтерпретації файлу.


закриття файлу

Після завершення роботи з файлом його слід закрити. Для цього застосовується функція fclose () :

int fclose(указатель_на_поток);

Єдиний параметр функції являє раніше отриманий при відкритті файлу покажчик на структуру FILE, пов'язаний з файлом.

Функція повертає число: 0 - у разі успішного виконання і вбудоване значення EOF у випадку помилки.

Наприклад, відкриємо і закриємо файл "D: \ data.txt":

#include <stdio.h>
 
int main(void)
{
    FILE * fp = fopen("D:\data.txt", "w");
    fclose(fp);
    return 0;
}

Обробка помилок

У процесі відкриття або створення файлу ми можемо зіткнутися з низкою помилок, наприклад, при відкритті в режимі читання не опиниться подібного файлу, недостатньо пам'яті і т.д. І в разі виникнення помилки функція fopen() повертає значення NULL . Ми можемо обробити виникнення помилки за допомогою перевірки результату функції:

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    FILE * fp;
    if((fp= fopen("D:\data28.txt", "r"))==NULL)
    {
        perror("Error occured while opening data28.txt");
        exit(0);
    }
     
    fclose(fp);
    return 0;
}

Для виведення помилки на консоль застосовується вбудована функція perror () . І так як подальші дії в програмі в разі помилки при відкритті файлу сенсу не мають, то за допомогою виклику exit (0) завершуємо роботу програми.

І якщо при спробі відкриття файлу за вказаною шляху його не виявиться, то консоль виведе наступну помилку:

Помилка не відбулося при відкритті data28.txt: Немає такого файлу або каталогу

Наш партнер:
beta test mp3 playlist downloader