Джейсон Хіршхорна: Ласкаво просимо, все, щоб Тиждень 6. Я щасливий бачити вас усіх живий і здоровий після Вікторина 0, тому що я знаю, що було трохи грубо. Але, на щастя, ви все зробив неймовірно добре. І так, що це чудово. Якщо ви знаходитесь в моїй секції, я дав найбільш з вас підтримати ваші вікторини вже. Пару вас, у мене зустріч після занять. І якщо ви студент розширення і Ви не отримали свій вікторину назад тим не менш, ваша TF, ймовірно, працювати на ньому і сортування його, і отримати його назад Вам найближчим часом. Так мої розширення студенти, які дивитися прямо зараз - ми сподіваємося жити - Я отримаю ваші вікторини незабаром також. Наша повістка дня на сьогодні виглядає наступним чином. По-перше, ми збираємося перейти на деякі ресурси, які CS50 надає вам. Ми збираємося перейти Вікторина 0 наступний, і Я відповім на будь-які питання нікого має про конкретних проблем. І потім, ми будемо йти по файловий ввід / вивід і проблема встановити 5. Ці останні дві теми будуть приймати до основної маси розділі сьогодні. Я поклав цей список щотижня, як нагадування всім вам, але ядра розділ, у нас є тільки 90 хвилин - ми не в змозі охопити все, що я дуже хотілося б, щоб покрити для вас, хлопці. Але у нас є тонна ресурсів для малювати на як ви дізнаєтеся матеріал і робота через ваша проблема встановлює. Нагадаємо, що у мене є онлайн текст коробка, створений для вас, щоб заповнити, якщо ви є зворотний зв'язок для мене, як позитивні, так і конструктивними, про розділ. Це URL розташований прямо сюди. Так що будь ласка, знайдіть час, якщо у вас є які-небудь зворотний зв'язок, будь то під час секції, або після, або після ви дивитеся відео онлайн, щоб дати мені свою думку. Я дійсно ціную всіх і все. Так що я з малими розмови з багато моїх студенти протягом тижня - як я вручаю назад вікторини, говорячи про Звичайно, бачачи, як ви робите. І одна тема прийшла знову і більш говорити про - в Зокрема - Проблема встановлює. І я инкапсулируются цю тему на дошці прямо зараз. По суті, є різниця між включенням в щось, що є все зроблено правильно і те, що зроблено добре. Більшість людей робили фантастичний з точки зору правильності - 5 або 4 по всіх psets. Більшість людей отримують ті весь час. Проте, тільки тому, що ви зробили щось прямо не означає, що ви маєте зробив щось, як елегантно, або ефективно, або, як чисто, як вам міг би зробити це. І ось що дизайн - і, меншою мірою, стилю - осі для. Так Я штовхаю вас всіх, та інших ТФ штовхають вас, хлопці, щоб не тільки свою чергу в речах, які є правильними, але перетворити в речах, які кодуються добре. Якщо цього не зробити непотрібним для петель, не перераховуючи змінних, якщо Ви не повинні. Наприклад, озираючись на проблеми встановіть 4, при розміщенні цеглу на екран, кожен рядок - кожна цеглина в даний рядок має той же координати у - однакову висоту координат. Так що у-координату не потрібно розраховується в інтер'єрі вкладеними ДЛЯ цикл, який ви, ймовірно, використовується поставити ці цеглини на екрані. Це потрібно тільки розраховуватися кожен раз, коли ви перейшли ряд, або з'їхав рядок. Так би мовити, якщо є 10 цеглин в ряд, кожна цеглина може мати те ж саме у-координату, і що координати у може просто бути розрахована раз і назавжди з них. Це не повинні бути розраховані 10 раз, і не, що розрахунок необхідність відбудеться в фактичний виклик функції - новий виклик gracked функція. Так що, якщо це було трохи заплутаним для Ви, в більш загальному, все, що не потрібно відбуватися кожного разу, коли ви йдете через петлю ДЛЯ бути не повинно покласти всередині циклу FOR, і не повинні відбувається кожного разу, коли ви йдете через петлю ДЛЯ. Інший хороший приклад дизайну ми бачили в 3 тижні протягом 15, ви могли б тримати трек нулю. Отже, коли ви ініціалізації дошка, вам зберегти - в глобальної змінної, можливо - х і у-координату нулю. А потім, коли ви - в хід функції, всякий раз, коли ви робите вдалий хід, оновленні Розташування нулю. Це було б врятувати вас від необхідності робити вкладених циклів переглядати борт кожен раз в хід функції і знайти нулю, або знайти плитку, , А потім перевірити, що це поруч з ним. Замість цього, у вас є розташування нулю, ви можете просто подивитися зверху, знизу, і зліва і праворуч від неї, щоб знайти плитка шукали. Так що в плані програм ми писати, вони ніколи не досить великий, що деякі з цих проектних рішень дійсно збираєтеся перешкоджати вашому Програма, або зробити його працювати повільніше, або, можливо, навіть не вистачити пам'яті. Але ми все ще штовхає вас, хлопці писати, як елегантний і ефективний код, як це можливо. Так що якщо ви в кінцевому підсумку писати речі які мають значно більше Сфера, вони будуть написані з хорошим розробити на додаток до того правильно. Так ряд у вас є приніс це. Це те, що ми шукаємо - те, що ми збираємося продовжувати підштовхнути вас хлопці на. Якщо ви коли-небудь є які-небудь питання про дизайн вашої програми, не соромтеся дотягнутися до мене, і я щасливий ходити через вашу програму з вами, і вказати на деякі конструкції Рішення, які ви зробили, і дати вам деякі пропозиції про те, щоб зробити ще кращі дизайнерські рішення. Так що ми збираємося рухатися далі до розмови про вікторині 0. Перш, ніж ми це зробити, хто-небудь є питання з приводу того, що Я покриті досі? [Шерех] Джейсон Хіршхорна: Сім секунд. ОК. Давайте поговоримо про вікторину 0 небагато. Більшість з вас є свій Вікторина 0 повернувся. Якщо ви цього не зробите, ми сподіваємося, Ви пам'ятаєте його небагато. Але якщо ви взяли Вікторина 0, то ви також мають доступ до PDF-лайн в Приготовлені розчини. Хто-небудь є будь-які питання перед стрибаємо в матеріалі тижня про Особливою проблемою на Quiz 0 - Тому відповідь, що це таке? Хто-небудь плутати ні про що? Навіть якщо ви отримали право проблеми, але просто хотів мені пояснити це трохи Більше того, я радий зробити це зараз. Так що я запитав вас, хлопці, щоб підготувати свої деякі думки про вікторині 0. Так, хто хотів би отримати нас почав з питання або прокоментувати про вікторині 0? [ПАПЕРИ шелест] Джейсон Хіршхорна: Не всі зробив відмінно. Так що я знаю [сміється] там повинні бути деякі питання про вікторині 0. ОК. Так. Ompica. OMPICA: номер 10. Джейсон Хіршхорна: номер 10. Який з них був номер 10? OMPICA: - Джейсон Хіршхорна: Я haven't - OMPICA: включають - Джейсон Хіршхорна: номер 10 було вісім в I - писати від восьми до I? OMPICA: Так. Джейсон Хіршхорна: ОК. Так ще одне питання ви могли б запитав, я даром передбачення? Відповідь: так. У розділі перед вікторини, я запитав ви, хлопці, код Як стерлінгів і восьми до я. Обидва вони, виявилося, з'являються на вікторині. Так що, сподіваюся, ви заплатили увагу до цього. І якщо у вас, то вам доведеться ймовірно, зробили добре на цих двох. Але від восьми до мене, ми насправді не код це в класі, але це було, знову ж таки, запитав на вікторині. Так пару речей, щоб прийняти Відзначимо при кодуванні від восьми до I. Перше, що, за питання, був що вам потрібно, щоб перевірити, якщо рядок дорівнював нулю. Пара людей спробували перевірити пізніше в програмі, якщо з кронштейн я був - так специфіка в тому, що рядок - дорівнювала нуль. Але пам'ятайте, що нульовий є по суті - це добре, щоб думати про нуль як покажчик нульовий - покажчик до нуля - десь у пам'яті, де Ви ніколи не можете отримати доступ к. Так що, якщо щось дорівнює нуль, то знаю, що це не був инициализирован, або там нічого немає. Так с є символ зірки, и Кронштейн я це символ. Так що має сенс порівнювати з до нуль, але не з кронштейн я обнулити. Але знову ж - так, щоб було перше, що що ви повинні були зробити - перевірити, щоб переконатися, що ви насправді отримали реальну рядок. Далі, ви хотіли, щоб пройти кожен символ в рядку. І так, що б як їй кронштейна я, наприклад, якщо я це ітератор. І вважати, що характер, і отримати його дійсної вартості. Ви його зберігається у вигляді гольца, але значення ASCII для нуля - нулю як символ - насправді не ціле число нуль. Це якийсь інший номер, який ви можете подивитися в таблиці ASCII. Так один із способів для корекції, що - ймовірно, кращий спосіб для корекції що - це відняти з нього значення символів - нулю в якості символу. Так мінус одинарні лапки, нуль, ще один сингл цитата. Це займе ще більше число у вас є як гольца, і отримати його рівним число в якості фактичного числа. І це дуже схоже на підхід багато людей взяли в Проблема встановити 2, з Цезарем і Viginere - ті шифри, коли ви були обертаючи їх. Так після того, як його як число від від нуля до дев'яти, потім - залежно від куди це йде в кінцевому числа - вам потрібно помножити його на ступінь 10. Деякі люди переїхали з спини, щоб спереду, і помножене особистості число потужністю 10. Деякі люди переїхали з спереду назад - і так взяв найвищий замовити номери спочатку - і зберегти б тих, хто в глобальна змінна лічильника. А потім кожен раз через FOR петля, помножте це гігантський глобальний змінна-лічильник на 10, щоб зробити простір для наступного символ. Так, щоб було трохи заплутаним без мені писати його на дошці. Але рішення зразок доступна для вас. Але це були великі речі ми шукали. Також перевірте, щоб переконатися, що кожен індивідуальний характер дійсно був характер між нулем і дев'ять, і не якийсь інший символ, як А, наприклад. Це були речі, які ми шукали так як в цьому питанні. Я відповів на ваше запитання? OMPICA: Так. Джейсон Хіршхорна: ОК. Чи є інші питання про вікторині 0? А як щодо компіляції? Всі компіляції чи не так? Ні. Були - [Сміється] Будь-які питання про збірник процес? Нічого собі. [ПАПЕРИ шелест] Джейсон Хіршхорна: Так. Майкл. Майкл: Це число 7 - випадкова? Джейсон Хіршхорна: номер 7. Номер 7 був отримати випадкове ціле. Відмінно. Таким чином, ви дали ціле а й ціле б, і ви хочете випадкова ціле між а і Ь. Ми можемо насправді писати цей на дошка, тому що цей був одного рядка коду - один із способів зробити це. Таким чином, ми дали drand як функція, яку ми могли б використовувати. І що drand - припускаючи, що це був посіяний - що ж drand повернутися? Майкл: поплавок між 0.0 і 1.0. Джейсон Хіршхорна: число - так. Число між 0 і 1. І так ми б і. А потім у нас є випадкове число між 0 і 1, дане нам drand. Деякі люди намагалися поставити б або б мінус , Або щось всередині тих, дужки. Це означатиме, що вони Аргументи цієї функції. drand не приймає ніяких аргументів - як GetString робить не приймає аргументів. Так що це просто відкрити дужка, недалеко Хлопець - і що, само по собі, є виклик функції. І це дає вам ряд між 0 і 1. Звичайно, у нас є цілий ряд що цифри можуть бути дюйма Скажімо, якщо б 10 і становить 5, ми дійсно хочу ряд з низкою 5. Так що наступного, що нам потрібно зробити, це помножити це на діапазоні б мінус. Так якщо припустити, що це помножене. І це дасть нам ряд в заданому діапазоні. І, що певний діапазон, який є Різниця між б мінус. І, нарешті, що буду тільки дати його з - кажуть діапазон між б мінус буде 5, що дасть нам число від 0 до 5. Але якщо насправді 5, нам потрібно підвищити цей діапазон до того, де це фактично повинен бути, шляхом додавання. Так що отримує логічне право. І потім, ви б інше питання? Майкл: Ні. Я просто відчуваю, дуже дурна просто зараз. [Сміється] Джейсон Хіршхорна: Ні. Не відчувати себе дійсно нерозумно. Число людей, з усіх сил з цим питанням. А потім, інше питання в тому, drand, Ви сказали, дає вам поплавок - повертає число з плаваючою крапкою. Але ця функція фактично попросив Для цілого повинні бути повернені. Вам не потрібно, щоб кинути це явно в ціле, тому що вони операції будуть ставитися до нього, як і всі а плавати - у вигляді числа з плаваючою крапкою. Як це буде - навіть якщо це є цілим числом, то це помножити правильно. Всі множення буде працювати. Вам не потрібно, щоб кинути його тут. Насправді, ви не повинні привести його. Це було б - Якщо ви перетворити число от між 0 і 1 - випадкове число, з плаваючою точкою - то це буде тільки 0 або 1 або, так Ви втратите все, що точності. Але наприкінці, коли ви повернетеся, він автоматично отримує відправлені назад у вигляді цілого числа. Так що вам не потрібно робити що кастинг себе. Так що це була відповідь на що питання, номер 7. Будь-які інші питання про вікторині 0? Так, Енні. Енні: Коли ми використовуємо рекурсивний - коли ми використовуємо ітераційні цикли? Джейсон Хіршхорна: Коли ви використовуєте рекурсивна - так більш загально, плюси і мінуси рекурсії проти ітеративний підхід. Хто-небудь може запропонувати профі або кон? Будь ласка? Не може ніхто. Хто може запропонувати профі або кон? [ПАПЕРИ шелест] СТУДЕНТ 1: Рекурсивні менше кодування - менше набирати? Джейсон Хіршхорна: Так взагалі, рекурсія особливо, функція - або алгоритм, як злиття роду - яка піддається на рекурсивний підхід - може бути простішим кодувати рекурсивно. І так само, більше сенсу зробити це рекурсивно. Так що було б про рекурсії. Інші? Так? СТУДЕНТ 2: Con рекурсії - Він використовує більше пам'яті. Джейсон Хіршхорна: Так точно. Рекурсивна функція буде продовжувати додавати стек кадрів в стек. Так що, якщо ви працюєте на багато числа, і повинні називати це функціонувати багато, то ви, безумовно, займають більше пам'яті, в той час як ітеративний підхід тільки покласти один стек кадру в стеку, тому що все це відбувається в рамках однієї функції. Будь-які інші плюси і мінуси? Так. СТУДЕНТ 3: Плюси для рекурсії. Ви не повинні визначити, в заздалегідь, скільки разів Код доводилося повторювати. Ви можете мати заздалегідь певну кількість раз, що у вас є для перебору, то рекурсія краще, тому що він приймає цей результат. Джейсон Хіршхорна: Я думаю, що це правда. Але я думаю, в обох випадках Ви б ніколи - ви, ймовірно, отримати деякі введення від користувача. Або ця функція буде мати деякий вхід що б визначити, скільки разів він повинен працювати. Так взагалі, ви б не жорсткий код - навіть у ітеративного підходу - як багато разів, що цикл повинен бути запущений. Чи було у вас інший, ви були думати про, Енні? ОК. Отже, це, мабуть, два - найбільший за і найбільший кон, щоб рекурсивний проти ітеративний підхід. ОК. Все інше на Quiz 0? Давайте рухатися далі. Файл введення / виведення Існує чудовий коротка На цьому тижні на файл вводу / виводу, що, ми сподіваємося, ви дивилися кратне раз, і захоплювався. Багато роботи увійшли в це, і у мене є почув, що це шалено корисно. Я також включив посилання на цьому слайді, у разі, якщо ви ще не було шанс, щоб подивитися його в 10 разів. Так, ми збираємося коротко перейти Основні кроки при відкритті та роботі з файлами, а потім ми збираємося зануритися в проблеми кодування до розглядаючи безліч проблем. Отже, ще раз, я збираюся поставити це на екран, але я буду говорити для всього хвилину про те, що ми тут робиш з файлом I/O-- що це означає? Це означає, що ми можемо створити наш програми, а потім наші програми вихід, а не зробили ніякого впливу на світ за межами нашої програми. Але коли ми починаємо працювати з файлами - як читати їх і створюючи їх - ми можемо мати деякий вплив на Світ за межами нашої програми. Так само, як якщо Microsoft Word не зміг робити будь-які документи слово, то раз Microsoft Word кинути палити, всі ваші робота буде пішов, і це було б дійсно марно. Ми в кінцевому рахунку, хочуть, щоб мати можливість писати програми, які можуть вплинути на Світ навколо них, як, взявши в складні входи - з точки зору файлів і через файли, а також створювати красиві і переконливі виходи - з точки зору різних типів файлів. Ось чому ми починаємо дізнатися, як працювати з файлами. Більш конкретно, що ми робимо це таким чином. Це дуже просто. Є тільки кілька кроків, і вони перераховані тут, на цьому коді. Так що ми збираємося пройти через цей код рядок за рядком. По-перше, ви бачите наголосив - коли ви працюєте з файлом, незалежно від типу файлу це, вам потрібно, щоб відкрити його. І це з закликом FOPEN - прямо тут. Ви включають ім'я файлу. Якщо файл не в каталозі, або папка, в якій ця програма життя, то ви також повинні включати в себе шлях туди, де, що файл є. Ми будемо вважати, що це файл з ім'ям "text.txt" - простий текстовий документ - це в же папці, цієї програми є. Так от інша справа мати на розум - що якщо ви хочете, щоб відкрити файл десь в іншому місці, ви насправді потрібно включити його місце розташування. По-друге, ви можете передати аргумент на Еореп, і ось що ви хочете зробити з файлом. Є три основних аргументи, що Ви збираєтеся перейти на Еореп. Хто може дати мені ці три? Хто може дати мені один з них? Так. СТУДЕНТ 4: Файл? Джейсон Хіршхорна: Вибачте. Три основних аргументи можна передати як другий аргумент Еореп. Ви праві - ім'я файлу є першим аргументом. Але другий аргумент Еореп є як правило, три струни, і - так. Алея. ALEJA: для додавання. Джейсон Хіршхорна:, якщо ви хочете додати у файл, який вже існує. СТУДЕНТ 5: R для читання. Джейсон Хіршхорна: R, якщо ви хочете читати з файлу. СТУДЕНТ 6: Вт для запису. Джейсон Хіршхорна: А ж, якщо ви хочете написати в файл. Таким чином, в цьому випадку, ми пишемо у файл, тому ми повинні ш. Ви відкриваєте його, ви також повинні зберегти файл де-небудь, а от з код з лівого боку оператор присвоювання - Я створюю покажчик на файл називається, в даному випадку, файл. Ми не збираємося турбуватися, що це все заголовні Фото річ. Досить сказати,, це довгий потік нулів і одиниць. І ось як ми збираємося керувати ним і зрозуміти його. Наступне, що нам потрібно зробити, - і Це неймовірно важливо - всякий раз, коли ви відкриваєте файл - насправді, всякий раз, коли ви телефонуєте Танос, для Наприклад, щоб отримати деяку кількість пам'яті і спробуйте і зберегти його в покажчик, ви завжди хочете перевірити, щоб переконатися, що це Функція не повернувся порожнім. Таким чином, в цьому випадку, ми перевіряємо, щоб зробити упевнений, що ми насправді відкрив подати правильно, і було немає помилки в нашій програмі. Далі, як тільки ми перевірили, щоб переконатися, що у нас є робочий файл, ми можемо напишіть, або читання з або додати в файл. У цьому випадку, я просто друку одна лінія в цей файл. Як я дізнаюся, що? Ну, я використовую цю функцію називається fprintf. Всі функції ви будете використовувати при написанні або читанні з або управління файлами буде схожий на функції ви бачили раніше, але починаються з літери F, стоячи для файлу. І fprintf, на відміну від нашої звичайної друку додаток, займає один додатковий аргумент, і що це файл, де ви хочете надрукувати цей рядок. У мене немає нічого, щоб право Ohai. Я не маю третину аргумент Е - або другий аргумент Е, Третій аргумент fprintf, тому що я не мають жодних заповнювачі тут. Я не включаючи будь-які змінні. Але, знову ж, fprintf і всі ці файлі функції, які працюють з файлами , Як правило, збирається потрібен файл на якій вони працюють. Нарешті, остання важлива річ, щоб зробити, це закрити файл, так само, як с - всякий раз, коли ми Malloc щось, ми хочемо звільнити щось, щоб не має місце витік пам'яті - ми хочемо , Щоб закрити наш файл. Якщо ця програма вийшла без закриття файл, шанси нічого не піде не так, особливо, якщо це був невеликий файл. Але це, звичайно, хороший стиль кодування і на практиці завжди закривати файл коли ви закінчите його використання. Так що це основи файлового введення / O. Ви, напевно, бачили, що й раніше, або дивився його в цьому фантастичному короткого замикання. Хто-небудь є які-небудь питання, перш ніж ми йдемо в деякій практики кодування проблеми, про фото введення / виводу або кроки, які я просто підійшов? [Машинці ЗВУКИ] Джейсон Хіршхорна: Чи подобається вам є питання, AVI? AVI: Ні. Джейсон Хіршхорна: ОК. Я збираюся почекати ще сім секунд. [Сміється] Це дійсно хороший рада. Ви, хлопці, просто не подобається задавати питання. Це нормально. ОК. Таким чином, наша перша задача практика, ми збирається дублювати функцію інструмент командного рядка, що ви, мабуть, використовується перш - копії - інструмент копіювання. Якщо ви введете ф а потім передати його два Аргументи на вашому терміналі, ви можете скопіювати файл. І це те, що ми збираємося написати просто зараз. Отже, ще раз, читаючи геть цьому слайді, я б Вам написати програму, яка приймає два і тільки два з командного рядка Аргументи - Вихідний файл і файл призначення - і копіює вміст джерела файл у файл призначення один байт за один раз. Так що дуже багато для з'ясування. Знову ж, хороший підхід до цієї мети є не йдуть прямо в коді C, але розбити його на кілька кроків. По-перше, думати про логіку - точно те, що я прошу вас зробити - і зрозуміти всі кроки до вирішення цієї проблеми. Не в С, просто в якийсь псевдокоде, або навіть ментальна модель що відбувається. Далі, коли у вас є псевдокод вниз, з'ясувати, як псевдокод відображається на інструменти і речей, які ми навчилися використовувати в C. І, нарешті, коли у вас є все, що разом, ви можете написати проблему. Візьміть 5 до 10 хвилин, щоб працювати над цією проблемою. Я покладу інструкціям назад в секунду. А потім ми збираємося перейти псевдокод, і код це жити як група. Якщо у вас виникли питання, поки ви працюємо над цим, не соромтеся, щоб підняти ваша рука, і я прийду навколо і відповісти на них. СТУДЕНТ 7: Чи можу я проведіть папірець? Джейсон Хіршхорна: У чому справа? [Машинці ЗВУКИ] Джейсон Хіршхорна: ОК. Давайте розглянемо псевдокоде першим, і тоді я дам тобі ще пару хвилин, щоб закінчити кодування. Хто хотів би почати мене з першої рядку псевдокод для цієї функції? СТУДЕНТ 8: Переконайтеся, що Вам дали два файли. Джейсон Хіршхорна: ОК. І якщо ми не будемо? СТУДЕНТ 8: я повернуся 0. Джейсон Хіршхорна: Чи повинні ми повернути 0? СТУДЕНТ 8: Повернення - гасіння. Вибачте. Джейсон Хіршхорна: Так. Напевно, немає 0. Тому 0 означає, що все було добре. ОК. Так ось перша лінія псевдокоду. Хто має другу лінію псевдокоде? СТУДЕНТ 9: Відкрити обидві файли? Джейсон Хіршхорна: Відкрийте обидва файли. ОК? СТУДЕНТ 10: Перевірте, якщо файл NULL? Джейсон Хіршхорна: Перевірте, впевнений ні один не NULL. Як осторонь - слеш 0 - є те, що NULL? СТУДЕНТ 11: Ні. Джейсон Хіршхорна: Це не NULL. Це називається NULL термінатор. Це насправді пишеться тільки з одного л. Так перевірка щось проти, що - що насправді персонаж - тому перевірка щось проти, що не те ж саме, як перевіряти, якщо це одно NULL. І деякі люди - на їх вікторинах та їхні проблеми набори - отримали два з них плутають. Але два з них є насправді інший. Один закінчується рядок - один є покажчиком на 0. СТУДЕНТ 12: Чому б вам не перевірити, переконайтеся, що файли NULL перш ніж відкрити їх? Джейсон Хіршхорна: Так відкритим економить щось в цьому файлі. І якщо ви йдете сюди - так ця лінія - Еореп - дасть вам адресу і магазин що адреса у файлі, якщо він працює. Якщо він не працює, він буде зберігати NULL - СТУДЕНТ 12: Ох. ОК. Попався. Джейсон Хіршхорна: У файлі. Таким чином, ви не можете перевірити на NULL до того як ви відкрили їх. NULL означає щось не зробив працювати неправильно. ОК. Тому перевірити, щоб переконатися, ні їсти? Або? Що ми думаємо? Ми будемо йти з цим. СТУДЕНТ 13: Чи є. Джейсон Хіршхорна: Чи є? Жоден не? СТУДЕНТ 13: Чи є. Джейсон Хіршхорна: ОК. Ми, здається, є деякі консенсус з цього питання. Жоден не NULL. Добре, наступний рядок псевдокоду. Хто не дав мені лінію ще? Ми будемо чекати вас. Так. СТУДЕНТ 14: Ви повинні прочитати з першого файлу? Джейсон Хіршхорна: ОК. СТУДЕНТ 14: Або ми використовуємо fscanf або щось на зразок цього першого файлу? Джейсон Хіршхорна: Тому ми хочемо читати з першого файлу і - давайте, що прямо тут. Читання з вихідного файлу. І потім, що ж нам робити після того як ми читання з файлу? Хтось ще? СТУДЕНТ 15: Написати в кінцевий файл? Джейсон Хіршхорна: Ми пишемо, щоб кінцевий файл, і - ОК. Що ще нам не вистачає? Хтось, хто не дав мені рядок коду ще - псевдокоду. Так. СТУДЕНТ 16: Може бути, ви завжди можете перевірити чи є щось, щоб читати для, як в наступному рядку? Це, як в наступному рядку, побачити, якщо він існує. [Електронний звуковий сигнал] Джейсон Хіршхорна: Ой. Це моя журналирования програмного забезпечення. Так? СТУДЕНТ 16: Так. Джейсон Хіршхорна: Так дайте він мені ще один раз. СТУДЕНТ 16: Перевірте, чи правильно там ще наступна рядок з Вихідний файл для читання. Джейсон Хіршхорна: ОК. Таким чином, ми не читає рядки - читали байт тут - але ви праві. Ми хочемо, щоб читати і писати, поки немає більше байт. ОК. І таким чином, вони повинні бути дійсно відступом небагато, тому що вони під там. Чи не так? Поки ми не перебуваєте поза байт, ми збираємося читання з файлу і писати у файл призначення. І потім, що це останній лінія псевдокоде? Той, хто не дано мені щось ще. СТУДЕНТ 17: Закрийте файли? Джейсон Хіршхорна: Абсолютно вірно. Закрийте файли. Так що наш псевдокод. Я збираюся поставити псевдокод в Gedit, і через пару хвилин ми буде кодувати це разом. ОК. Давайте почати роботу в якості групи. Nishant, у мене є новий файл. Я тільки що відкрив це. Без назви документа 1. Що перше, що я повинен робити? Nishant: Увімкніть бібліотеки? Джейсон Хіршхорна: ОК. Які бібліотеки? Nishant: stdio.h, stdlib.h, я вірю? Джейсон Хіршхорна: ОК. Що таке stdlib для? Nishant: Я забув. Джейсон Хіршхорна: ОК. Так включають STDIO. Що робити, ще до Я починаю кодування? Nishant: Написати заголовок? Джейсон Хіршхорна: Як я отримую це кольоровий? [Вставляючи ГОЛОСИ] Nishant: Як ви отримуєте це кольори? Джейсон Хіршхорна: Як я колірне кодування? Nishant: Я не знаю. О. Зберегти. Джейсон Хіршхорна: Save. Так. Я повинен зберегти його як. С. Так збережіть його на робочому столі як cp.c. Солодкий. І якщо я хочу, щоб отримати повну стиль точки, що я повинен включають у верхній? Nishant: Ви могли б написати своє ім'я, ім'я програми, і в цілях програми, а? Джейсон Хіршхорна: Виглядає добре. Відмінно. Отже, ви почали нас відмінно. # Включити - ми також написати - ОК. Так що я думаю, що я все готово до роботи. Хто має перший рядок коду для мене - або перші рядки коду, буде потрібно, щоб задовольнити наш перший коментувати псевдокоде? Ви. СТУДЕНТ 18: вона не повинна бути внутр агдс, а потім символ * агду? Джейсон Хіршхорна: Я думаю, ви праві. Давайте змінимо це в ціле основні, відкриті дужка, внутр агдс, кома, символ * агду? Як це? СТУДЕНТ 18: Кронштейни. Джейсон Хіршхорна: Кронштейни. Відкрити кронштейн, закриває дужка, близько батьків. Прекрасно. Тепер я можу взяти аргументи командного рядка. ОК. Переконайтеся, нам дають два файли. Ви можете дати мені, що добре. СТУДЕНТ 18: Якщо агдс - на цей раз не рівнятися 3. Джейсон Хіршхорна: Якщо відкриті дужка агдс не дорівнює 3? СТУДЕНТ 18: Так, ви повернетеся 1 або що-небудь. Джейсон Хіршхорна: Вибачте. СТУДЕНТ 18: Повернення 1 або що-небудь. Джейсон Хіршхорна: Повернення 1. ОК? Великий. Відкрийте обидва файли. Хто може допомогти мені відкрити обидва файли? Хто не дав мені код ще? Курт? Курт: Так все заголовні F-I-L-E зірки-джерела. Джейсон Хіршхорна: Я збираюся вийняти голосні. Ті, це круто. Це Tumblr. СТУДЕНТ 18: Так само FOPEN - Джейсон Хіршхорна: Так само FOPEN? СТУДЕНТ 18: Відкриті дужка, агду, відкриває дужка. Джейсон Хіршхорна: Почекайте. Вибачте. Відкрити дужка. ОК. СТУДЕНТ 18: Так. Argv 1 до півдня. Джейсон Хіршхорна: Sub 1? СТУДЕНТ 18: Так. Argv відкриває дужка 1 - Так. А потім кома, а потім відкритий подвійний цитата, г, подвійні лапки, близькі дужка, крапка з комою. Джейсон Хіршхорна: Солодкий. А як щодо іншого? СТУДЕНТ 18: Дуже схоже, але замість з S-R-C, ви б назвав це D-S-Т. Джейсон Хіршхорна: Оо! Мені це подобається. СТУДЕНТ 18: Просто D-S-Т. Так. А потім ARGV, відкритий кронштейн, 2. Так. І то ш замість р. Так. Джейсон Хіршхорна: Відмінно. Наступна пара рядків. Крім того, якщо у когось є речі, щоб додати до лінії, які ми зробили, не соромтеся додати і їх. Переконайтеся в тому, ні на є NULL. Хто може дати мені код, мені потрібно, щоб задовольнити цю лінію псевдокоде? Арчер. ARCHER: Якщо враженнями дорівнює рівних NULL або DST складає рівних NULL, то ви повернетеся - Джейсон Хіршхорна: Що? ARCHER: Return 2? Джейсон Хіршхорна: Return 2. Так що, якщо відкрита дужка враженнями одно одно NULL, або - що б це не thing's - труба? Труба? Ми будемо називати його труби. Труба, труби, DST складає рівних NULL, повернутися 2. ОК? Поки ми не перебуваєте поза байт - ми начебто пропустив цей крок з псевдокод частина йти, щоб тут. Але поки ми не з байт - що це схоже? Який вид C структури - але я не використовую структуру слово, тому що ми збираємося, щоб почати використовувати що в інших випадках - але З інструментом це звучить як? СТУДЕНТ 19: петля. Джейсон Хіршхорна: петля. Звучить як петлі. Так хто може дати мені перший рядок коду петлі прямо тут? Ви можете також вибрати, які цикл ви хочете, якщо ви дасте мені цей рядок коду. Є три види. Ви добираєтеся, щоб вибрати. Я хотів би запропонувати один з них. Аві. Який з них ви хочете? AVI: ДЛЯ. Джейсон Хіршхорна: ДЛЯ. AVI: Int я дорівнює нулю. Джейсон Хіршхорна: ОК. AVI: Ця частина я не впевнений, о. Але я менше розміру джерела зірки? Я не впевнений в цьому. Джейсон Хіршхорна: ОК. AVI: Тому що ви хочете розмір файлу, чи не так? Джейсон Хіршхорна: Так що це, ймовірно, не буде дати нам розмір фактична файлу в байтах. Так, що ще ми могли зробити? Що це інший тип циклу? Або ми повинні дотримуватися петля для? СТУДЕНТ 20: Не могли б ви зробити той час як цикл? І потім, що ви хотіли зробити, це you'd - тому що у нас символ * для файлу. Так що, якщо ми просто продовжуємо збільшуючи, що поки ми не знайшли б нульового символу в кінець його? Або ні, у тому, що не так, як працюють файли? Джейсон Хіршхорна: Так ми можемо тримати збільшуючи символ * поки ми не знайдемо NULL - СТУДЕНТ 20: По суті продовжувати посимвольний, поки ми потрапили кінця файлу. Джейсон Хіршхорна: Так. Так ось що ми хочемо зробити. Ми хочемо, щоб читати, характер за характером, поки ми не доберемося до кінця файлу. СТУДЕНТ 20: Так. Знайти - що це кінець чи знак зупинки в кінці текстового файлу. Джейсон Хіршхорна: ОК. Тому, коли ми добираємося до кінця файлу - звідки ми знаємо, що ми досягли кінець файлу? Якщо я дзвоню - так що давайте крок назад. Що таке функція? Підемо в цій лінії прямо тут. Читання з вихідного файлу. Хто може дати мені цей рядок коду? СТУДЕНТ 21: Fscanf? Джейсон Хіршхорна: Fscanf. ОК. Що робити, якщо я хочу читати, дуже Зокрема, один байт? СТУДЕНТ 21: Я не знаю. Джейсон Хіршхорна: ОК. Навіть простіше, ніж fscanf - що це - Я хочу прочитати з вихідного файлу? Читання з вихідного файлу. Що таке функція - так. СТУДЕНТ 22: Це FREAD? Джейсон Хіршхорна: FREAD. Я думаю, давайте дотримуватися що один на даний момент. Які аргументи робить FREAD взяти? СТУДЕНТ 22: Ймовірно, тип файлу, а потім розташування у файлі? Джейсон Хіршхорна: Що я можу ввести тут щоб з'ясувати, який тип аргументів FREAD приймає? КІЛЬКА СТУДЕНТИ: людина FREAD. Джейсон Хіршхорна: Людина FREAD і FWRITE. Схоже, вони бовтатися разом. Так FREAD займає, як багато аргументів? СТУДЕНТ 23: Чотири. Джейсон Хіршхорна: вона займає чотири аргументи. Він приймає покажчик, розмір, і що річ, що дивно, а деякі файл. ОК? Давайте прочитаємо про це прямо тут. "Функція FREAD читає н кор елементи даних, кожен байт розмір довго, з потоку, на який вказує потік, зберігаючи їх на місці дається покажчик ". Так чотири аргументи. Чому б мені не просто скопіювати це, і вставте його прямо тут. ОК. Так хто ж може почати заповнення ці аргументи для мене? Аві. AVI: Вийміть порожнечу. Покладіть тільки SRC. Вийміть покажчик і зірку. Покладіть SRC. Тоді - Джейсон Хіршхорна: Так що я збираюся припинити Ви там, тому що це неправильно. Ви праві з SRC, але де Перебування повинні піти? [Вставляючи ГОЛОСИ] Джейсон Хіршхорна: Він повинен йти сюди. Це враженнями - наш враженнями тип. Давайте подивимося тут. Це просить тип файлу *, ми насправді, як правило, побачити їх так. Так що це просить аргументом тип файлу * під назвою потік, який враженнями. ОК? Який розмір речі робити ми хочемо читати? Я дав тобі це в опис проблеми. СТУДЕНТ 24: Один байт за один раз. Джейсон Хіршхорна: Один байт. Наскільки велика байт? Його розмір в байтах, тому те, що я можу поставити прямо там? СТУДЕНТ 25: Один. Джейсон Хіршхорна: Один. Вірно. Її розмір становить в одиницю байта, так 1 січня байт. Скільки я хочу, щоб прочитати за один раз. СТУДЕНТ 26: Один? Джейсон Хіршхорна: Одна річ. Я хочу прочитати одне з розміру 1, один укус за один раз. І де я можу поставити його, як тільки я прочитав це? СТУДЕНТ 27: Пункт призначення? Джейсон Хіршхорна: Так я не можу поставити це прямо в місце призначення. СТУДЕНТ 28: Ти збираєшся покласти це в третій покажчик? СТУДЕНТ 27: Для призначення. Джейсон Хіршхорна: ОК. Так. СТУДЕНТ 29: Ви можете оголосити щось діяти як тимчасове зберігання раніше. Джейсон Хіршхорна: ОК. Дай мені це. СТУДЕНТ 29: Ще один файл покажчик, може бути? Джейсон Хіршхорна: ОК. Так що це порожнеча зірка - це тип недійсними зірка, так що це не повинні бути дороговказом файлу. І якщо я читаю один байт, де б гарне місце зберігати один байт? СТУДЕНТ 29: масив? Джейсон Хіршхорна: масив. ОК. І, що ще щось, що це просто розмір один байт? СТУДЕНТ 30: символ *? СТУДЕНТ 29: Так. Джейсон Хіршхорна: символ * не один байт. СТУДЕНТ 29: символ. Джейсон Хіршхорна: символ займає один байт. Чи не так? Так що давайте називати цей буфер є загальним ім'я, що використовується для цих речей для зберігання щось тимчасово. Так що я створити буфер. Чи не так? Але для цього треба порожнечу *. Тому, можливо, ви праві, що це повинен бути буфер розміром 0. Так він зберігає один - Право. Тому що це прямо тут - символ буфер характер, але це займає порожнечу * - покажчик. Так що я міг би зробити це і зараз Буфер є покажчиком. Що ще я міг зробити? СТУДЕНТ 31: Покладіть зірку наступний на персонаж. Джейсон Хіршхорна: я міг створили це символ *. ОК. Що ще я міг зробити? Або підемо з цим. Чар * буфер, так що я можу перевести сюди? СТУДЕНТ 31: Буфер. Джейсон Хіршхорна: Буфер. Буфер є покажчиком на символ. І в цьому місці, ми поміщаємо один байт те, що ми читали. Так. Аві. AVI: Просто швидкий питання. Хочете Malloc буфер? Джейсон Хіршхорна: Хто може відповісти на це питання? СТУДЕНТ 32: Ну, це насправді не точка до чого прямо зараз, так - Джейсон Хіршхорна: Але робити ми хочемо Malloc це? СТУДЕНТ 32: Якщо ви повинні були зробити його, що спосіб, я думаю, так, тому що ви повинні були б деяке місце для того, щоб вказати на. Джейсон Хіршхорна: Чи є у нас повинні Malloc це? СТУДЕНТ 33: Якщо ви збираєтеся використовувати його поза циклу. Джейсон Хіршхорна: Ми збираємося використовувати його поза циклом? СТУДЕНТ 34: Так. СТУДЕНТ 35: Почекайте. Чи хочемо ми оголосимо його в петлі в потойбічному? Джейсон Хіршхорна: Так що я думаю, ми повинні деякі псевдо той час як цикл тут, що ми намагаючись з'ясувати, що ми ще не дійшли до ще. Нам не потрібно, щоб Malloc його. Ми працює в основному це тільки збирається для використання всередині цієї петлі. Це не повинні існувати поза цим. Так, це може бути локальна змінна. У вас є вказівник на локальна змінна. СТУДЕНТ 36: Але це не вказуючи ні до чого. Джейсон Хіршхорна: Ні, це не ініціалізації ні до чого. Але ми не збираємося використовувати його також. Ми збираємося, щоб покласти щось в це в перший раз ми її використовуємо. Так що, здається, в порядку. Таким чином, ми не повинні Танос тут. І я думаю, це нормально, як є. ОК. У нас є FREAD лінію. Давайте зробимо наступний рядок. Якщо ми хочемо, щоб записати у файл, що хороша функція використовувати, щоб зробити це? СТУДЕНТ 37: FWRITE? СТУДЕНТ 38: Fprintf? Джейсон Хіршхорна: Fprintf є одним. Що ще один? СТУДЕНТ 39: FWRITE. Джейсон Хіршхорна: FWRITE. І для наших цілей, FWRITE, які ми бачили тут, ймовірно, кращий вибір. Він приймає чотири аргументи, а також. Nishant, ви можете дати мені аргументи? Nishant: перша відбувається бути просто буфер. Джейсон Хіршхорна: ОК. Nishant: Другий'S просто буде 1. По-третє один буде 1. І четвертий буде DST. Джейсон Хіршхорна: Хто-небудь є всі питання про ту лінію? Це виглядає добре. ОК. Так що тепер це виглядає як одне ми знаходимося відсутня - насправді, давайте напишемо це останній рядок. Закрийте файли. Хто може закінчити нас писати ці останні два рядки? Так. На жаль, як тебе звати? Люсі: Люсі. Джейсон Хіршхорна: Люсі. ЛЮСІ: Fclose враженнями, а потім FClose призначення. Джейсон Хіршхорна: Fclose, відкрита дужка, Спочатку, близькі дужка, крапка з комою. І FClose - да? ЛЮСІ: Відкрити дужки, DST а потім з комою. Джейсон Хіршхорна: Відмінно. І що я повинен включити в кінці? ЛЮСІ: Повертає 0. Джейсон Хіршхорна: Повертає 0. Чи повинен я? Просто питання. Чи є у нас включити повернення 0? КІЛЬКА СТУДЕНТИ: Ні. Джейсон Хіршхорна: Ні. Головна робить це автоматично якщо ви дійдете до кінця. Але я думаю, це добре, коли включити його в явному вигляді. Особливо, коли ми повертаємося до одного речі протягом усієї програми. ОК. Це те, що нам не вистачає - А те, що? Хто може думати про деяких - має деякий сенс, які речі може піти туди? Навіть якщо це всього лише в деякому псевдокоде як і мова? Що ми насправді - те, що ми хочемо, щоб йти до? Так, Люсі. ЛЮСІ: кінець файлу. Джейсон Хіршхорна: кінець файлу. Так що ви розумієте під кінець файлу? ЛЮСІ: Як тільки ви досягаєте кінець файлу, зупинитися. Джейсон Хіршхорна: ОК. Тому, як тільки ми досягнемо кінця файлу. Як ми знаємо, коли ми досягли кінець файлу? СТУДЕНТ 40: Я думаю, що буфер буде встановлений в NULL. СТУДЕНТ 41: Буфер оголошений всередині циклу. Джейсон Хіршхорна: Так ви думаєте, буфер буде встановлений в NULL. Навіщо буфер бути встановлений в NULL? СТУДЕНТ 40: Тому що, коли ви FREAD, ви намагаєтеся поставити нічого в буфер. Джейсон Хіршхорна: ОК. Так що ви думаєте FREAD - коли ми досягли кінця файл, що FREAD збираєтеся робити? Я думаю, що це питання ми повинні з'ясувати. Що FREAD робити? Чи означає це поставити NULL в буфері, або він робить щось ще? Як ми можемо зрозуміти, що це? СТУДЕНТ 42: Людина. Джейсон Хіршхорна: Людина. Отже, давайте подивимося тут. Повернутися значення. У разі успіху FREAD і FWRITE повернутися кількість елементів зчитані або записані. Це число дорівнює кількості байт передаються тільки при розмір 1. Якщо відбувається помилка, або в кінці файл буде досягнуто, повертається значення Коротка кількість елементів або 0. Так що для наших цілей, якщо FREAD досягає кінець файлу, і зчитує з кінець файлу, там нічого не залишилося читати, що він збирається повернутися? СТУДЕНТ 43: Нульова? Джейсон Хіршхорна: Що? СТУДЕНТ 43: Нульова? Джейсон Хіршхорна: Нуль. Це збирається повернути нуль. Отже, ми знаємо, що FREAD, коли ми досягли кінця файлу, збирається повернутися до нуля. Як ми можемо використовувати це в наших інтересах? AVI: Ви можете оголосити змінну за межами петлі під назвою перевірка. Якщо перевірка одно - на даний момент - один. Джейсон Хіршхорна: ОК. AVI: І тоді ви можете покласти IF заяву відразу після FREAD кажучи, якщо FREAD дорівнює нулю - немає. Джейсон Хіршхорна: Хто може допомогти Аві не вдома? AVI: Що таке значення повертаний FREAD? Джейсон Хіршхорна: Ми просто пішов з цього приводу. AVI: Як ви уявляєте це? Джейсон Хіршхорна: Так вона повертає - давайте подивитися тут - вона повертає size_t, який є по суті цілим числом. Так що повертає ціле. А в нашому випадку, це буде повертає 1 або 0 - 1, якщо він читав одне - один байт, і 0, якщо ми дійшли до кінця. Так що якщо FREAD - да? СТУДЕНТ 45: А ви не можете просто покласти повною FREAD (буфер, 1, 1, SRC) в в той час як цикл? Джейсон Хіршхорна: Так ви пропонуєте Роблячи це в там? [Вставляючи ГОЛОСИ] Джейсон Хіршхорна: Почекай. Таким чином, ми позбавлення цього. Так ви пропонуєте покласти FREAD в там? Що ми повинні також рухатися якщо ви хочете зробити? СТУДЕНТ 45: Буфер зовні. Джейсон Хіршхорна: Ми повинні також рухатися в цьому тут. СТУДЕНТ 45: Але робить це постійно перемістити його вперед? [Вставляючи ГОЛОСИ] Джейсон Хіршхорна: ОК. Так ось що запропонував Okshar. Ми створюємо наш буфер. Ми ПОКИ FREAD, то ми FWRITE. Думки з цього приводу? СТУДЕНТ 46: Мій єдиний питання, буде він насправді виконати команду FREAD? Джейсон Хіршхорна: Хороше питання. Коли ви кладете виклик функції всередині стану, робить це виклик функції виконувати? Ми бачили приклади цього раніше. Чи не так? СТУДЕНТ 46: ОК. Так. Так він робить виконати. Джейсон Хіршхорна: Ми бачили речі ні раніше, де у нас є Виклик функції всередині умови. Лі виконати, що виклик функції? Так. Таким чином, відповідь буде позитивною. Виклик цієї функції буде виконувати. Але знову ж, це те, що ми хочемо? Що є одним із способів ми могли зрозуміти , Якщо це те, що ми хочемо? КІЛЬКА СТУДЕНТИ: Запустіть його? Джейсон Хіршхорна: Ми могли б запустити його. Але перш ніж ми це зробимо, ми могли також міркувати через це. Якщо - у нас є один байт в нашому файл, ми повернемося до тут, ми повернемося до цього коду. Це буде працювати. FREAD повернеться один байт і зберігайте його в буфері. І це буде оцінити в 1, Добре, після того як він повертає 1. Таким чином, хоча 1. Чи означає це, код всередині Тоді як цикл буде виконуватися? СТУДЕНТ 47: Так. Це правда. Джейсон Хіршхорна: Так. 1 вірно. Це не 0. Таким чином, код всередині тут буде виконувати. Тому ми будемо писати, що. Ми будемо рухатися до цієї лінія ще раз. Тепер у нас є - ми в кінці нашого файлу. Ми читаємо з кінця нашого файлу, , Тому що ми тільки один байт в ньому. FREAD повертає 0, магазини щось в буфері. Я чесно не знаю, що він зберігає в буфері. Ми могли б, ймовірно, шукати щоб побачити, що він робить. Те, що я чесно не знаю. Ми не знаємо, кого це хвилює те, що він зберігає в буфері? Але це повертає 0. І буде в той час як 0 виконати? ПОКИ 0 не виконуватимуться. Так тоді ми будемо рухатися вниз тут. Так що давайте підняттям рук, якщо це це код, ми повинні працювати, або якщо ми повинні зробити зміни в першу чергу. Так що якщо ви думаєте, - у вас є, щоб голосувати. Якщо ви думаєте, ми повинні запустити цей код як є, будь ласка, підніміть руку. ОК. Там одна - у вас є питання, занепокоєння? Так. СТУДЕНТ 48: Після того як ми рухатися буфер поза циклом, ми повинні Malloc це? Джейсон Хіршхорна: Хороше питання. Після того як ми рухатися буфер межами цикл, ми повинні Malloc це? Це питання, сфера. Якщо ми ініціалізації буфера за межами з цієї петлі, чи буде він існувати всередині циклу? КІЛЬКА СТУДЕНТИ: Так. Джейсон Хіршхорна: Так. Його сфера охоплює всередині циклу, і, дійсно, все, що нижче його всередині цього коду, в тому числі речі всередині тут. Таким чином, ми не повинні Malloc його. Це локальна змінна, і її масштаби раніше включає цикл. СТУДЕНТ 49: Чи потрібно нам, щоб звільнити її? Джейсон Хіршхорна: Чи є у нас потрібно вільного буфера? СТУДЕНТ 49: Так, якщо ми не Танос. Джейсон Хіршхорна: Чи є у нас потрібно вільного буфера? Ми не знаємо. Знову ж, це локальна змінна, так що ми не повинні звільнити його. ОК. Давайте подивимося, що станеться. Так що без ініціалізації. Це було те, що те, що Маркус запропонував раніше. Тому у нас є, що помилки, змінна буфер НЕ инициализирован при використанні тут. Як ми можемо це виправити? СТУДЕНТ 50: Malloc це? СТУДЕНТ 51: Так само NULL? СТУДЕНТ 52: Скажіть буфера дорівнює NULL. Джейсон Хіршхорна: ОК. Виглядає добре. У нас є зараз. Давайте створимо щось спробувати копіювання. Так у нас є текстовий файл. Як ми можемо запустити цю програму? Так. СТУДЕНТ 53: Ви можете зробити точку слеш CP, test.txt. І тоді ви можете назвати ще один файл які він буде зберігати в. Джейсон Хіршхорна: ОК. Ми будемо називати його out.txt. Круто? Seg вина. Думки про вино сегменті? Це дуже зручно. Як ми можемо дізнатися, де несправність сегмент є? Що? СТУДЕНТ 54: GDB. Джейсон Хіршхорна: GDB. Ми біжимо GDB, написавши GDB точка слеш, назва нашої програми. Немає аргументів командного рядка там. Ми збираємося встановити зупину на основний. Якщо я хочу, щоб почати GDB, що мені робити? СТУДЕНТ 55: Р. Джейсон Хіршхорна: Р. А що потім? СТУДЕНТ 55: Аргументи? Джейсон Хіршхорна: Тоді аргументи командного рядка. Давайте розглянемо. N просто бере мене рядок за рядком. Я збираюся піти до Я отримаю свій сегм несправність. Там мій сегмент вина. Схоже FREAD викликало мій сегмент вина. Я знаю, FREAD викликало моє сегм провину, тому що це було Лінія ми тільки що виконали. І єдине, що було відбувається в цій лінії - дві речі відбувалися. FREAD збирався, і потім ми були робить деякі перевірки часом. Я готовий закластися, що ПОКИ перевірки не є причиною мого сегм несправність. Швидше за все, FREAD було причиною мого сегм несправність. Я також бачу щось тут, memcopy. Копія пам'яті. Схоже, рухаючись пам'ять з одне місце до іншого. Схоже, те, що сталося б в FREAD, можливо, деякі пам'яті перехід від сих до сих. Давайте пройдемося по цих знову. Як мені почати це знову і запустити його знову? Так. СТУДЕНТ 56: Ви повинні поставити амперсанд перед буфера? Джейсон Хіршхорна: Так амперсанд перед буфер дасть мені адресу буфер, який являє собою символ *. Давайте розглянемо це ще один раз. Як запустити через нього ще раз? СТУДЕНТ 57: Може ви просто введіть запустити знову? Джейсон Хіршхорна: Просто введіть працювати знову. Таким чином, ми не збираємося виконати цю лінію. Так буфера є покажчиком NULL. Виправте? Це вказує на - подивимося. Якщо у нас є - намалювати швидку картину цього. Чи всі можуть побачити, якщо Я пишу тут? Так в стеку, у нас є місцевий змінна і це буфер називається, і це покажчик на символ. Який адресу це символ на? СТУДЕНТ 58: 0x0. Джейсон Хіршхорна: Вірно. Ось що це таке. Тут, всередині буфера, зберігається 0x0. Це те, що у нас є - Установка у нас зараз. Так ця лінія, FREAD, ставить щось від джерела, де? У цій рамки або цієї рамки? Який ящик? Ліва коробку або праву коробку? Це право коробка. Це випливає за покажчиком, і поміщає його в тут. Коли ми намагаємося і сенсорний пам'яті на Місцезнаходження на карті 0, що ми отримуємо? Сегментація вина. Це помилка у нас зараз. Так. СТУДЕНТ 59: Не у вас є покласти зірки буфер? Чи ні? Для FREAD? Джейсон Хіршхорна: Так FREAD приймає покажчик. Так вона проходить в буфері. А потім вона буде разименовиваются це десь всередині FREAD. Але знову ж, ми бачили, вона займає покажчик. Нам не потрібно, щоб передати йому зірки буфер. Це було б проходячи це те, що тут. І це, ймовірно, дав нам повідомлення про помилку тому що ми де-посилання на нього. Чи не так? Коли ми разименовиваются цей покажчик, коли ми намагаємося відкрити місце, ми отримуємо помилку - наша сегментація вина. Так що - упс. Ми збираємося кинути з GDB. Наша лінія - наше завдання - правильно тут, на цій лінії. І це проблема, тому що з цієї лінії. Як ми можемо створити вікно, яке доступний в FREAD. Чи не так? Нам потрібно створити вікно, яке один байт великий, розміром з гольца. Але нам потрібно, щоб вікно, щоб бути доступним коли ця функція виконується. То де - да. Є ідеї? СТУДЕНТ 60: Просто встановити його в якості будь-який випадковий характер. Просто робити Char буфера дорівнює характер. А потім, коли ви буфер там - Джейсон Хіршхорна: Почекайте. Чар буфер? Так ні зірки? СТУДЕНТ 60: Так. Вийміть зірку. Так само випадковий характер. Джейсон Хіршхорна: ОК. Так дайте мені один. СТУДЕНТ 60: Як або щось. А потім, коли у вас є буфер там, ви використовуєте - СТУДЕНТ 61: Звезда? О ні, амперсанд. СТУДЕНТ 60: Використовуйте амперсанд. Джейсон Хіршхорна: ОК. А як щодо в FWRITE? СТУДЕНТ 60: Використовуйте амперсанд знову. Джейсон Хіршхорна: Добре. Так ваша ідея, ми створюємо символ і покласти щось у ньому, а потім запис на цей символ. СТУДЕНТ 60: Так. Джейсон Хіршхорна: Що люди думають? СТУДЕНТ 62: Це заплутаним. Джейсон Хіршхорна: ОК. Давайте намалюємо його. Тому цього разу, я збираюся зробити це в червоний в стеку тут, і тоді ми матиме - ох! Вибачте. Тому цього разу у нас є те, що називається буфер, і це в стек. Виправте? І ми економимо у ньому в, на початковому етапі. Тоді у нас є виклик FREAD. Що FREAD робить це бере байт з наш файл і поміщає його десь. Це ставить його в будь штука вказуючи на. Ну, перш ніж ми мали цю адресу - 0x0. Тепер те, що адреса у нас є? СТУДЕНТ 63: Незалежно адреса буфера. Джейсон Хіршхорна: Незалежно адреса буфера. Це, ймовірно, буде щось в цьому роді. Напевно збираюся почати з б і е, а потім шість інших шістнадцяткові цифри. Не має значення. Деякі адресу. І ми передаємо цю адресу дюйма І ми збираємося поставити нашу одну байт, що за цією адресою. Таким чином, ми збираємося поставити нашу одну байт, що всередині тут. А потім ми збираємося писати з що коли-небудь всередині тут. Хто-небудь є які-небудь питання про це? Хто думає, цей код буде працювати? Підніміть руку, якщо ви вважаєте, цей код буде працювати. Ви повинні зайняти позицію. А хто думає, що це код не працюватиме? Підніміть руку. Все інше має бути підвищення їх руку. ОК. Майкл, де ти стоїш? Майкл: Я не можу вирішити. Вид в середині. Джейсон Хіршхорна: Ти в середині. Виберіть один. Майкл: Я буду мати віру і кажуть, що це буде працювати. Джейсон Хіршхорна: ОК. Ви будете мати віру і сказати, що це працює? Що трапилося? [Вставляючи ГОЛОСИ] Джейсон Хіршхорна: Ні сегмент вина. Як ми можемо перевірити, якщо дві речі рівні? Два файлу рівні. СТУДЕНТ 64: Різниця. Джейсон Хіршхорна: Різниця. Diff перевіряє відмінностей між два файли, і якщо вона повертає нічого, вони не ідентичні. І якщо ми відкриваємо, ми отримуємо наш файл. Так, щоб було правильне рішення. Давайте озирнутися на нього ще раз. Ми фактично навіть не необхідно ініціювати його. Це, ймовірно, виглядати трохи чистіше, якщо ви не ставив щось випадкове в там. Справа буття, вам потрібно створити деякий простір для зберігання щось від FREAD і взяти щось з FWRITE. І, що саме довелося бути локальною змінна в стеці - ви міг би malloc'd деякий простір. Таким чином, ми насправді може мати написано Танос тут, і що б працював. І тоді ми були б зберігати наші речі десь в купі. Але це насправді, напевно, саме елегантне рішення. Просто створіть деякий простір в стеку для цих речей, щоб іти. Я б ще два зауваження. Якщо б ви були прийняти поворот в цьому, і потім отримати забив на це, мої коментарі буде виглядати наступним чином. Ці 1 тут, зі мною, з нетерпінням як магічних чисел. Ця 1, з точки зору FREAD, має сенс. Ось кілька речей, читати, ні писати. Але це прямо тут слід ймовірно, буде щось інше. Так що одне рішення? СТУДЕНТ 65: Розмір байта. Джейсон Хіршхорна: Як що? СТУДЕНТ 65: Розмір символ. Джейсон Хіршхорна: Розмір символ. Так, байт не є типом. Так розмір символьних робіт. Ми могли б, у верхній частині наш код, # визначається, що. Викликається щось BYTE і це дійсно символ. Насправді, навіть краще, підхід можна було б це - UINT. Хто-небудь знає, що це таке? Вибачте. Я його у зворотному напрямку. Зачекайте, немає. У яку сторону вона йде? Хто-небудь знає, що це таке? Так. СТУДЕНТ 67: Передбачуваний, щоб допомогти стандартизувати через системи речей, які є - як цілі числа без знака що є 8 байт? Джейсон Хіршхорна: Це Абсолютно вірно. На різних машинах, розмір гольца - як правило, не символ. Знаків, як правило, один байт. Але розмір інших типів даних є різних розмірів на 32-бітної машині в порівнянні з 64-бітної машині. Uint8_t завжди 8 біт - завжди один байт. І мені потрібно, щоб включити, що стандартний файл внутр заголовок. Так що тепер, це буде, ймовірно, були кращий спосіб писати цей код. Так що я позбутися магічних чисел. І у мене також є більш логічним введіть для буфера. Це не просто символ, це байт, що і ми очікуємо, що він буде. І тут, ми насправді був трохи більш надійними. Ми не називаючи це символ, який - може бути, хто знає - може бути інший Розмір на різних машинах. Ми насправді кажу, що це точно один байт, завжди, незважаючи ні на що. І якщо ми подивимося тут, ми робимо СР Ой-ой. Що трапилося? СТУДЕНТ 68: Це може бути включений. Джейсон Хіршхорна: Що? СТУДЕНТ 69: Чи є це? СТУДЕНТ 70: Ви не зробили визначити його як типу. СТУДЕНТ 71: Але він повинен бути визначені в стандарті. СТУДЕНТ 72: Що відбувається? СТУДЕНТ 73: Якщо визначити бути все заголовні? Джейсон Хіршхорна: Так що це не # визначити. Насправді, в цьому випадку, я збираєтеся використовувати ЬурейеЕ. Оскільки ми використовуємо його в якості Тип в одному місці. Таким чином, в цьому випадку, ми насправді хочемо TypeDef як ми друку нового типу байт, і це, по суті, це. Це трохи відрізняється від # визначити. А тепер, наш код працює відмінно. Так, знову ж, # визначити бере щось, замінює його скрізь з іншого речі. Це просто макро - скорочення, щоб позбутися від магічних чисел. Але в даному випадку, тому що ми використовувати його в якості типу - прямо тут - для того, щоб це працювало, ми повинні щоб TypeDef що байт. І ми визначаємо його прямо тут. Це не структура, це насправді просто ціле число без знака. Це один байт. Цей код буде доступна в Інтернеті, і Ви всі повинні мати це прямо зараз. Тому у нас є - ідеально - 13 хвилин поїхав, щоб піти над проблемою встановити 5. Я хочу, щоб йти через copy.c разом, і тоді ми будемо коротко говорити про інших частинах проблеми встановлений. Отже, дозвольте мені підтягнути copy.c. І здорово, що є, ми насправді вже написав багато цього коду. Код, який ми писали буквально тільки вийшов звідси, коли мені було пишу це на мою власну. Але це copy.c, формує основу протягом перших двох частинах проблема встановлений для whodunit.c, який вам потрібно написати, і Зміна розміру. Recover.c, який є третім і останнім частина безлічі завдань, що не засновані від цього файлу. Ви будете потребувати, щоб написати цей файл, ми даємо вам шаблон для цього файл, але це не має ніякого відношення робити з copy.c. Але оскільки copy.c є основою для перші дві частини, ми збираємося йти через нього зараз, так що ви повинні гарне почуття, що він робить. І коментарі давати деякі з них далеко. Ми вже писали деякі з цього. По-перше, ми робимо, що ми отримуємо три аргументи. Далі, ми згадуючи ім'я файлу. Таким чином, ми пропустили цей крок, коли ми кодували свою справу - коли наша ср Але тут, вони роблять його трохи чистіше. Вони перевіряють, щоб переконатися, обидва файли хороші, в доповненням до їх відкриття. Ми написали весь цей код тільки зараз, так що я не збирається зупинятися на цьому коді. Наступна деякий матеріал це специфічні для типи файлів ми використовуємо,, які є растрових файлів. Растрові файли мають деякі метадані пов'язані з ними. Таким чином, перша пара байтів розповісти вам про файл. Вони не є квітами піксель в цьому зображенні. Вони кажуть вам про файл. І якщо ви читаєте через набір проблем, ви будете мати набагато більше інформації на які типи структур метаданих включені з точковими зображеннями. Але саме тому у нас є цей перший набір - цей код прямо тут. Ми читаємо метадані - дві частини метаданих - файл заголовок і інформаційний заголовок. І ми перевіряємо деякі його частини, щоб переконайтеся, що він є істинним Файл реєстрового перш ніж продовжити. І знову ж, це деталі ми не потрібно йти в даний час. Якщо ви читаєте через набір проблем, Ви зрозумієте це. Коротше кажучи, вони просто кажу, це файл зображення, і підтвердження того, що. Далі, ми пишемо ті в файл назовні. Ми бачимо, що тут. Ми пишемо на зовнішній покажчика. Далі, ми визначення заповнення. Отже, ще раз, як це особливість з Файл реєстрового, деякі лінії включають в себе оббивка в кінці. І якщо ви читаєте через набір проблем, ви дізнаєтеся більше про оббивка. Це і є формула, щоб знайти додаток. Важливо пам'ятати - при зміні розміру растрового зображення файл, зміни заповнення. При зміні розміру файл, зміни заповнення. Це ніколи не буде більше, ніж 3 - це буде від 0 до 3 включно. Але коли ви змінити розмір щось, зміни оббивка. Якщо у мене є тільки один піксель в цьому рядку, я потрібно три байта заповнення, оскільки кожен рядок повинна бути кратні чотирьом байт довжиною в растровий файл. Але якщо я його подвоїти, щоб перейти від одного пікселя на два пікселя, кожен з яких, скажімо так, є байт, то мені потрібно два байти заповнення, щоб зробити що дорівнює чотирьом. Тому, коли я змінити розмір чогось, Мені потрібно змінити кількість оббивка у мене є. Чи має це сенс для всіх? Далі, ми перебору кожного рядка, або по всіх рядках. А потім ми перебираємо кожен стовпець в кожному рядку. Ми лікуванні цього растрове зображення як сітка, як ми розглядали плата в 15. Як ми лікували цеглини, коли ми друкували їх на екрані. Сітка з рядків і стовпців. Тоді - ми бачили це. Ми насправді просто закодовані це. Ми створили кілька тимчасове зберігання. Ми читаємо в там, а потім ми пишемо його. Це саме те, що ми тільки що зробили. Далі, тому що я сказав кожен рядок закінчується в деякому оббивка, ми пропустити цього доповнення - старий оббивка. А потім ми знову додати його. У цьому випадку, ми створюємо точно такий же файл. Ми просто копіюючи його. Так ця лінія нерозумно. Ми могли буквально тільки поставити прокладку дюйма Але якщо ви зміните розмір файлу, Ви все ще хочете цю лінію? Так що, якщо ми змінимо розмір файлу, ми як і раніше хочуть, щоб пропустити поверх старої прокладки? СТУДЕНТ 74: Так. Джейсон Хіршхорна: Так ми робимо. Тому що це, знову ж, угоди з вихідним файлом. Ми не дбаємо про оббивка з вихідного файлу. Ми хочемо, щоб перейти до наступного рядка. Але ми не просто покласти назад старий Обсяг заповнення. Ми повинні покласти назад новий Об'єм заповнення. Тому, коли ми міняємо розмір файл, ми все ще хочемо, щоб пропустити оббивка в старому файлі - те, що ми читаємо в від. Але те, що ми пишемо, щоб, ми збираємося необхідно помістити назад дещо відрізняється кількість оббивка, що ми визначили. Так. СТУДЕНТ 75: Порядок цих двох лінії не має значення, чи не так? Тому що ви обробки різні файли. Джейсон Хіршхорна: Абсолютно вірно. Порядок цих двох ліній не має значення. Ми пишемо цю лінію. Це тут для файлу ми пишемо, щоб. Це важливо, тому що ми отримуємо Потрібна кількість оббивка. Це має справу з файлом в. Ми хочемо, щоб пропустити право над прокладкою. Ми не хочемо, щоб прочитати - якщо ми читаємо байт за один раз, ми не дбають про тих додаються байти. Ми хочемо, щоб перейти до наступного рядка. Нарешті, як і Люсі дав для нас, ми закриваємо файли і повертати 0. Так що це copy.c. І ми насправді написав - ми провели більшу частину розділ пишу це, по суті. Ви зробили це. Так що, сподіваюся у вас є гарне почуття про те, що відбувається тут. Велика різниця, якщо чесно, це просто це перша частина, яка займається особливості растрових файлів. Так що у мене, як мій наступний слайд, Що ж ми повинні робити? Ну, давайте подумаємо про детективний роман. І для того, хто прочитав проблема встановити, що ж ми потрібно зробити в детективний роман? Просто. Алея. ALEJA: Чи можете ви прийняти ту частину кожного пікселя, яка позначає червоний колір. А потім - вид? Джейсон Хіршхорна: ОК. Так вивезти частину кожного піксель, який позначає червоний колір. Це близько, але не все. СТУДЕНТ 76: Ну, є різних способів зробити це. Джейсон Хіршхорна: ОК. Дайте мені одну сторону. СТУДЕНТ 76: Вийміть всі червоні, і потім підкреслити синій і зелений. Джейсон Хіршхорна: ОК. Тому, враховуючи обидва ці шляхи - це звучить як ми даємо йому піксель, це має червоний, синій і зелений рівень. Ми хочемо змінити відносні рівні червоний, синій і зелений, залежно на цьому пікселі. Де в цьому коді ми повинні змінити відносна червоний, синій і зелений рівні даного пікселя. Після того як ми читали його - перш, ніж ми писати? Дайте мені номер рядка. КІЛЬКА СТУДЕНТИ: 83. Джейсон Хіршхорна: 83. Так прямо тут. Для детективний роман, код потрібно записи всі повинні йти прямо там. І це тільки код вам потрібно написати. Тому що, як ми почули, все що вам потрібно зробити, це змінити ці відносну синій, червоні, і зелені рівні від кожного пікселя. Ви читали його, і тепер ви збираюся написати його. Як я можу отримати - якщо у мене є ця річ називається потрійний, прямо тут, і це не має введіть RGBTRIPLE - добре, якби ми дивилися в bmp.h, що RGBTRIPLE? СТУДЕНТ 77: Це структура. Джейсон Хіршхорна: RGBTRIPLE є структурою. Ми бачимо, що прямо тут. І тому, якщо я хотів доступу, скажімо, червоний рівень структури, як мені доступ червону рівень цієї структури? [КЛАС бурмоче] СТУДЕНТ 78: RGBTRIPLE.rgbtred? Джейсон Хіршхорна: Це правильно? СТУДЕНТ 79: Вона повинна бути потрійна точка, а RGBTRIPLE точкою? Джейсон Хіршхорна: Тримісний. Тримісний є локальної змінної, тому тут, немає ніяких покажчиків тут. Так що ми просто використовують точку. Це дасть мені рівень червоний. Якщо я хочу, щоб змінити його, я просто встановити це складе щось інше. Отже, ще раз, цей рядок коду отримує доступ ця змінна всередині цієї структури, і ми можемо встановити його на щось нове. Таким чином, для детективний роман, знову ж, це, по суті, те, що ми повинні зробити. Дуже просто. Просто змінити деякі відносні рівні, і це де цей код йде. Зміна розміру, з іншого боку, трохи складніше. Насправді, зміни розміру, ймовірно, складна частина цієї проблеми встановіть. У нас є три хвилини, щоб піти по ньому. Але знову ж, ми вже писали більшість з цього коду, тому ми має бути досить знайомі. Які деякі речі, які ми хочемо зробити в змінити розмір, якщо ви читали над Проблема встановити? Якщо ви дасте їх мені, ми може говорити про них. Які деякі речі, які ми хочемо зробити? СТУДЕНТ 80: Вертикально - так що вам доведеться по горизонталі змінити його розмір, але вертикально змінити її розмір, а? Джейсон Хіршхорна: Так що, якщо нам дають піксель, і ми хочемо змінити його, в два рази, тепер він повинен бути змінений по горизонталі і зміни розміру по вертикалі. Чи має це сенс? Так. Так що, напевно, Найбільшою проблемою. І ми будемо говорити про те, що в с. Так. СТУДЕНТ 81: Те, як я думав про це був вам потрібно роздрукувати його - Джейсон Хіршхорна: Почекайте. Не кажіть нам, що ви зробили. Ми збираємося говорити в логіці. СТУДЕНТ 81: ОК. Який був питання? Джейсон Хіршхорна: Ви тільки що підняв руку. Там не було й мови. Дозвольте мені представити його. Дозвольте мені обговорити це коротко. Таким чином, ми в один піксель, ми хочемо повторити його по горизонталі і по вертикалі. Так що теоретично, що ми робимо тут, ми читати в нашій пікселя, запишемо його Однак багато хто з часів. Але тоді у нас є трюк тут, тому що то ми хочемо, щоб перейти до Наступний рядок і написати це на початок наступного рядка. Так що якщо ми хочемо повторити обидва горизонталі і вертикалі, що це один хороший спосіб зробити це - один хороший, хоча це зробити? Таким чином, ми не повинні постійно шукати навколо нашого файлу розмістити речі. Це питання, можливо, не мало сенс, але я думаю, відповісти на нього допоможе. СТУДЕНТ 82: Створення масиву? Джейсон Хіршхорна: Так що давайте думати кожного файлу як підряд. Давайте думати в термінах рядків. Якщо у нас є перший ряд від нашої маленької картина, ми можемо зробити цей рядок у великій ряді від великої картини, а потім повторити цей рядок однак багато разів це має бути відтворені, замість того, щоб піксель за пікселем, яка збиває з пантелику, коли роботі з файлами. Тому що, якщо ми мали - Я біжу з космосу. Якщо це наш файл, і у нас є, що один піксель є, і ми хочемо, щоб покласти його тут же, у нас ще є деякі речі, що потрібно йти туди, коли ми писати і створення нашого нового файлу - наш файл, що це в два рази більше. Але це дійсно важко з файлових функцій пропустити навколо, щоб нових ліній так, а потім повернутися сюди і навести там. Це майже неможливо зробити щось так, якщо це має сенс. Так що, якщо ми думаємо в термінах рядків, ми можемо взяти нашу рядок, а потім покласти його - повторити рядки по вертикалі. І ось як ми маємо справу з зміни розміру вертикально, а не горизонтально. Це було почасти швидко, і трохи заплутаним. На жаль, наш час минув. Я буду стояти на вулиці для тих з вас, тут, у кого є питання з приводу Проблема набір, в тому числі відновити. Так що давайте відкласти на даний момент. І знову ж, якщо у вас є які-небудь питання, ми можемо спілкуватися на вулиці.