Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конс_лек_2.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
971.38 Кб
Скачать

Масивів.

Рядок - це ряд символів, які обробляються як один блок. У Сі немає спеціального типу змінної для рядків, як наприклад, в Паскалі. Замість цього рядки мають тип char і збережені в масиві. Символи в рядку зберігаються в суміжних комірках пам'яті, один символ міститься в один осередок, масив складається із суміжних комірок пам'яті, так що рядок розміщається в масиві природним образом. Нумерація елементів масиву починається з нуля.

У мові Сі рядки представлені рядом символів, що закінчуються нульовим символом 70'. Тому, будь-який рядок займає в пам'яті на один символ більше, ніж записано між подвійними лапками.

Приклад:

‘Т' - це символ (літера),

"Т" - це рядок, що складається з двох символів: Т і '\0'. Звідси слідує, що порожніх рядків не буває.

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

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

Приклад:

char name [ЗО].

2) рядок у мові Сі - це різновид константи і її можна привласнювати деякій змінній, що представляє масив символів.

Наприклад:

char str[] = "ТЕКСТ";

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

char str[] = {‘Т’,'Е','К','С',’Т’};

Якщо довжина рядка в квадратних дужках опущена, то вона визначається автоматично, по кількості символів, що привласнюються. У приведеному вище прикладі вона дорівнює шести.

Для того, щоб зчитати в програму, спочатку необхідно зарезервувати місце в пам'яті для її збереження, а потім використовувати функцію введення для завантаження рядка. Для введення рядків призначена функція gets(), а для їхнього виведення - puts().

Функція gets().

Функція gets() (get string - одержати рядок) дуже зручна для використання в інтерактивних програмах. Вона одержує рядок зі стандартного пристрою введення системи - звичайно клавіатури. Оскільки рядок не має заздалегідь визначеної довжини, функція gets() має потребу в способі визначення моменту припинення своєї роботи. Вона зчитує символи доти, поки не досягне символу переходу на інший рядок (‘\n'), що генерується шляхом натискання клавіші Enter. Функція приймає всі символи аж до символу зміни рядка (але не включаючи його), дописує нульовий символ (‘\0’) і передає рядок викликаючій програмі. Сам символ зміни рядка зчитується і відкидається, тому наступне зчитування починається з початку наступного рядка. Найпростіші способи використання функції gets():

#include <stdio.h>

#defineMAX81

int main ()

{

char name [MAX]; /* виділення області в пам'яті */

printf("Hi, what's your name?\n");

gets (name); /* приміщення рядка в масив name */

printf("Nice name, %s\n", name); return 0;

}

Головне розходження між функціями scanf() і gets() полягає в тому, як вони визначають момент досягнення кінця рядка: scanf() є скоріше функцією «одержання слова», чим функцією «одержання рядка». Функція gets() зчитує всі символи аж до першого символу нового рядка. Для переривання уведення функція scanf() має дві можливості. У будь-якому випадку рядок починається з першого зустрінутого символу, відмінного від службового. При використанні формату %s рядок продовжується до наступного службового символу (пробілу, символу табулящї або символу переходу на інший рядок), не включаючи його. У випадку вказівки ширини поля, як у форматі %10s, функція scanf() зчитує до 10 символів або усі символи до першого службового символу (у залежності від того, яке умова виконається раніше).

Функція puts().

Функція puts() дуже проста у використанні. Досить передати їй адресу рядка як аргумент. #include <stdio.h>

#define DEF "I am a fdefined string." int main ()

{

char strl [80] = "An array was initialized to me.";

char *str2 = "A pointer was initialized to me.";

puts ("I'm an argument to puts().");

puts(DEF);

puts(strl);

puts(str2); return 0;

}

Тут кожен рядок відображається у своєму рядку виведення. На відміну від printf(), при виведенні функція puts()() автоматично здійснює перехід на новий рядок. Вона припиняє виведення, зустрівши нульовий символ, тому краще, щоб рядок містив такий символ.

Строкові функції strlen(), strcmp(), strcpy(), strtok()

Бібліотека Сі містить кілька функцій обробки рядків; прототипи цих функцій визначаються в заголовному файлі string.h. До них відносяться функції: strlen(), strcat, strncat, strcmp(), strncmp(), strcpy(), strncpy() та інші.

Функція strlen().

Функція strlen() визначає довжину рядка в символах, виключаючи нульовий символ. Довжина, що повертається, являє собою ціле число типу int.

Наприклад:

#include <stdio.h>

int main ()

{

char strl[80]; gets(str1);

printf("Довжина рядка str1 %d символів \n",strlen(str1));

return 0;

}

Функції strcmp() і strncmp().

Формати функцій:

int strcmp(const char *s1, const char *s2);

int strncmp(const char *sl, const char *s2, size n);

Функція strcmp() (від string comparision - порівняння рядків) призначена для порівняння рядків, причому порівнюється їхній вміст, а не їхня адреса. Ця функція діє стосовно рядків аналогічно тому, як оператори відносин діють стосовно чисел. Має три значення, які повертає:

1 - якщо перший рядок більше другого;

0 - якщо обидва рядки однакові;

-1 - якщо перший рядок менше другого.

Функція strcmp() порівнює рядки доти, поки не знайде відповідний символ, що відрізняється, а для цього може знадобитися перегляд одного з рядків до кінця.

Функція strncmp() порівнює рядки доти, поки вони не будуть відрізнятися або поки не буде виконане порівняння скількох символів, скільки зазначено третім аргументом функції.

Функції strcpyO() і strncpy().

Функція strcpy() призначена для копіювання рядків, являє собою строковий еквівалент операції присвоювання. Працює вона в такий спосіб, рядок, що вказується другим аргументом, копіюється в масив, що задається першим аргументом, і його повертає. Копія називається метою, а вихідний рядок -джерелом. Таким чином, функція strcpy() приймає як аргументи два строкових вказівника. Другий вказівник, що вказує на вихідний рядок, може бути об'явленим вказівником, ім'ям масиву або строковою константою, але перший вказівник, що вказує на копію, повинен указувати на такий об'єкт даних, як масив, досить великий, щоб рядок міг поміститися в ньому. Формат:

char *strcpy(char *s1, const char *s2);

Функція stmcpy(), формат якої наступний:

char *strncpy(char *s1, const char *s2, size n);

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

Функція strtok().

Формат функції:

char *strtok(char *s1, const char *s2);

Ця функція переформує рядок si в окремі знаки; рядок s2 містить символи, що використовуються як роздільники. Функція викликається послідовно. Для першого виклику si повинен указувати на рядок, який необхідно розбити на знаки. Функція знаходить перший роздільник, який слідує за символом, що не є роздільником, і заміняє його пропуском. Вона повертає вказівник на рядок, що містить перший знак. Якщо жодного знака не знайдено, вона повертає NULL. Щоб знайти наступний знак у рядку, необхідно викликати strtok() знову, але першим аргументом поставити NULL. Кожен послідовний виклик повертає покажчик на наступний знак чи на NULL, якщо більше знаків не знайдено.

Функція strtok() трохи незвичайна у використанні, тому нижче приведений невеликий приклад, у якому підраховується кількість слів у реченні.

#include <stdio.h>

#include <string.h> int main ()

{

int і = 0;

char data[40];

const char razd[] = " " /* символи-роздільники */

char *pt;

gets(data);

pt = strtok(data, razd); /* вихідний виклик */

while (pt) /* вихід після одержання NULL */

{

puts(pt); /* показати знак */

pt = strtok(NULL, razd); /* наступний знак */

і

к++;

}

printf("Рядок містить %d слів \n", k);

return 0;

}Структури.

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

На відміну від масиву, що є однорідним об'єктом, структура може бути неоднорідною.

Традиційним прикладом структури є облікова картка працюючого: "службовець" описується набором атрибутів таких як прізвище, ім'я, по батькові (П.І.Б.), адреса, код соціального забезпечення, зарплата і т.д. Деякі з цих атрибутів самі можуть виявитися структурами - П.І.Б.

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

Тип структури визначається записом виду:

struct { список визначень }

У структурі обов'язково повинний бути зазначений хоча б один компонент.

Визначення структури має наступний вид:

тип даних описувач;

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

Приклад:

struct { double х,у;} si, s2, sm[9];

struct { int year;

char moth, day; } date1, date2;

Змінні si, s2 визначаються як структури, кожна з який складається з двох компонентів х и у. Змінна sm визначається як масив з дев'яти структур. Кожна з двох змінних date1, date2 складається з трьох компонентів year, moth, day. Існує і інший спосіб асоціювання імені з типом структури, він заснований на використанні тега структури. Ter структури аналогічний тегу перечислимого типу.

Тег структури визначається в такий спосіб:

struct тег {список описів;};

де тег є ідентифікатором.

У приведеному нижче прикладі ідентифікатор student описується як тег структури.

struct student { char name[25];

int id, age;

char prp; };

Опис структури, що складається з заключеного у фігурні дужки списку описів, починається з ключового слова STRUCT. За словом STRUCT може слідувати необов'язкове ім'я - ярлик структури. Такий ярлик іменує структури цього виду і може використовуватися надалі як скорочений запис докладного опису.

Тег структури використовується для наступного об'явлення структур даного виду у формі:

struct тег списківндентифікаторів;

Приклад:

struct student st1,st2;

Елементи або змінні, згадані в структурі, називаються членами. Ярлики і члени структур можуть мати такі ж імена, що і звичайні змінні, оскільки їхні імена завжди можна розрізнити по контексту. Звичайно однакові імена привласнюють тільки тісно зв'язаним об'єктам.

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

Зовнішню чи статичну структуру можна ініціалізувати, помістивши слідом за її визначенням список ініціалізаторів для її компонентів.

Член визначеної структури може бути зазначений у виразі за допомогою конструкції виду:

ім'я структури. член

Операція вказівки члена структури «.» звязує ім'я структури і ім'я члена. Т.ч. доступ до компонентів структури здійснюється за допомогою вказівки імені структури і наступного через крапку імені виділеного компонента, наприклад:

st1 .name = «Іванов»;

st2.id=st1.id;

st1_node. data=st1.age;

Структури і функції.

У мові Сі існує ряд обмежень на використання структур. Обов'язкові правила полягають у тім, що єдині операції, які можна проводити зі структурами, складаються у визначенні її адреси за допомогою операції & і доступі до одного з її членів. Це призводить до того, що структури не можна привласнювати чи копіювати як ціле, і що вони не можуть бути передані функціям або повернуті ними. На покажчики структур ці обмеження не накладаються, так що структури і функції все-таки можуть зі зручністю працювати спільно. Автоматичні структури, як і автоматичні масиви, не можуть бути ініціалізовані; ініціалізація можлива тільки у випадку зовнішніх чи статичних структур.

Директиви препроцесора

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

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

Препроцесор Сі розпізнає наступні директиви:

# define #if #liпе

#elif #ifdef #undef

# else # ifndef

# endif # include

Знак номера (#) повинний бути першим (без попередніх пропусків) у рядку, що містить директиву. Пропуски допускаються між знаком номера і першою буквою директиви. Деякі директиви вимагають аргументи або значення. Директиви можуть з'являтися де завгодно у вихідному файлі, але вони застосовні тільки до кінця вихідного файлу від місця, де вони з'явилися. Після директив препроцесора крапка з комою не ставиться.

Розглянемо директиви препроцесора більш докладно.

Директива #include.

Директива #include включає в текст програми вміст зазначеного файлу. Ця директива має дві форми.

#include "ім'я файлу" #include<імя файлу>

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

Директива //include може бути вкладеною, тобто у файлі, що включається, теж може міститися директива #include, що заміщається після включення файлу, який містить цю директиву.

Директива #include широко використовується для включення в програму так званих заголовних файлів, що містять прототипи бібліотечних функцій, і тому більшість програм на Сі починаються з цієї директиви.

Директива #define.

Директива #define служить для заміни констант, що часто використовуються, ключових слів, чи операторів виразів деякими ідентифікаторами. Ідентифікатори, що заміняють текстові чи числові константи, називають іменованими константами. Ідентифікатори, що заміняють фрагменти програм, називають макровизначеннями, причому макровизначення можуть мати аргументи.

Директива #define має дві синтаксичні форми:

#define ідентифікатор текст

#define ідентифікатор (список параметрів) текст

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

Приклад:

#define WIDTH 80

#define LENGTH (WIDTH+10)

Ці директиви змінять у тексті програми кожне слово WIDTH на число 80, а кожне слово LENGTH на вираження (80+10) разом з його дужками.

Дужки, що містяться в макровизначенні, дозволяють уникнути непорозумінь, зв'язаних з порядком обчислення операцій. Наприклад, при відсутності дужок вираз t = LENGTH*7 буде перетворено у вираз t = 80 +10*7, а не у вираз t = (80+10)*7, як це виходить при наявності дужок, і в результаті вийде 780, а не 630.

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

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

Директива #undef

Директива #undef використовується для скасування дій директиви #с1ешіе. Синтаксис цієї директиви наступний

#undef ідентифікатор

Директива скасовує дію поточного визначення #define для зазначеного ідентифікатора. Не є помилкою використання директиви #undef для ідентифікатора, що не був визначений директивою #define.

Приклад:

#undef WIDTH

Ці директиви скасовують визначення іменованої константи WIDTH.

Умовна компіляція.

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

Директиви #іf, #elif, #else, #endif.

Синтаксис:

#if<константнии вираз> [<текст>]

[#elif <константнии вираз><текст>] [elif/ <константний вираз><текст>]

.

.

.

[#else <текст>] #епdif

Директива Ш разом з директивами #е1іf, #else і #endif керує компіляцією частин вихідного файлу. Кожній директиві #if у вихідному файлі повинна відповідати закриваюча директива #endif. Між директивами #if і #endif допускається нуль або більше директив #elif і не більш однієї директиви #else.

Директива #else, якщо вона є, повинна бути розташована безпосередньо перед директивою #endif.

Препроцесор вибирає одну з ділянок тексту <текст> для подальшої обробки. Ділянка <текст> - це будь-яка послідовність тексту. Він може займати більше одного рядка. Звичайно це ділянка програмного тексту, що має сенс для компілятора чи препроцесора. Однак, ця не обов'язкова вимога. Препроцесор можна використовувати для обробки будь-якого тексту.

Обраний текст обробляється препроцесором і посилається на компіляцію. Якщо <текст> містить директиви препроцесора, то ці директиви виконуються.

Будь-яка ділянка тексту, не обрана препроцесором, ігнорується на стадії препроцессування і згодом не компілюється.

Препроцесор вибирає окрему ділянку тексту на основі обчислення обмеженого константного виразу <константний вираз>, що стоїть за кожною #if чи #elif директивою, поки не буде знайдений виражез зі значенням істина (не нуль). Вибирається <текст>, що іде за істинним константним виразом до найближчого знака номера (#).

Якщо обмежений константний вираз помилковий або відсутня директива #elif, то препроцесор вибирає <текст> після запису #else. Якщо запис #else опущений, а вираз директиви #if помилковий, то текст не вибирається.

Директиви #if, #elif, #else, #endif можуть бути вкладеними. Кожна з вкладених директив #else, #elif, #endif належить до найближчої попередньої директиві #if.

Директиви #ifdef і #ifndef.

Синтаксис:

#ifdef ідентифікатор #ifndef ідентифікатор

Директиви #ifdef і #ifndef виконують ті ж самі задачі, що і директива #if, яка використовує defined (ідентифікатор). Ці директиви можуть бути використані там же, де використовується директива #if, і використовуються винятково для компактності запису.

Коли препроцесор обробляє директиву ifdef, то робиться перевірка ідентифікатора на істинність.

Директива #ifdef є запереченням директиви #ifdef. Іншими словами, якщо ідентифікатор не визначений (чи його визначення скасоване директивою #undef), то його значення істинне. У противному випадку значення помилкове

(нуль).

Функції в мові Сі. Формальні і фактичні параметри.

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

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

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

З використанням функцій в мові Сі зв'язано три поняття; визначення функції, оголошення функції і виклик функції.

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

Визначення функції.

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

[специфікатор-класу нам'яті[специфікатор-типа] описувач ([список-формальных-параметрів]) тіло-функції

де клас пам'яті - необов'язковий специфікатор, задає клас пам'яті функції, який може бути або static, або extern. Якщо він не заданий, то за умовчанням вважається extern;

специфікатор-типа і описувач задають тип значення, що повертається функцією, і ім'я функції. Якщо специфікатор типу не заданий, то передбачається, що функція повертає значення типу int. Описувач функції може бути заданий із зірочкою, що означає, що функція повертає покажчик. Функції не можуть повертати масив або функцію, але можуть повертати покажчики на будь-який тип, включаючи масиви і функції. Функція повертає значення, якщо її виконання закінчується виконанням оператора return в тілі функції і управління повертається в точку виклику. Якщо оператор return не заданий або не містить виразу, функція не повертає ніякого значення. В цьому випадку специфікатор типу значення, що повертається, повинен бути заданий ключовим словом void, що означає відсутність значення, що повертається.

список формальних параметрів - послідовність оголошень формальних параметрів, розділених комами;

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

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

Список формальних параметрів може закінчуватися комою і багатокрапкою (,...)• Це означає, що число аргументів функції змінно. Якщо функції не передаються аргументи, то замість списку формальних параметрів необхідно задавати ключове слово void.

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

Якщо формальний параметр представлений в списку, але не оголошений, то передбачається, що параметр має тип int.

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

Всі змінні, оголошені в тілі функції є локальними. Коли викликається функція, то для локальних змінних відводиться пам'ять в стеку і проводиться їх ініціалізація (якщо вона задана). Управління передається першому оператору складового оператора, і починається процес виконання, який продовжується до тих пір, поки не зустрінеться оператор return або кінець тіла функції. Управління при цьому повертається в точку виклику.

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

Робота з файлами в Сі

Мова Сі розглядає файл як послідовність байтів, кожний з яких може бути прочитаний індивідуально. Програми Сі автоматично відкривають п'ять файлів. Вони мають назви стандартне введення, стандартне виведення, стандартне виведення помилок, стандартний додатковий потік і стандартний друк: stdin, stdout, stderr, stdaux і stdprn. Для роботи з довільним файлом користувача використовується поняття потоку.

Потік - файл на диску або фізичний пристрій. Для відкриття потоку використовується функція fopen().

FOPEN().

#include <stdio.h> FILE *fopen(pathname, type); char *pathname; path-ім'я файла,

char *type; дозволений тип доступу.

Функція fopen відкриває файл, визначуваний path-ім'ям. Символи в рядку type визначають тип доступу для файла, таким чином.

Режим

Опис

r”

відкрити файл для читання. (Цей файл повинен існувати).

"w"

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

"а"

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

"r+"

відкрити файл одночасно для читання і запису. Файл повинен існувати.

w+”

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

a+"

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

Я

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

Символ

Значення

b

відкрити в двійковому (не перетворюючому) режимі.

t

відкрити в текстовому (перетворюючому) режимі.

кщо файл відкритий за допомогою типу "а" або "а+", всі операції запису виконуються в кінець файла. При використанні функцій fseek або rewind можливо перепозиціонування покажчика на файл; не дивлячись на це, покажчик на файл перед виконанням будь-яких операцій запису завжди повертається в кінець файла. Таким чином, існуючі дані не будуть перезаписані. При використанні типів "r+", "w+", "а+" допускається одночасно читання і запис. (Вважається, що файл відкривається для оновлення). Тому, при перемиканні читання на запис і навпаки потрібно використовувати функції fseek або rewind. Для функції fseek (при необхідності) може бути точно визначена поточна позиція.

Якщо t або b в рядку type не задається, режим перетворення визначається змінні fmode і режимом, встановлюваним за умовчанням.

Функція fopen повертає покажчик на відкритий файл. Значення покажчика NULL свідчить про помилку.

FCLOSE().

Функція fclose() закриває окремий вказаний потік. Все буфера, пов'язані з потоком, перед закриттям потоку вивантажуються. Якщо потік явно не закривається в програмі, він автоматично закривається при завершенні програми.

FEOF().

Функція feof() визначає, чи досягнутий кінець потоку. Після того, як він досягнутий, операції читання з потоку повертатимуть умову кінця потоку до тих пір, поки потік не буде закритий або не буде виконана функція ге\уіпе() для потоку.

FSEEK().

#include <stdio.h> int fseek (stream, offset, origin); FILE * stream; //покажчик на структуру FILE, long offset; //число байтів від origin, int origin; //початкова позиція. Функція fseek() переміщає покажчик, відповідний потоку stream, на нове місце розташування, віддалене від origin на offset байтів. Наступна операція в потоці виконується над новим місцерозташуванням. Якщо потік відкритий для оновлення, то наступною операцією буде або читання, або запис. Аргумент origin може бути однією з наступних констант, визначених в <stdio.h>. ORIGIN ВИЗНАЧЕННЯ

SEEK-SET початок файла.

SEEK-CUR поточна позиція покажчика на файл.

SEEK-END кінець файла.

Функція fseek() використовується для переміщення покажчика в будь-яке місце файла. Покажчик може бути також розміщений за кінцем файла. Проте, спроба розташувати покажчик до початку файла приведе до помилки.

Функція fseek() повертає значення 0, якщо покажчик успішно переміщений. У разі помилки повертається будь-яке ненульове значення. Для пристроїв, не сумісних з операцією seek, (таких як термінал і принтер), значення, що повертається, невизначено.

REWIND().

#include <stdio.h>

void rewind(stream);

FILE * stream; //покажчик на структуру FILE.

Функція rewind() переміщає покажчик на файл, пов'язаний з потоком stream, до початку файла.

Читання і запис у файл.

FWRITE() і FREAD().

Функція fwrite() записує двійкові дані у файл. Повертає кількість успішно записаних блоків.

Функція fread() читає дані з двійкового файла і повертає число успішно прочитаних блоків.

Для читання і запису в текстовий файл застосовуються всі вивчені раніше функції введення/виведення, до яких як префікс додається буква/, вказуюча на роботу з файлом і першим аргументом в них виступає ім'я файла (потоку). Наприклад: fscanf(), fputs(), fprintf() та інші.

Введення.

Мова Сі і Турбо Сі. Достоїнства і недоліки.

Мова Сі була створена в 1972 р. співробітником фірми Bell Laboratories Деннісом Рітчи, коли він і Кен Томпсон займалися розробкою ОС UNIX. Проте мова Сі не виникла на порожньому місці. Вона з'явилася від розробленої Томпсоном мови В. Важньїм моментом є те, що мова Сі була створена як інструмент для працюючих програмістів, тому головна мета розробки цієї мови програмування полягає в тому, щоб її застосування було корисним при розробці різних програм.

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

Існує ряд причин, по яких Сі став вельми популярний останніми роками. Основна з них полягає у високій швидкості виконання одержуваного коду і його компактності, що особливо цінно для професійних додатків.

Еволюція мови програмування Сі.

На початку 80-х років мова Сі вже була домінуючою мовою в світі мінікомп'ютерів, що працюють під управлінням ОС UNIX. З тих пір вона розповсюдилася на персональні комп'ютери і на майнфреймьі. Багато фірм по розробці ПЗ вважають за краще використовувати мову програмування Сі для створення текстових процесорів, електронних таблиць, компіляторів і інших програмних продуктів. Ці компанії знають, що такі програми можна буде легко пристосовувати і модифікувати для нових моделей комп'ютерів.

В 90-ті роки велика кількість фірм по розробці ПЗ для виконання великих програмних проектів перейшли на мову C++. Мова C++ - це мова Сі, до якої додали засоби об'єктно-орієнтованого програмування. Мова програмування C++ є, практично, розширенням мови Сі.

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

Ця мова побудована так, що дозволяє користувачам природним чином застосовувати програмування «зверху-вниз», структурний підхід і модульне проектування програм. В результаті виходять більш надійні і зрозумілі програми.

Турбо Сі

В грудні 1986 p. невелика компанія під назвою Wigard Software Systems Inc. оголосила про свій переїзд з міста Армінгтон, штат Массачусетс, в місто Монте Серено, штат Каліфорнія. Ця компанія створила і почала продаж компілятора Сі вартістю 450 доларів під назвою Wizard С.

Wizard С був компілятором, заслуговуючим пошани, завжди одержуючим хороші відгуки в оглядах і навіть названий, принаймні одним з оглядачів, «кращим» компілятором Сі. Його достоїнства полягали у високій швидкості компіляції, ефективної оптимізації одержуваного коду, відповідності вимогам стандарту ANSI і великому числі розширень мови, дозволяючих розробляти програми обробки переривань. Ці розширення містили в собі функцію переривання спеціального типу, можливість вбудовування в тіло програми фрагментів на мові асемблера, псевдозмінни, за допомогою яких з мови Сі виконується доступ до регістрів мікропроцесора.

В лютому 1987 р. фірма Borland International з Скоттс-Веллей, штат Каліфорнія, оголосила про створення компілятора Турбо Сі, який очікувався з нетерпінням після появи його попередника, дуже вдалого компілятора Турбо Паскаль.

В тому ж місяці Wizard зробила своє останнє оголошення. В травні 1987 р. з'явилася версія 1.0 Турбо Сі (спільно з T-shirts), який подавив всіх своїми характеристиками.

Насправді фірма Borland International придбала фірму Wigard Systems для того, щоб створити Турбо Сі. Промисловість робила припущення про те, коли Borland вийде на ринок компіляторів Сі, після того, як вона вже представила свої вироби: Турбо Паскаль, а вслід за ним дуже популярний Турбо Бейсік. Замість того, щоб робити великі зусилля, починаючи з нуля, фірма Borland ухвалила мудре рішення: вона купила кращий компілятор Сі і сконцентрувала зусилля на тому, щоб зробити його ще краще.

На момент анонсування фірмою Borland свого компілятора на ринку було представлено 17 компіляторів Сі для IBM PC. Після публікації інформації про Турбо Сі багато хто сумнівався, небагато мали уявлення про нього, але всі жадали побачити його на власні очі. Мир Сі був готовий прийняти ще один компілятор, за умови, що він поступить від Borland. Сам цей стан очікування мав дуже велике значення. Фірма Borland почала справу не для того, щоб створити черговий компілятор Сі; Borland поставила за мету змінити уявлення про те, як повинне виглядати програмне середовище для розробки програм на мові Сі.

Турбо Сі позначає два програмні вироби: пакет програм, забезпечуючий виконання послідовності команд в стилі Unix: make/compiler/linker, і інтегроване програмне середовище для розробки програм.

Пакет програм містить утиліту make, компілятор tec і компонувальник, що настроюється. Компілятор, що входить в пакет, схожий на більшість інших компіляторів Сі для IBM PC, але є більш швидким.

Інтегроване програмне середовище є програмою під назвою tc, яка об'єднує в собі текстовий редактор, орієнтований на створення текстів програм на мові Сі, будівник задач, орієнтований на реалізацію програмного проекту, і утиліти виконання програм.

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

Користувач має нагоду набудувати інтегроване середовище, в якому все, від кольору зображення на екрані до рівня контролю за помилками, може бути встановлено по його вимозі. Нижче приводиться список параметрів, значення яких можуть встановлюватися на вимогу замовника:

  • модель пам'яті: крихітна, мала, середня, компактна, велика, величезна;

  • угода про функції, що викликаються - Сі або Паскаль;

- плаваюча арифметика;

- рівень оптимізації;

- рівень контролю за помилками.

Можна вибирати і більше число параметрів Турбо Сі. Турбо Сі здатний здійснювати строгий контроль за помилками і підозрілими місцями в програмі і видавати застережливі повідомлення.

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