>> СЛУХАЛИ: Поки що, швидше за все, що більшість ваших програм
було небагато ефемерним.
Ви запускаєте програму, як Маріо або жадібний.
Це щось робить, то, можливо, запропонує користувач якусь інформацію,
роздрукувати деякий висновок на екран, але потім, коли ваша програма закінчиться,
там дійсно немає доказів є це коли-небудь працювати в першу чергу.
Я маю на увазі, звичайно, ви могли б залишили це відкрити у вікні терміналу,
але якщо ви очистите екран, є не дійсно немає доказів того, що він існував.
Ми не мати засоби зберігання постійної інформації, інформація
що існує після нашого Програма зупинений,
або у нас є не до цієї точки.
На щастя, хоча, з робить надати нам можливість
зробити це шляхом реалізації те, що називається
файл, структура, в основному являє собою файл, який ви б подвоїти
натисніть на комп'ютері, якщо ви використовується в графічному середовищі користувача.
Взагалі при роботі з с, ми насправді
буде працювати з покажчики на файл files-- stars--
для небагато, крім коли ми говоримо про пару
функцій, які працювати з покажчиками файлів.
Вам не потрібно, щоб дійсно вирили занадто глибоко в розуміння покажчиків
Самі.
Там трохи маленький біт де ми будемо говорити про них,
але, як правило подати покажчики та покажчики, а взаємопов'язані,
не зовсім те ж саме.
>> Тепер те, що я маю на увазі, коли Я говорю постійні дані?
Що постійні дані?
Чому ми піклуємося про це?
Скажімо, наприклад, що ви працюєте в програму
або ви переписати програма, яка це гра,
і ви хочете, щоб відстежувати всіх ходів користувача
так що, можливо, якщо щось піде не так, Ви можете переглянути файл після гри.
Ось що ми маємо на увазі, коли ми говорити про постійні даних.
>> У ході роботи вашого Програма, файл створюється.
І коли ваша програма припинив біг,
що файл все ще існує на вашій системі.
І ми можемо дивитися на нього і вивчити його.
І так, що програма буде встановлена ​​в створили кілька постійних даних,
існують дані після програми закінчить роботу.
>> Тепер усі ці функції, які працюють зі створенням файлів і маніпулювання
їх різними способами жити в стандартній io.h,
який являє собою файл заголовка, ви, ймовірно, був фунт
у тому числі на вершині досить багато всього з ваших програм
бо вона містить одне з більшість корисних функцій для нас,
Printf, що також дозволяє живе в стандартному io.h.
Таким чином, ви не повинні включати в себе фунт будь-які додаткові файли, ймовірно,
для того, щоб працювати з покажчиками файлів.
>> Тепер кожен функція покажчик файлу, або кожен файл вводу-виводу, введення-виведення /
Функція, приймає в якості одного його параметрів або входів
файл pointer-- винятком для одного, FOPEN, що
це те, що ви використовуєте, щоб отримати файл Покажчик в першу чергу.
Але після того як ви відкрили файл і ви отримаєте покажчики файлів,
то ви можете передати їх в якості Аргументи різних функцій
ми будемо говорити про Сьогодні, а також багато інших
так що ви можете працювати з файлами.
>> Таким чином, існує шість досить загальні основні,
що ми будемо говорити про сьогоднішній день.
FOPEN і його компаньйон Функція fclose, fgetc
і його функція супутник fputc, і Fread і його функція супутником,
FWRITE.
Отже, давайте прямо в нього.
>> fopen-- що він робить?
Ну, це відкриває файл, і він дає покажчик файлу до нього,
так що ви можете використовувати, що покажчик файлу в якості аргументу
в будь-який інший файл функції вводу / виводу.
Найважливіша річ щоб пам'ятати з FOPEN
є те, що після того як ви відкрили файл або зробив дзвінок, як один тут,
Ви повинні перевірити, щоб переконатися, що покажчик, який ви отримали назад
не дорівнює нулю.
Якщо ви не дивилися відео на покажчики, це не могло б мати сенс.
Але якщо ви спробуєте і разименованія порожній покажчик нагадаємо,
ваша програма, ймовірно, страждають сегментації [нерозбірливо].
Ми хочемо, щоб переконатися, що ми отримав законне покажчик назад.
Переважна більшість часу ми будемо отримали законне покажчик назад
і це не буде проблемою.
>> Так як ми робимо заклик до FOPEN?
Це виглядає досить багато, як це.
Файл зірка ptr-- PTR бути загальним Прізвище, ім'я, файл pointer-- FOPEN
і ми проходимо в двох речах, ім'я файлу і операція, ми хочемо зробити.
Таким чином, ми, можливо, виклик, який виглядає як this-- файл зірка PTR 1 дорівнює FOPEN
file1.txt.
І операція я вибрав це р.
>> Так що ви думаєте г тут?
Які види речей, які ми могли б зробити, щоб файли?
Так г є операція, що ми вибирати, коли ми хочемо, щоб прочитати файл.
Таким чином, ми б в основному, коли ми зробити виклик, як це
отримувати себе покажчик файлу таким чином, що ми могли б прочитати інформацію
від file1.txt.
>> Аналогічно, ми могли б відкрити файл 2.txt для написання і таким чином ми можемо пройти ptr2,
файловий покажчик Я створив тут, як аргумент будь-якої функції,
записує інформацію у файл.
І схоже на листи, є також можливість додавати, а.
Різниця між писати і додавання
в тому, що, коли ви пишете в файл, якщо ви робите виклик FOPEN для написання
і що файл вже існує, це збирається переписати весь файл.
Це відбувається, щоб почати на самому початку,
видалення всієї інформації що вже є.
>> У той час як, якщо ви відкриваєте його для додавання, він буде йти до кінця файлу
якщо є вже текст це чи інформація в ньому,
і потім почне писати звідти.
Таким чином, ви не втратите будь-який з Інформація, яку ви робили раніше.
Якщо ви хочете, щоб писати або додати роду залежить від ситуації.
Але ви, мабуть, знаєте, що в Право операція, коли прийде час.
Так от FOPEN.
>> Що про fclose?
Ну, досить просто, fclose просто приймає покажчик на файл.
І, як ви могли б очікувати, вона закриває файл.
І як тільки ми закрили файл, ми не можемо виконувати більше функцій файл вводу / виводу,
читання або запису, на цьому файлі.
Ми повинні знову відкрити подати ще час для того,
продовжувати працювати з його за допомогою функції введення / виводу.
Так fclose кошти ми зробили працює з цим файлом.
І все, що ми повинні пройти в це ім'я покажчика файлу.
Так на пару ковзає назад, ми fopened текстовий файл 1 точка для читання
і ми призначили, що подати покажчик ptr1.
Тепер ми вирішили ми закінчите читати з цього файлу.
Нам не потрібно, щоб зробити більше з ним.
Ми можемо тільки fclose ptr1.
І точно так само, міг ми fclose на інші.
Добре.
Так що це відкриття і закриття.
Такі два основних починаючи операцій.
>> Тепер ми хочемо насправді зробити деякі цікаві речі,
і перша функція, що ми будемо бачити, що буде робити те, що fgetc--
подати отримати символ.
Це те, що, як правило fgetc буде перевести на.
Його мета в житті, щоб читати наступний символ,
або, якщо це ваш дуже Перший виклик fgetc
для конкретного файлу, перший символ.
Але після цього, Ви отримуєте наступний,
на наступний характер цього файлу, і зберігає його у змінній символів.
Як ми зробили тут, символ ч дорівнює fgetc,
передати ім'я покажчика файлу.
Знову ж таки, це дуже Тут важливо пам'ятати,
що для того, щоб мати ця операція вдасться,
сам покажчик файлу Повинно бути був відкритий для читання.
Ми не можемо зчитувати символ з файлу покажчик, який ми відкрили для запису.
Так що це одна з Обмеження FOPEN, вірно?
Ми повинні обмежити самі тільки виконуючи
одна операція з одного покажчика файлу.
Якби ми хотіли, щоб читати і написати з того ж файлу,
ми повинні відкрити два окремо файлові покажчики на тому ж file--
один для читання, інший для запису.
>> Отже, ще раз, єдина причина, Я приношу що зараз це
тому що, якщо ми збираємося зробити дзвінок щоб fgetc, що покажчик файлу має бути,
був відкритий для читання.
А потім досить просто, все, що ми повинні зробити,
це передати від імені покажчика файлу.
Так символ ч дорівнює fgetc ptr1.
>> Це відбувається, щоб нас наступний character--
або ж, якщо це перший раз ми зробили цей заклик,
перший character-- все, що Файл, на який вказує ptr1.
Нагадаємо, що це було файл 1 точка текст.
Це буде отримати перший символ, що і ми зберігати його в змінній ч.
Досить просто.
Таким чином, ми тільки дивилися на трьох Функції і ми вже
можна зробити щось дуже акуратний.
>> Так що, якщо ми візьмемо цю здатність про отримання характер
і ми петля it-- тому ми продовжувати отримувати символи
з файлу знову і знову і тепер ми over--
може читати кожен Характер файлу.
І якщо ми друкуємо кожен символ відразу після прочитати його,
ми тепер читати з файлу і надруковані його вміст на екран.
Ми ефективно об'єднуються що файл на екрані.
І це те, що Команда кішка Linux робить.
>> Якщо ви введете кішку в імені файлу, його виведе всі вміст
файлу у вікні терміналу.
І так ця маленька петля тут, тільки три рядки коду,
але це ефективно дублює команда кішка Linux.
Так цей синтаксис може виглядати трохи дивно,
але ось те, що тут відбувається.
У той час як ч дорівнює fgetc, PTR НЕ одно EOF-- це цілий рот,
але давайте розбити його просто так що ясно, про синтаксис.
Я об'єднав його заради простору,
хоча це трохи синтаксично складно.
>> Так що це частина в зеленому право Тепер, що він робить?
Ну, це якраз наш fgetc виклик, чи не так?
Ми бачили, що й раніше.
Це один отримання персонаж з файлу.
Потім ми порівнюємо, що характер проти EOF.
EOF є особливе значення, що це визначені в стандарті, який io.h
кінець файлу характер.
Тому в основному те, що станеться ця петля буде читати характер,
порівняти його з EOF, то кінець файлу характер.
Якщо вони не збігаються, так що ми не досягли кінця файлу,
Ми надрукуємо що персонаж.
Тоді ми повернемося до початку циклу знову.
Ми отримаємо характер, перевірити проти EOF, роздрукувати його, і так далі
і так далі, і так далі, цикл через таким чином
поки ми не досягли кінця файлу.
А потім до цього моменту, ми надрукували
з усього вмісту файлу.
Отже, ще раз, ми бачили тільки FOPEN, fclose і fgetc
і ми вже можемо дублювати термінал командної Linux.
>> Як я вже сказав на початку, у нас було fgetc і fputc,
і fputc був супутником функція fgetc.
І так, як ви можете собі уявити, це написання еквівалентні.
Це дозволяє нам написати один символ у файл.
>> Знову ж таки, нюанс буття, тільки як це було з fgetc файл
що ми пишемо в Повинно було відкритий для запису або для додавання.
Якщо ми спробуємо використовувати і fputc на файл що ми відкрили для читання,
ми страждатиме трохи помилку.
Але виклик досить просто.
fputc заголовна А ptr2, все що збирається зробити, це це
збираюся написати лист в A у файлі 2 точки
Текст, який був ім'я з подати, що ми відкрили і призначений
покажчик на ptr2.
Отже, ми збираємося, щоб написати заголовна А подати 2 точка тексту.
І ми будемо писати вигук вказують на файл 3 точка
Текст, який був, на який вказує ptr3.
Отже, ще раз, досить проста тут.
>> Але тепер ми можемо зробити ще одну річ.
У нас є цей приклад ми просто переходячи
про те, в змозі відтворити кішку Команда Linux, той, який виводить
на екран.
Ну, тепер у нас є можливість читати символи з файлів
і писати символи у файлах, чому б нам просто не замінити, що
щоб подзвонити в PRINTF із закликом fputc.
>> І тепер ми дублюються ср, дуже основна команда Linux
що ми говорили про так довго назад в Linux команди відео.
У нас ефективно дублюються, що прямо тут.
Ми читає символ, а потім ми писати, що характер в інший файл.
Читання з одного файлу, написання на інший, знову і знову
і знову, поки ми не потрапили EOF.
Ми добралися до кінця подати ми намагаємося скопіювати с.
І що ми будемо мати написано з персонажів потрібно в файл
що ми пишемо в.
Так що це ср, команда Linux копія.
>> На самому початку це відео, я мав застереження
що ми поговоримо Трохи про покажчиків.
Ось саме, де ми поговоримо про покажчики
Крім того, щоб подати покажчики.
Так ця функція виглядає трохи страшно.
Він отримав кілька параметрів.
Там дуже багато тут відбувається.
Там багато різних Кольори і тексти.
Але насправді, це просто загальна версія fgetc
що дозволяє отримати будь обсяг інформації.
Це може бути трохи неефективно, якщо ми отримання символів по одному,
переборі файлу один символ за один раз.
Не було б краще, щоб отримати 100 в той час, або 500 за один раз?
>> Ну, Fread і його функція супутник FWRITE, що ми будемо говорити про
в секунду, дозволяють нам зробити це.
Ми можемо прочитати довільну кількість інформації з файлу
і ми зберігаємо його десь тимчасово.
Замість того, щоб мати можливість просто умістити його в однієї змінної,
ми, можливо, буде потрібно, щоб зберегти його в масиві.
І так, ми передаємо в чотирьох аргументи fread-- покажчик
в місці, де ми знаходимося збираєтеся зберігати інформацію,
як велика кожна одиниця інформації буде, скільки одиниць інформації
ми хочемо, щоб придбати, а від який файл ми хочемо, щоб отримати їх.
Напевно найкраще ілюструється на прикладі тут.
Так що давайте говорити, що ми заявляємо масив з 10 цілих чисел.
Ми щойно оголосили на стек довільно Int обр 10.
Так що це досить просто.
Тепер те, що ми робимо, хоча це frecall буде ми читаємо розмір Int
раз 10 байт інформації.
Розмір INT істоти four-- це розмір цілого числа в C.
>> Отже, що ми робимо, ми читаємо 40 байт інформації варто
з файлу, на який вказує PTR.
І ми ті, зберігання 40 байт десь
де ми виділили 40 байт пам'яті коштує.
На щастя, ми вже зробили, що, заявивши, обр, що масив прямо там.
Це дозволяє утримувати 10 чотири байти одиниць.
Таким чином, в цілому, він може тримати 40 байт варто інформації.
І ми зараз читаєте 40 байт інформації з файлу,
і ми зберігати його в обр.
>> Нагадаємо, з відео на покажчики, які ім'я масиву, наприклад, обр,
насправді просто покажчик його першого елемента.
Тому, коли ми проходимо в обр там, ми є, по суті, передаючи покажчик.
>> Аналогічно ми можемо зробити this-- ми не обов'язково
потрібно, щоб врятувати наш буфер в стеку.
Ми могли б також динамічно розподіляти буферної як це, використовуючи Танос.
Пам'ятаєте, коли ми динамічно виділяти пам'ять,
ми економимо його на купа, що не стек.
Але він як і раніше буфер.
>> Це все ще, в даному випадку, є проведення 640 байт інформації
бо двічі займає вісім байт.
І ми просимо 80 з них.
Ми хочемо, щоб простір провести 80 двомісних.
Так 80 раз 8640 байт інформації.
І, що виклик є FREAD збір 640 байтів інформації
від файлу, вказаного PTR і зберігати його в даний час в arr2.
>> Тепер ми також можемо розглядати Fread так само, як заклик до fgetc.
У цьому випадку, ми просто намагаємося отримати один символ з файлу.
І ми не потрібні масив для зберігання символу.
Ми можемо просто зберігати його в змінна характер.
>> Заковика, однак, в тому, що коли ми просто змінну,
ми повинні передати в адресу цієї змінної
бо нагадати, що Перший аргумент FREAD
є покажчиком на місце і пам'ять де ми хочемо, щоб зберегти інформацію.
Знову ж таки, ім'я масиву є покажчиком.
Таким чином, ми не повинні робити амперсанд масив.
Але з, характер з Тут, не є масивом.
Це просто змінна.
І тому ми повинні пройти амперсанд з вказати
, Що це адреса, де ми хочемо зберігати цю один байт інформації,
це один символ, що ми стягнення з PTR.
Fwrite-- я піду через це трохи більше,
quickly-- в значній мірі точний еквівалент FREAD
крім, це для написання замість читання, просто
як і other-- ми мали відкритий і близько, отримати символ,
написати характер.
Тепер це отримати довільне Кількість інформації,
Право довільну кількість інформації.
Так само, як раніше, ми можемо є масив з 10 цілих чисел
де у нас вже є Інформація, що зберігається, можливо.
>> Це був, мабуть, деякі рядки коду які повинні йти між цими двома
де я заповнити обр з щось значуще.
Я заповнити його з 10 різних цілих чисел.
І навпаки, те, що я робите письмового обр
і збору інформації від обр.
І я везу цю інформацію і покласти його в файл.
>> Таким чином, замість причому з файл в буфер,
ми тепер збираємося від буфер у файл.
Так що це просто зворотна.
Отже, ще раз, як і колись, ми можемо Також є купа шматок пам'яті
що ми динамічно виділено і читати від
і пишуть, що у файл.
>> І ми також маємо одну змінну здатний утримувати один байт
інформації, наприклад, характер.
Але, знову ж, ми повинні передати в адресу цієї змінної
коли ми хочемо, щоб читати з нього.
Таким чином, ми можемо записати інформацію ми знаходимо за цією адресою
з покажчиком файлу, PTR.
>> Там багато іншої файлі функції вводу / виводу
що робити різні речі, крім ті, кого ми сьогодні говорили.
Пару з тих Ви могли б знайти корисним
є fgets і fputs, які є еквівалентом
з fgetc і fputc але для читання єдиний рядок з файлу.
Замість одного символу, він буде читати весь рядок.
fprintf, що в принципі дозволяє використовувати Printf записати у файл.
Так само, як ви можете зробити підстановка змінної з використанням
Местозаполнітелі відсотків я і відсотків д, і так далі, з Printf
Ви можете так само взяти Printf рядок і друк щось
так у файлі.
>> fseek-- якщо у вас є DVD-плеєр аналогія я зазвичай використовую here--
ніби як за допомогою вашого перемотування назад і вперед
кнопки для переміщення по кіно.
Крім того, ви можете переміщатися по файлу.
Одна з речей, всередині Структура файлу, що
що з створює для вас є показником де ви знаходитесь у файлі.
Ви на самому починаючи, по крайней нульовим байтом?
Ви в байт 100, Байт 1000, і так далі?
Ви можете використовувати FSEEK довільно рухатися цей показник вперед або назад.
>> І ftell, знову схожий на DVD-плеєр,
як маленький годинник, що говорить Ви, скільки хвилин і секунд ви
є зокрема фільму.
Точно так само, ftell розповість вам, як кількість байт ви в файл.
feof інша версія виявлення ви маєте
досягли кінця файлу.
І FERROR є функцією що ви можете використовувати
щоб виявити, чи є щось пішло не так працювати з файлом.
Знову ж, це просто подряпати поверхню.
Там ще багато більш файловий ввід / вивід функції в стандартній io.h.
Але це, ймовірно, отримаєте ви почав працювати з покажчиками файлів.
Я Дуг Ллойд.
Це CS50.