Створення файлу
Виклик 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. Індівідуальні завдання
Відповідно до варіанта завдання розробити й налагодити програму. Вихідні дані вводяться із клавіатури й записуються в текстовий файл. Програма читає ці дані, після обробки результати також містяться у файлі.
Варіанти завдань