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. Читання і запис текстових файлів


При роботі з текстовими файлами граздо простіше працювати з даними не як з окремими символами, а як з рядками за допомогою функцій gets () і puts () .

Функція puts () записує в файл рядок, тобто набір символів, який завершується символом '\ 0'. Вона має наступний прототип:

int fputs(const char *s, FILE *stream);

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

При записи рядки нульовий символ '\ 0' в файл не записується.

Функція fgets () зчитує з файлу один рядок і має наступний прототип:

char * fgets(char *s, int n, FILE *sream);

Перший параметр char *s представляє рядок, в яку проводиться зчитування. Другий параметр - число n вказує, скільки символів необхідно зчитувати. І третій параметр представляє файловий потік, з якого виробляється зчитування.

При виклику функція зчитує з файлу не більше n-1 символів. Функція припиняє читання, коли прочитає n-1 символів або зустріне символ розриву рядків \ n. Все лічені символи записуються в рядок s, в тому числі символ \ n. І також кінець кожного рядка дописується нульовий символ '\ 0'.

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

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

#include <stdio.h>
 
int main(void)
{
    char * message = "Hello \n world!\n An apple a day keeps the doctor away";
    char * filename = "D://data5.txt";
    char cc[256];
    FILE *fp;
     
    // запись в файл
    if((fp= fopen(filename, "w"))==NULL)
    {
        perror("Error occured while opening file");
        return 1;
    }
    // записываем строку
    fputs(message, fp);
 
    fclose(fp);
     
    // чтение из файла
    if((fp= fopen(filename, "r"))==NULL)
    {
        perror("Error occured while opening file");
        return 1;
    }
    // пока не дойдем до конца, считываем по 256 байт
    while((fgets(cc, 256, fp))!=NULL)
    {
        printf("%s", cc);
    }
     
    fclose(fp);
    return 0;
}

Спочатку відкриваємо файл на запис і за допомогою виклику fputs(message, fp) записуємо в файл шуканий рядок. Потім відкриваємо файл на читання і в циклі зчитуємо з файлу по 256 символів і виводимо їх на консоль за допомогою виклику fgets(cc, 256, fp) . Коли дані у файлі закінчаться, функція поверне NULL, і відбудеться вихід з циклу.

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

#include <stdio.h>
 
int main(void)
{
    char * filename1 = "D://data1.txt";
    char * filename2 = "D://data2.txt";
    char cc[256];
    FILE *f1, *f2;
     
    if((f1= fopen(filename1, "r"))==NULL)
    {
        perror("Error occured while opening file");
        return 1;
    }
    if((f2= fopen(filename2, "w"))==NULL)
    {
        perror("Error occured while opening file");
        return 1;
    }
     
    // пока не дойдем до конца, считываем по 256 байт
    while((fgets(cc, 256, f1))!=NULL)
    {
        // записываем строку
        fputs(cc, f2);
        printf("%s", cc);
    }
     
    fclose(f1);
    fclose(f2);
     
    return 0;
}

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