Введення. 2
Загальні положення. 3
Потоковий ввод-вивід 9
Форматний ввід-висновок. 13
Форматний введення з вхідного потоку. 15
Література 17
Введення.
У стандарті мови Сі відсутні засоби введення-виведення. Всі операції вводу-виводу реалізуються з допомогою функцій, що знаходяться в бібліотеці мови Сі, що поставляється в складі конкретної системи програмування Сі. Під час роботи з файлами дані можуть передаватися або у своєму внутрішньому двійковому поданні або в текстовому форматі, тобто в більш зрозумілому людині вигляді.
Особливістю мови Сі, який вперше був застосувати три розробці операційної системи UNIX, є відсутність заздалегідь спланованих структур файлів. Всі файли розглядаються як неструктурована послідовність байтів. При такому підході до організації файлів вдалося поширити поняття файлу та на різні пристрої. В UNIX конкретному пристрою відповідає так званий "спеціальний файл", а одні і ті ж функції бібліотеки мови Сі використовуються як для обміну даними з файлами, так і для обміну з пристроями.
Бібліотека мови Сі підтримує три рівні введення-виведення: потоковий ввід-висновок, введення-виведення нижнього рівня і введення-виведення для консолі і портів. Останній рівень, забезпечує зручний спеціалізований обмін даними з дисплеєм і портами введення-виведення, ми розглядати не будемо в силу його системної залежності. Наприклад, він різний для MS-DOS, Windows і UNIX.
Загальні положення.
Мова Сі є фундаментом С + +. При цьому С + + підтримує всю файлову систему Сі. Тому при використанні С-коду в С + + немає необхідності міняти процедури введення-виведення. Хоча при написанні програм на С + + зазвичай більш зручно використовувати саме систему С + +. Це стосується, зокрема, і використання "iostream.h" натомість "stdio.h", які реалізують введення-виведення. Вивчимо файловий ввід-висновок в мові Сі. Тим більше, що це саме по собі дуже цікаво і дуже важливо для розуміння "потоків" і "файлів" як в Сі, так і в С + +.
В системі вводу-виводу в Сі для програм підтримується єдиний інтерфейс, який не залежить від того, до якого конкретному пристрою здійснюється доступ. Тобто в Сі між програмою і пристроєм знаходиться щось більш загальне, ніж сам пристрій. Таке узагальнене пристрій введення або виведення (пристрій більш високого рівня абстракції) називається потоком. У той же час конкретний пристрій називається файлом. Наша завдання - зрозуміти, яким обрз відбувається взаємодія потоків і файлів.
Файлова система Сі призначена для роботи з різними пристроями, в тому числі з терміналами, дисководами і накопичувачами. Навіть, якщо якийсь пристрій дуже сильно відрізняється від інших пристроїв, буферізованние файлова система все одно представить його у вигляді логічного пристрою, який називається потоком. Всі потоки поводяться схожим чином. І так як вони в основному не залежать від фізичних пристроїв, то та ж функція, яка виконує запис в дисковий файл, може ту ж операцію виконати і на іншому пристрої. Наприклад, на консолі. Потоки бувають двох видів: текстові і двійкові.
У мові Сі файлом може бути все, що завгодно, починаючи в дискового файлу і закінчуючи терміналом або принтером. Потік пов'язують з певним файлом, виконуючи обов'язкову операцію відкриття. Як тільки файл відкритий, можна проводити обмін інформацією між ним та програмою.
Але не у всіх файлів однакові можливості. Наприклад, до дискового файлу прямий доступ можливий, в той час як до деяких принтерів - він не можливий. Таким чином, ви бачите, що напрошується певний висновок, який є принципом системи введення-виведення мови Сі: всі потоки однакові, а файли - ні!
Якщо файл може підтримувати запити на місце розташування (покажчик поточної позиції), то при відкритті такого файлу покажчик поточної позиції у файлі встановлюється в початок файлу. При читанні кожного символу з файлу (або запису у файл) покажчик поточної позиції збільшується. Тим самим забезпечується просування по файлу.
Файл від'єднується від певного потоку (тобто розривається зв'язок між файлом і потоком) за допомогою операції закриття файлу. При закритті файлу, відкритого з метою виведення, вміст (якщо воно, звичайно, є) пов'язаного з ним потоку записується на зовнішній пристрій. Цей процес зазвичай називають дозапису потоку. При цьому гарантується, що ніяка інформація випадково не залишиться в буфері диска.
Якщо програма завершує роботу нормально, тобто або main () повертає керування операційній системі, або вихід відбувається через exit (), то всі файли закриваються автоматично.
У випадку ж аварійного завершення роботи програми, наприклад, у випад краху або завершення шляхом виклику abort (), файли не закриваються.
У кожного потоку, пов'язаного з файлом, мається керуюча структура, що містить інформацію про файлі. Вона має тип FILE. Блок управління файлом - це невеликий блок пам'яті, тимчасово виділений операційною системою для зберігання інформації про файл, який був відкритий для використання. Блок управління файлом звичайно містить інформацію про ідентифікаторі файлу, його розташуванні на диску і покажчику поточної позиції у файлі.
Для виконання всіх операцій введення-виведення слід використовувати тільки поняття потоків та застосовувати лише одну файлову систему. Введення або виведення від кожного пристрої автоматично перетвориться системою в легко управлемий потік. І це є досягненням мови Сі.
Такі основоположні зауваження щодо існування різних потоків інформації і пов'язаних з ними файлів.
Файлова система мови Сі складається з декількох взаємопов'язаних між собою функцій. Для їх роботи в Сі потрібно заголовний файл і такий же аналогічний йому заголовний файл потрібно для роботи в С + +.
Нижче наведена таблиця основних (часто використовуваних) функцій файлової системи мови Сі.
Ім'я
Що робить ця функція
Ім'я
Що робить ця функція
fopen ()
Відкриває файл
feof ()
Повертає значення true (істина), якщо досягнуто кінець файлу
fclose ()
Закриває файл
ferror ()
Повертає значення true (істина), якщо сталася помилка
putc ()
Записує символ в файл
remove ()
Пере файл
fputc ()
Те ж, що і putc ()
fflush ()
дозапис потоку в файл
getc ()
Читає символ з файлу
rewind ()
Встановлює покажчик поточної позиції в початок файлу
fgetc ()
Те ж, що і getc ()
ftell ()
Повертає поточне значення покажчика поточної позиції у файлі
fgets ()
Читає рядок з файлу
fprintf ()
Для файлу те ж, що printf () для консолі
fputs ()
Записує рядок у файл
fscanf ()
|