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. Консольне введення-виведення

C file. Читання і запис бінарних файлів


Робота з бінарними файлами здійснюється за допомогою посимвольного читання-запису.

Для читання одного символу застосовується функція getc () (функція fgetc () аналогічна). Вона має наступний прототип:

int getc(FILE *stream);

Як параметр у функцію передається покажчик на файловий потік, а повертається значенням є лічений з файлу символ, точніше його числовий код.

Для запису символу в файл застосовується функція putc () , яка має наступний прототип:

int putc(int c, FILE *stream);

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

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

Застосуємо ці функції в програмі:

#include <stdio.h>
 
int write(char * filename, char message[], int n);
int read(char * filename);
 
int main(void)
{
    char hello[] = "hello world!";
    char * filename = "D://data.txt";
     
    int n = sizeof(hello)/sizeof(hello[0]);
     
    write(filename, hello, n);
    read(filename);
     
    return 0;
}
 
int write(char * filename, char message[], int n)
{
    FILE * fp;
    if((fp= fopen(filename, "w"))==NULL)
    {
        perror("Error occured while opening file");
        return 1;
    }
     
    // посимвольно записываем в файл
    for(int i=0; i<n; i++)
    {
        putc(message[i], fp);
    }
     
    fclose(fp);
    return 0;
}
 
int read(char * filename)
{
    FILE * fp;
    char c;
    if((fp= fopen(filename, "r"))==NULL)
    {
        perror("Error occured while opening file");
        return 1;
    }
    // после записи считываем посимвольно из файла
    while((c=getc(fp))!= EOF)
    {
        printf("%c", c);
    }
     
    fclose(fp);
    return 0;
}

Для запису і читання файлу визначені функції write і read відповідно. У функції write пробігає по масиву символів і кожен з них заносимо в файл, передаючи символ в виклик putc() .

У функції read зчитуємо по одному символу з файлу через виклик getc() . Тут варто звернути увагу на процес зчитування файлу. Коли буде досягнуто кінець файлу, функція getc () поверне значення EOF , яке визначено в файлі stdio.h. Тому ми можемо зчитувати файл, поки не отримаємо значення EOF.

У підсумку на консоль буде виведено раніше записане повідомлення, а на диску D ми зможемо знайти файл data.txt з цим повідомленням.


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