[Powered by Google Translate] [Файл I / O] [Джейсон Хіршхорн, Гарвардський університет] [Це CS50, CS50.TV] Коли ми думаємо про файл, що приходить на розум це документ Microsoft Word, зображень JPEG, MP3 або пісню, і ми взаємодіємо з кожним з цих типів файлів різними способами. Наприклад, у документі Word ми додамо текст в той час як з зображенням JPEG ми могли б обрізати краю або відретушувати кольору. Тим не менше, під капотом всі файли в нашому комп'ютері є не більше ніж довга послідовність нулів і одиниць. Це залежить від конкретного додатка, яке взаємодіє з файлом щоб вирішити, як обробити цю довгу послідовність і представити його користувачеві. З одного боку, документ може дивитися тільки на один байт, або 8 нулів і одиниць, а також відображати ASCII символів на екрані. З іншого боку, растрові зображення можуть дивитися на 3 байти, або 24 нулів і одиниць, і інтерпретувати їх як 3 шістнадцяткових чисел , Які представляють значення для червоного, зеленого і синього В один піксель зображення. Все, що вони можуть виглядати на екрані, по суті своїй, Файли є не більш ніж послідовність з нулів і одиниць. Так що давайте пірнати і дивитися на те, як ми насправді маніпулювати цими нулями і одиницями коли справа доходить до запису та читання з файлу. Я почну розбити його на прості 3-частина процесу. Далі, я буду пірнати на дві приклади коду, що демонструють ці три частини. Нарешті, я розгляну процес і деякі з його найбільш важливі деталі. Як і з будь-який файл, який знаходиться на робочому столі, Перше, що потрібно зробити, це відкрити його. У C ми робимо це, оголосивши покажчик на зумовлені структури , Що являє собою файл на диску. У цьому виклику функції, ми також вирішити, чи хочемо ми писати або читати з файлу. Далі, ми робимо фактично читання і запису. Є цілий ряд спеціалізованих функцій, ми можемо використовувати в цій частині, і майже всі вони починаються з літери F, яка виступає за файл. Останнє, схоже на маленький червоний хрестик у правому верхньому куті відкритих файлів на вашому комп'ютері, ми закриваємо файл з остаточним виклику функції. Тепер у нас є загальне уявлення про те, що ми збираємося робити, Давайте поринемо в код. У цьому каталозі ми маємо два C файли і їх відповідні виконувані файли. Машинки програма займає одне аргумент командного рядка, Назва документа ми хочемо створити. У цьому випадку, ми будемо називати його doc.txt. Давайте запустимо програму і введіть пару рядків. Привіт. Мене звуть Джейсон. Нарешті, ми типу "кинути". Якщо ми зараз перерахуємо всі файли в цьому каталогі, ми бачимо, що новий документ існує називають doc.txt. Це файл цієї програми тільки що створили. І, звичайно, це теж не більше, ніж довга послідовність нулів і одиниць. Якщо ми відкриємо цей новий файл, ми бачимо 3 рядки коду ми увійшли в нашу програму - Привіт. Травень ім'я Джейсон. Але те, що відбувається насправді, коли typewriter.c працює? У першому рядку інтерес для нас є лінією 24. У відповідності з цим ми заявляємо про нашу покажчика файлу. Функція, яка повертає цей покажчик, Еореп, приймає два аргументи. Перше ім'я файлу включаючи розширення файлу, якщо необхідно. Нагадаємо, що розширення файлу не впливає на файл на найнижчому рівні. Ми завжди маємо справу з довгої послідовності нулів та одиниць. Але цей вплив, як файли інтерпретуються і які програми використовуються, щоб відкрити їх. Другий аргумент Еореп є однієї букви що стоїть за те, що ми плануємо зробити після відкриття файлу. Є три варіанти для цього аргументу - W, R, і А. Ми вибрали W в цьому випадку, тому що ми хочемо записати у файл. R, як ви можете здогадатися, призначений для читання в файл. А для додавання до файлу. У той час як вага і може бути використаний для запису файлів, W почнемо писати від початку файлу і потенційно перезаписати всі дані, які раніше були збережені. За замовчуванням, ми відкриваємо файл, якщо він ще не існує, створюється в нашому нинішньому робочому каталозі. Однак, якщо ми хочемо отримати доступ або створити файл в іншому місці, У перший аргумент Еореп, ми можемо вказати шлях до файлу, на додаток до імені файлу. У той час як перша частина цього процесу є тільки одного рядка коду довжиною, це завжди гарна практика, щоб включити інший набір ліній що переконаєтеся, що файл був успішно відкритий або створений. Якщо Еореп повертає нуль, ми не хотіли б просуватися вперед з нашою програмою, і це може відбутися, якщо операційна система не вистачає пам'яті або, якщо ми спробуємо відкрити файл у каталог, для якого у нас не було відповідних дозволів. Друга частина процесу проходить в той час як цикл друкарської машинки. Ми використовуємо CS50 бібліотечні функції для отримання даних від користувача, і припускаючи, що вони не хочуть, щоб вийти з програми, ми використовуємо функцію fputs взяти рядок і записати її у файл. fputs є лише однією з багатьох функцій ми могли б використовувати для запису у файл. Інші включають FWRITE, fputc, і навіть Fprintf. Незалежно від конкретної функції, ми в кінцевому підсумку, використовуючи, однак, всі вони повинні знати, через свої аргументи, принаймні, дві речі - що має бути написано і де воно має бути записано. У нашому випадку, вхід рядок, яка повинна бути записана і FP є покажчиком, який спрямовує нас туди, де ми пишемо. У цій програмі, частиною другою процес досить простий. Ми просто приймає рядок від користувача і додавши його безпосередньо в наш файл з невеликим до перевірки не вхід або перевірок безпеки. Часто, однак, друга частина буде займати велику частину вашого коду. І, нарешті, третя частина знаходиться на лінії 58, де ми закриваємо файл. Тут ми називаємо Fclose і передати його нашим оригінальний покажчик файлу. У наступні лінії, ми повертаємося нулю, що свідчить про кінець нашої програми. І, так, третя частина так само просто, як це. Давайте перейдемо до читання з файлів. Повернутися в нашому каталозі у нас є файл з ім'ям printer.c. Давайте запустимо його з файлу, який ми тільки що створили - doc.txt. Ця програма, як випливає з назви, буде просто роздрукувати вміст файлу передається йому. І у нас це є. Рядків коду ми ввели раніше і зберігається в doc.txt. Привіт. Мене звуть Джейсон. Якщо ми заглибимося в printer.c, ми бачимо, що багато коду схоже на те, що ми просто йшли через в typewriter.c. Дійсно лінії 22, де ми відкрили файл, і лінія 39, де ми закрили файл, обидва майже ідентичні typewriter.c, за винятком Еореп другий аргумент. На цей раз ми читаємо з файлу, таким чином, ми вибрали г замість ш. Таким чином, давайте зосередимося на другу частину цього процесу. У рядку 35, а друга умова в нашому 4 петлі, ми робимо виклик ЕдеЬз, компаньйоном функції fputs, ніж раніше. На цей раз у нас є три аргументи. Першим з них є покажчиком на масив символів, де рядок буде збережена. По-друге, це максимальне число символів для читання. І, по-третє, покажчик на файл, з яким ми працюємо. Ви помітите, що цикл закінчується, коли ЕдеЬз повертає нульове значення. Є дві причини, що це може трапитися. По-перше, сталася помилка. По-друге, і це більш вірогідно, кінець файлу був досягнутий, і не більше символів читали. У випадку, якщо Ви ставите питанням, дві функції дійсно існують, що дозволяє нам говорити Причина яка є причиною для даного покажчика NULL. І не дивно, так як вони мають відношення до роботи з файлами, як FERROR функції та розпочала feof функції з буквою F. Нарешті, перш ніж ми укладаємо, одне невелике зауваження про кінець файлу функції, , Який, як тільки що говорилося, записується у вигляді feof. Часто ви будете використовувати час і для петлі поступово читав ваш шлях через файли. Таким чином, ви будете потребувати шлях до припинення цих петель після того, як ви дійдете до кінця цих файлів. Виклик feof на покажчик файлу і перевірки, щоб побачити, якщо це правда б зробити саме це. Таким чином, у той час як цикл з умовою (! Feof (FP)) може здатися цілком відповідним рішенням. Тим не менш, у нас є одна лінія залишається в наших текстових файлів. Ми будемо вводити наші в той час як петлі і все буде працювати так, як планувалося. На наступний раунд до кінця, наша програма буде перевіряти, якщо feof ПС, правда, але - і це ключовий момент для розуміння тут - це не буде істинним тільки поки. Це тому, що мета feof не перевірити якщо при наступному виклику функція читання потрапить в кінець файлу, а перевірити, чи є чи ні кінець файлу вже досягнута. У даному прикладі, читання останньому рядку нашого файлу йде ідеально рівно, але програма ще не знає, що ми потрапили в кінці нашого файлу. Це не поки він не один додатковий прочитав, що це лічильники кінці файлу. Таким чином, правильне умова може бути наступним: ЕдеЬз і трьох аргументів - вихід, розмір вихідної і FP - і все, що не дорівнює нулю. Це підхід, який ми взяли в printer.c, і в цьому випадку, після циклу виходить, Ви могли б назвати feof або FERROR повідомити користувачеві, як до конкретної аргументації для виходу з цього циклу. Запис і читання з файлу, на самому базовому, Простий 3-частина процесу. По-перше, ми відкриваємо файл. По-друге, ми ставимо деякі речі в нашій файл або прийняти деякі речі з нього. По-третє, ми закриваємо файл. Перша і остання частини легко. У середній частині, де лежить складний матеріал. І хоча під капотом ми завжди маємо справу з довгої послідовності нулів та одиниць, воно допомагає при кодуванні, щоб додати шар абстракції Виходить, що послідовність у те, що більше нагадує те, що ми звикли бачити. Наприклад, якщо ми працюємо з 24-бітної растровий файл, ми, ймовірно, буде читати або писати три байти за один раз. У такому випадку, це мало б сенс, щоб визначити і відповідним чином назвати структуру, яка складає 3 байти великий. Хоча робота з файлами може здатися складним, використання їх дозволяє нам зробити щось дійсно чудове. Ми можемо змінити стан світу за межами нашій програмі, ми можемо створити те, що живе за життя нашої програми, або ми можемо навіть змінити те, що було створено до нашої програмі почали працювати. Взаємодія з файлами це дійсно потужна частина програмування мовою C. і я радий бачити, що ви збираєтеся створити з ним в коді, щоб прибути. Мене звуть Джейсон Хіршхорн. Це CS50. [CS50.TV] [Сміх] Добре. Один прийняти. Тут ми йдемо. Коли ми думаємо про файл - >> Ой, зачекайте. Вибачте. [Сміх] Добре. Ей там. Коли ми думаємо про файл - Коли ви думаєте про файл - Добре. Скажіть, коли ви будете готові. О, відмінно. Хоча читання з телесуфлера може здатися - немає. Моє погане.