Створення файлу

Виклик creat - це просто різновид виклику open у формі

d=open(ім'я_файлу,O_WRONLY|O_TRUNC|O_CREAT,mode);

 

creat - створює новий або очищає існуючий файл і відкриває його на запис

 

#include <sys/stat.h>

#include <sys/types.h>

#include <fcntl.h>

int creat(const char *path, mode_t perms)

 

path - повне ім'я файлу

perms - права доступу

Повертає дескриптор файлу або -1 у випадку помилки

 

Читання даних виконується з використанням функцій з бібліотеки мови Си. Зокрема, для читання можна використовувати функцію:

ssize_t read(int fdes, char *buf, size_t count);

Запис у файл може виконуватися по функції:

ssize_t write(int fdes, char *buf, size_t count);

 

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

Закривається файл функцією

int close(int fdes);

аргументом функції є дескриптор відповідного файлу.

 

Позіціонуваня у файлі

 

Системний виклик lseek використовується для переустановлення поточної позиції у файлі. Він не виконує ніяких операцій введення-виводу і не віддає команд контроллеру диска.

 

#include <sys/types.h>

#include <unistd.h>

off_t lseek( int fd, off_t offset, int whence );

 

fd - дескриптор файлу

pos - позиція у файлі

whence - інтерпретація аргументу pos

Повертає нову позицію у файлі або -1 у разі помилки (код помилки в змінній errno)

 

Аргумент whence може приймати одне з наступних значень:

SEEK_SET Аргумент pos містить зсув від початку файлу (абсолютна позиція у файлі).

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

SEEK_ENO Аргумент pos містить зсув від кінця файлу. Може бути позитивним числом, нулем і негативним числом. Вказавши в аргументі pos значення 0 — ми встановимо поточну позицію в кінець файлу.

 

Результатом роботи виклику може бути будь-яке ненегативне число, що навіть перевищує розмір файлу. Якщо нова поточна позиція опинилася за межами файлу, то найближчий виклик write вставить «бракуючий» шматок в кінець файлу і заповнить його байтами із значенням 0. Виклик read, з поточною позицією встановленою в кінець файлу або за його межами, поверне ознаку кінця файлу — 0. Спроба читання з інтервалу, який заповнив виклик write при вставці «бракуючого» шматка, увінчається успіхом і в зухвалу програму буде повернений буфер, заповнений нулями, як того і слід було чекати.

 

 

Приклад - копіювання даних з одного файлу в новий файл.

 

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <errno.h>

#include <unistd.h>

int main() {

int fdIn; //Вхідний файл

int fdOut; //Вихідний файл

char buf[256]; //Буфер обміну

char InName[20], OutName[20]; //Імена файлів

ssize_t nRd;

 

// Уведення імен вхідного й вихідного файлів

printf("Ім'я вхідного файлу -> ");

gets(InName);

printf("Ім'я вихідного файлу -> ");

gets(OutName);

 

// Відкриття файлів

if((fdIn=open(InName, O_RDONLY))==-1)

{perror("Помилка відкриття вхідного файлу"); exit(-1);}

if((fdOut=open(OutName, O_WRONLY|O_CREAT,644))==-1)

{ perror("Помилка відкриття вихідного файлу"); close(fdIn);

exit(-2); }

 

// Цикл копіювання

while((nRd=read(fdIn, buf, 256))>0)

{ if(write(fdOut, buf, nRd)<nRd)

{ perror("Помилка запису"); close(fdIn); close(fdOut); exit(-3); }

}

close(fdIn); close(fdOut);

printf("Завершення програми\n"); exit(0);

}

 

При відкритті вхідного файлу задається ключ режиму роботи з файлом "тільки для читання" (O_RDONLY). Функція повертає дескриптор відкритого файлу. У випадку помилки вертається -1. Для висновку повідомлення про помилку використовується функція perror(). Ця функція виводить задається їй як аргумент текст. Крім того, функція обробляє системний номер помилки (errno) і додає у виведений рядок системне повідомлення про помилку.

Функція, що відкриває вихідний файл повертає дескриптор вихідного файлу. Ця функція виконується з режимами "тільки для запису" (O_WRONLY) і із ключем створення нового файлу (O_CREAT). Крім цього, при виклику функції використовується третій параметр (644), що визначає права доступу до створюваного файлу (читання й запис для власника й тільки читання для інших користувачів).

 

5. Індівідуальні завдання

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

Варіанти завдань