Джейсон Хиршхорн: Добро пожаловать, все, чтобы Неделя 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 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: Создание массива? Джейсон Хиршхорн: Так что давайте думать каждого файла в качестве подряд. Давайте думать в терминах строк. Если у нас есть первый ряд от нашей маленькой картина, мы можем сделать эту строку в большой ряду от большой картины, а затем повторить эту строку однако много раз это должно быть воспроизведены, вместо того, чтобы пиксель за пикселем, которая сбивает с толку, когда работе с файлами. Потому что, если мы имели - Я бегу из космоса. Если это наш файл, и у нас есть, что один пиксель есть, и мы хотим, чтобы положить его тут же, у нас еще есть некоторые вещи, что нужно идти туда, когда мы писать и создания нашего нового файла - наш файл, что это в два раза больше. Но это действительно трудно с файловых функций пропустить вокруг, чтобы новых линий так, а затем вернуться сюда и навести там. Это почти невозможно сделать что-то так, если это имеет смысл. Так что, если мы думаем в терминах строк, мы можем взять нашу строку, а затем положить его - повторить строки по вертикали. И вот как мы имеем дело с изменения размера вертикально, а не горизонтально. Это было отчасти быстро, и немного запутанным. К сожалению, наше время истекло. Я буду стоять на улице для тех из вас, здесь, у кого есть вопросы по поводу Проблема набор, в том числе восстановить. Так что давайте отложить на данный момент. И опять же, если у вас есть какие-либо вопросы, мы можем общаться на улице.