>> JASON HIRSCHHORN：欢迎光临， 每个人，至第6周。
我很高兴看到你们都活得很好 测验0后，因为我知道，
是有点粗糙。
但幸运的是，你的所有 做了令人难以置信的好。
所以这是美妙的。
如果你在我的部分，我已经给了最 你已经备份你的测验。
>> 一对夫妇的你，我满足 下课。
如果你是一个扩展的学生， 您还没有收到您的回测验
然而，你的TF可能是工作就可以了 和分级它，将它找回来
给您回复。
所以，我的扩展学生谁 看现在 - 希望生活 -
我会得到你的测验 短期内也是如此。
>> 我们今天的议程如下。
首先，我们要介绍一些 资源CS50提供给你。
我们要投奔测验0下了， 我会回答任何问题，任何人
有关于特定问题。
然后，我们将去了 文件I / O和习题集5。
那些过去的​​两个主题将采取 达今日栏目的体积。
>> 我每星期把这个列表为一个 提醒你所有，但核心
节中，我们只为90分钟 - 我们 不能涵盖一切，我
很想掩护你们。
但我们有一吨的资源，为 你借鉴，你了解
通过材料和工 你的习题集。
>> 提醒一下，我有一个在线文字 中，设置为你填写，如果你
有任何意见对我来说， 正面和
建设性的，关于部分。
该URL坐落在此地。
所以，请花一点时间，如果您有任何 反馈，无论是节期间，
或之后，或者在您观看视频 在网上，给我你的反馈。
我真的很感激它的任何和所有。
>> 所以我一直有小对话 有很多我的
学生们整个星期 - 因为我的手 回测验，说起
当然，看你怎么做。
和一个主题已经拿出了过来， 在多谈论 - 在
特别是 -
习题集。
我已经封装的主题 在黑板上现在。
>> 从本质上讲，有一个区别 在转弯的东西是间
正确办什么事 做到这一点很好。
大多数人一直在做梦幻 在正确性方面 -
5人或4对所有的pset。
大多数人越来越 这些所有的时间。
>> 然而，仅仅因为你所做的 正确的事情并不意味着你已经
做了一些为优雅，或 有效，或干净的你
可以办到的。
而这正是设计 -
并在较小的程度，风格 -
轴的。
因此，我推你的一切，和其他转录因子 是推动你们，不仅转
的事情是正确的，但把 在编码很好的事情。
>> 如果不这样做不必要的FOR循环， 不重新计算的变量，如果
你不必。
例如，回想问题集 4，放置在砖时
屏幕上，每一行 - 在每一个砖 给定的行具有相同的y坐标 -
相同的高度坐标。
>> 使y坐标也没必要 可以在内部计算内
嵌套的for循环，你可能使用 把屏幕上的砖块。
它仅需要将每一个计算 一次交换一排，或
向下移动一行。
所以说，如果有10个砖头在 行，每一块砖可以有相同的
y坐标，而y坐标 可以只计算
一旦所有这些的。
>> 它并不需要计算10 次，也没有那个必要计算
要发生在实际 函数调用 -
新gracked函数调用。
因此，如果这是一个有点混乱的 你，更一般地，事
并不需要发生的每一次 你经过一个FOR循环不应该
把FOR循环里面，不应该 发生一次你去的时间
通过FOR循环。
>> 我们看到了另一个很好的设计实例 在第3周为15，你可以保持
轨道零。
所以，当你初始化板， 保存 - 在一个全局变量，也许 -
x和y坐标的零点。
然后每当你 -
在您的移动功能，只要您 一个成功的举动，您更新
零的位置。
>> 这将节省您不必做 嵌套的for循环，以期待通过
登上每一次在你的移动功能 并找到了零，或者找瓷砖，
然后检查接下来会发生什么吧。
相反，你必须的位置 零，你可以看上面，下面，
以及它的左侧和右侧，以找到 你要找的瓷砖。
>> 因此，在我们的节目条款 写作，他们是永远不够大
其中一些设计决策 真的要妨碍你
程序，或使其运行速度比较慢， 或者甚至耗尽内存。
但我们仍坚持你们 写的优雅
高效的代码越好。
>> 所以，如果你做的写出来的东西 具有显著较大
范围，它们将被写入具有良好的 设计除了是正确的。
因此，一些有 带了这一点。
这是我们正在寻找的 - 东西我们要继续
按你们的。
>> 如果你有关于任何问题 你的程序设计，可以自由
接触到我，我很高兴 走过你的程序和你在一起，
并指出一些设计 你做，给你一些决定
如何提出建议，甚至 更好的设计决策。
>> 所以，我们要继续前进 要说起测验0。
在我们这样做，是否有人 有任何疑问什么
我已经介绍了这么远吗？
>> [沙沙噪声]
>> JASON HIRSCHHORN：七秒。
确定。
让我们来谈谈测验0位。
大多数时候，你有你的测验0的背上。
如果你不这样做，希望 你还记得它一下。
但是，如果你已经采取测验0，那么你 在还可以使用到PDF在线
样品溶液。
>> 没有任何人有之前的任何问题 我们跳进了一周的有关材料
在测验0的特殊问题 -
为什么答案是它是什么？
是任何人都感到困惑什么？
即使你得到了正确的问题，但 只是希望我解释了一下
更多的，我很高兴现在这样做。
>> 于是我问你们来 要准备好一些
有关测验0的想法。
那么，谁愿意让我们 开始用的问题或
有关测验0个评论？
>> [纸张的沙沙声]
>> JASON HIRSCHHORN：不是每个人都 做完美。
所以我知道（笑）
有有一些问题 关于测验0。
确定。
是。
Ompica。
>> OMPICA：10号。
>> JASON HIRSCHHORN：10号。
其中一个是10号？
>> OMPICA：本 -
>> JASON HIRSCHHORN：我haven't -
>> OMPICA：将包括 -
>> JASON HIRSCHHORN：10号是八 为i - 写八到我？
>> OMPICA：是啊。
>> JASON HIRSCHHORN：确定。
所以另外一个问题，你可以有 问了我我有先见之明？
答案是肯定的。
在测验前一节，我问 你们的代码既英镑和
八到我。
他们都发生在 出现在测验。
所以希望，你付出 注意这一点。
>> 如果你有，那么你将不得不 大概就这两个做得很好。
但八到我，我们实际上并没有代码 在课堂上，但它是，再次，
问的测验。
因此，一对夫妇的事情要 注意编码八到我的时候。
的第一件事，每问题，是 你需要检查字符串
等于空。
>> 一对夫妇的人试图检查以后 在程序中如果s支架我是 -
在这样一个特定的字符 字符串 - 等于空。
但要记住，空本质上是 - 它的好，想到的
null作为一个零指针 - 一个指针到零 -
某处在内存中 你永远无法访问。
>> 所以，如果事情是为n​​ull，则 知道它没有被初始化，
或者有什么也没有。
所以s是一个char明星，S 支架i是一个char。
所以是有意义的比较s到空， 但不发支架I为null。
但是再一次 - 所以这是第一件事情 你应该做的事情 -
检查以确保你真正 有了一个真正的字符串。
>> 接下来，你想去通过 每个字符的字符串。
所以这将是像一个s支架 我举个例子，如果我是你的迭代器。
并采取该字符，然后 得到它的实际价值。
你有它存储为一个char，但 零的ASCII值 -
零的性格 -
实际上不是整数为零。
它的一些其他数字，你可以 查ASCII表中。
>> 这样的一种方式来纠正该 - 可能纠正的最佳方式
这 - 是从它减去 字符值 -
零的一个字符。
所以减去单引号，零， 另一个单引号。
这将需要的任何数字你有 作为一个字符，并得到它等于
数作为实际的整数。
>> 那是非常相似的方法 很多人在发生
问题设置2，与凯撒 和Viginere -
这些密码，当你 被旋转它们。
你拥有了它作为一个从打完 零到9，然后 - 视
它不用在最终的数字 - 你需要乘以
以10的幂。
>> 有些人从后面移动到 前，再乘以个人
以10的幂数。
有些人感动 从前到后 -
等了最高 订单号第一 -
并会拯救那些在 全局计数器变量。
然后通过对每个时间 循环，乘以全球巨头
10计数器变量，使 空间的下一个字符。
>> 所以这是没有一点混乱 我写在黑板上。
但试样溶液 是提供给您。
但是，这些都是大事情 我们所期待的。
另外一个检查，以确保每个 个性确实是一个
零点九，而不是字符之间 其他一些字符，比如一个A，
例如。
>> 这些都是我们所期待的东西 对于这个问题。
这是否回答你的问题？
>> OMPICA：是啊。
>> JASON HIRSCHHORN：确定。
是否有任何其他问题 有关测验0？
怎么样编译？
每个人都编译吧？
号
当时有 -
[笑]
有关的任何问题 编译过程？
哇。
>> [纸张的沙沙声]
>> JASON HIRSCHHORN：是的。
迈克尔。
>> 迈克尔：是7号 - 随机？
>> JASON HIRSCHHORN：号码7。
数字7是得到一个随机整数。
优秀的。
所以你给出一个整数a和 整数b，你想一个随机
a和b之间的整数。
实际上，我们可以这样写一个关于 该板，因为这一个
是一行代码 -
一种方式来做到这一点。
>> 所以我们作为一个给定的DRAND 函数我们可以使用。
又是什么DRAND -
假设它已经播种 -
是什么DRAND返回？
>> MICHAEL：0.0和1.0之间的浮点数。
>> JASON HIRSCHHORN：许多 - 是啊。
一个数字0和1之间。
因此，我们有b和。
然后，我们有我们的随机数 0和1之间赐给我们DRAND。
有些人试图把B或B减 一，什么里面那些
括号内。
这将意味着他们 参数给这个函数。
>> DRAND不带任何参数 - 喜欢做的getString
不带任何参数。
所以它只是开括号，靠近 括号 - 这，本身就是
函数调用。
这给了你一个数字 0和1之间。
当然，我们有一个整体范围 该号码可以是英寸
>> 说，如果b为10和5，我们真的 想用范围为5的数。
因此，我们需要做的下一件事是 由范围B减一乘这一点。
这样假设的成倍增加。
而这将给我们一个数 在给定的范围内。
而这特定范围即 B减一之间的差异。
>> 终于，那将只能从给它 - 说B减一之间的范围
是5，那会给我们一个 数从0到5。
但是，如果实际上5，我们需要提高 这个范围可达到它的
其实应该是，通过增加一个。
从而使得到的逻辑正确。
然后，你会不会有 另一个问题？
>> MICHAEL：号
我只是觉得非常愚蠢的现在。
[笑]
>> JASON HIRSCHHORN：号
不要觉得自己很愚蠢。
许多人挣扎 带着这样的疑问。
然后，其他的问题是，DRAND， 你说，给你一个浮动 -
返回一个浮点数。
但这个功能居然问 对于一个整数返回。
>> 你不需要显式转换本 为整数，因为这些
操作将把它作为一个全 浮动 - 作为一个浮点数。
这样的意志 - 哪怕这 是一个整数，这将
正确地成​​倍增加。
所有的乘法会的工作。
你不需要在这里投。
其实，你不应该投它。
>> 那会 -
如果你想投一个数字 这是介于0和1 -
一个随机数，一个浮点 -
然后它要么是只有0或1，所以 你将失去所有的精度。
但最后，当您返回时， 它会自动获取
发送回为整数。
所以，你不需要做 该铸造自己。
>> 因此，这是答案 这个问题，数字7。
在测验0没有其他问题？
是啊，安妮。
>> 安妮：我们什么时候使用递归 -
当我们使用迭代循环？
>> JASON HIRSCHHORN：你什么时候使用 递归 - 因此更一般地，本
与递归的利弊 迭代方法。
谁能提供一个亲还是一个反面？
请？
没有任何人可以。
谁可以提供一个专业或一个反面？
>> [纸张的沙沙声]
>> 学生1：递归是少 编码 - 少打字？
>> JASON HIRSCHHORN：那么一般， 递归尤其是，函数 -
或者像合并的算法 排序 - 这使它
以递归的方法 -
可能是更直接 编写递归。
而就更有意义 递归地做到这一点。
所以这将是一个亲以递归。
其他人呢？
是吗？
>> 学生2：CON递归 -
它使用更多的内存。
>> JASON HIRSCHHORN：那么完全正确。
递归函数将继续增加 堆栈帧堆栈。
所以，如果你经营了很多的 数字和必须调用此
功能很多，那么你肯定会 占用更多的内存，而
迭代的方法只会把一 堆栈帧堆栈上，因为
这一切在一个函数中发生。
>> 任何其它的优点和缺点？
是啊。
>> 学生3：优点递归。
您不必确定 提前多少次
代码必须被重复。
可以有预定数量的 你必须遍历，那么次
递归是更好的，因为 它需要的结果。
>> JASON HIRSCHHORN：我认为这是真的。
但我认为，在这两种情况下 你永远不会 -
你可能会得到一些 来自用户的输入。
或该功能将有一定的投入 这将确定多少次
应该运行。
所以通常，你不会硬编码 - 即使是在迭代的方法 - 如何
很多次，循环应该运行。
>> 你是否也有另一个你 想着，安妮？
确定。
因此，那些可能是两个 -
最大的亲和最大的 CON到一个递归与
迭代方法。
确定。
什么都在测验0？
>> 让我们继续前进。
文件I / O。有一个绝妙的短 本周在文件I / O有希望
你看过多 时间和钦佩。
大量的工作去成，我也 听说它是出奇的帮助。
我也包括在这张幻灯片的链接， 如果你还没有一个
机会观看它的10倍。
>> 所以，我们要简要地走在 主要步骤来打开和工作
与文件，然后我们将 潜入编码问题之前，
检查问题集。
所以，再一次，我打算把这段话放在 在屏幕上，但我要谈的
只是一个关于什么我们是分钟 与文件在这里做I/O--
这是什么意思？
>> 这意味着，我们可以创建 的程序，然后有我们的节目
退出，并没有作出任何影响 我们的计划之外的世界。
但是，当我们开始对文件进行工作 - 两个读他们和创造
他们 - 我们可以对一些效果 我们的计划外面的世界。
>> 就像如果Microsoft Word中无法 做任何Word文档，然后
一旦微软的Word退出，所有的 工作将消失，并会
真的是无用的。
我们最终希望能够 编写能够影响计划的
他们周围的世界，无论是通过采取在 复杂的输入 - 在文件中的条款，
通过文件，并且还创造有趣 和令人信服的输出 -
在不同类型的文件方面。
>> 所以这就是为什么我们开始 学习如何处理文件。
更具体地，什么 我们做的是如下。
这是非常简单的。
目前只有几个步骤，和 在此列出的这些代码。
因此，我们要经过 这段代码的每一行。
>> 首先，可以看到突出 -
当你正在使用的文件， 不管文件的类型是，
你需要将其打开。
而这是通过调用FOPEN -
就在这里。
您包含文件的名称。
如果文件是不是在你的目录中， 或者所在的文件夹这个程序
生活，那么你还需要包括 一个路径，如该文件是。
>> 我们将假定这 所谓“的text.txt”文件 -
一个简单的文本文件 - 在 同一文件夹作为这个计划是。
所以这是另一回事，以保持在 心态 - 如果你想打开一个文件
在其他地方，你的实际需要 以包括它的位置。
>> 其次，你可以将参数传递给 FOPEN，这就是你想要做什么
与该文件。
有三个主要的论据， 你要传递给fopen。
谁可以给我那三个？
谁可以给我其中之一吗？
是。
>> 学生4：文件名？
>> JASON HIRSCHHORN：对不起。
您可以通过三种主要观点 作为第二个参数给fopen。
你说得对 - 文件名 是第一个参数。
但第二个参数给fopen是 一般三根弦，和 - 是的。
位于Aleja。
>> ALEJA：A可以进行追加。
>> JASON HIRSCHHORN：A，如果你想 追加到已存在的文件。
>> 学生5​​：R读取。
>> JASON HIRSCHHORN：A，如果你 想从一个文件中读取。
>> 学生6：W表示写。
>> JASON HIRSCHHORN：和W，如果你 要写入文件。
因此，在这种情况下，我们正在编写 到文件，所以我们有瓦特
你打开它，你也必须保存 文件的地方，那就是与
代码的左手侧 赋值运算符 -
我创建一个指向文件 叫，在这种情况下，文件。
>> 我们不会担心什么 这全部大写作品就是。
不必多说，它是一个长 零和一的流。
这就是我们如何来 运行它，了解它。
>> 接下来的事情，我们需要做的 - 和 这是非常重要的 -
每当你打开一个文件 -
其实，只要你调用malloc，为 例如，并得到一些内存，并尝试
并将其保存在一个指针，你总是 要检查，以确保该
函数没有返回null。
>> 因此，在这种情况下，我们检查，以 确保我们实际上打开了
文件正确，并且有 在我们的程序没有错误。
接下来，一旦我们检查，以确保 我们有一个工作的文件，我们可以
写入或读出， 或追加到文件。
在这种情况下，我只是简单地打印 一行到该文件。
>> 我怎么知道？
好吧，我使用这个功能 所谓FPRINTF。
所有将要使用的功能 写入或从其中读出或当
操作文件将类似于 你已经看到过，但是功能
先从字母F， 站立文件。
和fprintf，不像我们的正常打印 应用程序，需要一个额外的参数，
那是文件，你 希望此行打印到。
>> 我没有什么要 ohai的右侧。
我没有第三 参数对printf -
或者第二个参数的printf时， 第三个参数fprintf等，因为我
没有在这里任何占位符。
我不包括任何变量。
但同样，和FPRINTF所有这些文件的 与文件操作的函数
通常将需要的文件 上，他们正在运作。
>> 最后，最后重要的事情 做的是关闭该文件，就像
与 - 每当我们用malloc的东西， 我们要释放的东西，免得我们
有内存泄漏 - 我们希望 关闭我们的文件。
如果该程序没有关闭退出 该文件，赔率是不会有事
错了，特别是如果它 是个小巧的文件。
>> 但肯定是良好的编码风格 实践总是闭上你的文件
当你使用它就完蛋了。
所以这是文件的基本I / O。 你可能已经看到过，或
在这梦幻般的短看着它。
没有任何人有任何疑问，前 我们进入一些练习编码
问题，关于文件I / O或 步骤我刚刚去了？
>> [打字声音]
>> JASON HIRSCHHORN：你 有一个问题，AVI？
>> AVI：号
>> JASON HIRSCHHORN：确定。
我打算再等 7秒。
[笑]
这是一个非常好的提示。
你们就是不喜欢 问这问那。
这很好。
确定。
所以，我们的第一个实践的问题是，我们是 要复制的功能
一个命令行工具，你可能 副本 - 前使用 -
复制工具。
如果您键入CP，然后传递两个 参数传递到你的终端，你可以
复制文件。
而这正是我们要 到现在写的。
>> 所以，再一次，读了这张幻灯片中，我倒是 你写一个程序，需要
二，只有两个命令行 论据 -
源文件和目标文件 -
并复制源中的内容 文件复制到目标文件
1字节的时间。
所以这是一个很多要求。
>> 同样，一个好方法，这是对 没有直奔C代码，但
把它分解成几个步骤。
首先，想想逻辑 - 正是 就是我要问你做 -
并了解所有的 步骤对这个问题。
不是在C中，只是在一些伪代码， 或者甚至是心理模型
这是怎么回事。
>> 接下来，一旦你有伪下来， 弄清楚如何的伪代码
地图上的工具和事情，我们已经 学会了在C使用
>> 最后，一​​旦你把所有的 在一起，你可以编写问题。
需要5到10分钟，以 在这个问题上工作。
我把说明书 备份在第二。
然后我们要去投奔 的伪代码，和代码
它生活作为一个群体。
>> 如果您有任何问题，而你 这方面的工作，可以自由地提高
你的手，我会来 周围并回答他们。
>> 学生7：我可以刷卡 一张纸？
>> JASON HIRSCHHORN：这是怎么回事？
>> [打字声音]
>> JASON HIRSCHHORN：确定。
让我们在第一伪代码，和 然后我给你一对夫妇更
分钟完成编码。
>> 谁愿意开始我关闭 与第一线
伪代码这个功能呢？
>> 学生8：检查以确保 给您提供两个文件。
>> JASON HIRSCHHORN：确定。
如果我们不是？
>> 学生8：我将返回0。
>> JASON HIRSCHHORN：我们是否应该返回0？
>> 学生8：返回一个 -
消隐。
抱歉。
>> JASON HIRSCHHORN：是啊。
可能不为0。
因为0表示一切都很好。
确定。
所以这是第一行 的伪代码。
谁拥有伪代码的第二行？
>> 学生9：打开这两个文件？
>> JASON HIRSCHHORN：打开这两个文件。
好不好？
>> 学生10：检查 如果该文件是否为NULL？
>> JASON HIRSCHHORN：检查并 肯定也不是NULL。
顺便说一句 -
斜线0 -
是空？
>> 学生11：第
>> JASON HIRSCHHORN：这是不是NULL。
这就是所谓的NULL结束。
它实际上是拼写只有一个湖
所以，检查针对的东西是 - 这实际上是一个字 -
因此检查针对的东西是 不一样的检查，看它是否
等于NULL。
>> 有的人 -
在他们的测验和他们的问题 套 - 已经得到了
二那些混淆。
但其中的两个是 其实不同。
一个结尾的字符串 -
1是一个指针为0。
>> 学生12：你为什么不检查 确保该文件是不是NULL
你打开它们之前？
>> JASON HIRSCHHORN：所以节省开 一些在该文件中。
如果你去回到这里 -
所以这条线 - FOPEN -
会给你一个地址和存储 在文件中的地址，如果它的工作原理。
如果它不工作，它 将存储NULL -
>> 学生12：哦。
确定。
得了你。
>> JASON HIRSCHHORN：在文件中。
所以，你可以不检查是否为NULL 你打开它们。
NULL表示什么都没有 正常工作。
确定。
因此，检查，以确保两者都不是？
或者是？
我们会怎么想？
我们将一起去了。
>> 学生13：是。
>> JASON HIRSCHHORN：是？
两者都不是？
>> 学生13：是。
>> JASON HIRSCHHORN：确定。
我们似乎有一些 在这种共识。
无论是NULL。
OK，伪代码的下一行。
谁没有给我行了吗？
我们会等你的。
是啊。
>> 学生14：您必须阅读 从第一个文件？
>> JASON HIRSCHHORN：确定。
>> 学生14：或者我们用fscanf和 类似的东西，第一个文件？
>> JASON HIRSCHHORN：因此，我们要 从第一个文件中读取和 -
让我们把这种权利在这里。
读取源文件。
然后，就在我们我们做什么 从源文件中读取？
别人？
>> 学生15：写入到 目标文件？
>> JASON HIRSCHHORN：我们写 目标文件，以及 -
确定。
是我们缺少什么？
其他人谁没有给我一个 代码行了 - 伪代码。
是啊。
>> 学生16：也许你可以随时查询 是否有东西可以读，
就像下一行？
这就像下一行， 看它是否存在。
>> [电子提示音]
>> JASON HIRSCHHORN：哎呀。
这是我的日记软件。
是吗？
>> 学生16：是啊。
>> JASON HIRSCHHORN：所以给 它给我更多的时间。
>> 学生16：检查是否有 从静止的下一行
源文件中读取。
>> JASON HIRSCHHORN：确定。
因此，我们不读线 - 这里被读取字节 -
但你是正确的。
我们要读取和写入，直到 有没有更多的字节。
确定。
等等这些真正应该缩进 有点，因为他们在那里。
对不对？
直到我们出的字节，我们要 从源文件读取和写入
到目标文件。
>> 然后，什么是最后的 伪代码的行？
谁不给谁的 我的东西呢。
>> 学生17：关闭文件？
>> JASON HIRSCHHORN：没错。
关闭文件。
所以这是我们的伪代码。
我打算把伪代码为 gedit的，并在一两分钟我们
将共同编写的。
>> 确定。
让我们开始为一组。
NISHANT，我有我的新文件。
我刚刚开了这家了。
无标题文档1。
什么是我应该做的第一件事？
>> NISHANT：包括库？
>> JASON HIRSCHHORN：确定。
哪些图书馆？
>> NISHANT：stdio.h中，stdlib.h中，我相信？
>> JASON HIRSCHHORN：确定。
什么是stdlib的呢？
>> NISHANT：我忘了。
>> JASON HIRSCHHORN：确定。
因此，包括标准输入输出。
我应该怎么做，甚至在 我开始编码？
>> NISHANT：写一个头？
>> JASON HIRSCHHORN：如何 我把它上色？
>> [插VOICES]
>> NISHANT：你怎么得到它的颜色？
>> JASON HIRSCHHORN：如何 我的颜色编码？
>> NISHANT：我不知道。
呵呵。
保存。
>> JASON HIRSCHHORN：保存。
是。
我应该将其保存为。角
因此，将它保存在桌面的cp.c.上
甜蜜。
如果我想要得到完整的风格 点，我应该怎么
包括在顶部？
>> NISHANT：你可以写你的名字，名字 该程序，并且该目的的
方案呢？
>> JASON HIRSCHHORN：看起来不错。
优秀的。
所以，你已经开始了我们完美的。
＃包括 -
我们也写 -
确定。
所以，我想我所有的设置去。
谁拥有的第一行代码对我来说 - 或代码的第一行是
这将需要满足我们的第一个 在伪代码有何评论？
您。
>> 学生18：难道不应该是int ARGC，然后字符* argv的？
>> JASON HIRSCHHORN：我觉得 你说得对。
让我们来改变它为int主，开括号， 整型的argc，逗号，字符* argv的？
喜欢吗？
>> 学生18：括号。
>> JASON HIRSCHHORN：括号。
打开支架，接近支架， 接近父母。
完美的。
现在，我可以带命令行参数。
确定。
确保我们给出两个文件。
你可以给我说，好。
>> 学生18：如果ARGC -
这其中不等于3。
>> JASON HIRSCHHORN：如果开括号 的argc不等于3？
>> 学生18：是啊，你回 1或任何东西。
>> JASON HIRSCHHORN：对不起。
>> 学生18：返回1或任​​何东西。
>> JASON HIRSCHHORN：返回1。
好不好？
大。
打开这两个文件。
谁可以帮我打开这两个文件？
谁没有给我的代码吗？
库尔特？
>> KURT：所以全部大写F-Ⅰ-L-E星源。
>> JASON HIRSCHHORN：我要去 取出元音。
这些都是很酷的。
这就像QQ空间分享。
>> 学生18：等于FOPEN -
>> JASON HIRSCHHORN：等于FOPEN？
>> 学生18：开括号， argv的，开放的支架。
>> JASON HIRSCHHORN：等待。
抱歉。
开括号。
确定。
>> 学生18：是啊。
ARGV子1。
>> JASON HIRSCHHORN：子1？
>> 学生18：是啊。
argv的开放式支架1 -
是。
然后逗号，然后开双 报价河，双引号，
接近括号，分号。
>> JASON HIRSCHHORN：甜。
又是怎么回事另外一个？
>> 学生18：十分相似，而是 S-R-C中，你会称之为D-S-T。
>> JASON HIRSCHHORN：哦哦！
我喜欢这样。
>> 学生18：只要D-S-T。是啊。
然后的argv，打开支架，2。
是啊。
然后瓦特，而不是河
是啊。
>> JASON HIRSCHHORN：太好了。
接下来几行。
另外，如果有人有事情要添加到 我们所做的线条，随意
添加这些为好。
检查以确保既不为NULL。
谁可以给我我需要的代码 满足该行伪代码的？
弓箭手。
>> ARCHER：如果SRC等于等于 NULL或DST等于等于
NULL，则返回 -
>> JASON HIRSCHHORN：什么？
>> ARCHER：返回2？
>> JASON HIRSCHHORN：返回2。
所以，如果开括号的src等于 等于NULL，或者 -
不管这thing's - 管？
管？
我们会打电话给它管。
管材，管件，DST等于等于 NULL，则返回2。
好不好？
直到我们出的字节 -
我们有点跳过此步骤 伪代码部分将在这里。
>> 但是，直到我们出的字节 - 这是什么样的声音？
什么C的结构类型 -
但我不使用这个词的结构， 因为我们要开始使用
在其他情况下 -
但C刀这听起来像不像？
>> 学生19：一个循环。
>> JASON HIRSCHHORN：一个循环。
听起来像是一个循环。
那么，谁可以给我的第一行 的循环代码就在这里？
您也可以选择什么样的 循环你想，如果你给我
这行代码。
有三种。
你来挑。
我会建议其中之一。
阿维。
哪一个你想要什么？
>> AVI：FOR。
>> JASON HIRSCHHORN：FOR。
>> AVI：INT I等于零。
>> JASON HIRSCHHORN：确定。
>> AVI：这部分我不知道。
但i小于大小 星源？
我不知道这一点。
>> JASON HIRSCHHORN：确定。
>> AVI：因为你想要的 一个文件的大小，对不对？
>> JASON HIRSCHHORN：那么这可能不会 给我们的实际大小
文件中的字节。
所以，我们还有什么可以做？
这是另一种类型的循环？
还是应该坚持使用FOR循环？
>> 学生20：你能不能做一个WHILE循环？
然后，你会做的是you'd -
因为我们有一个char *的文件。
所以，如果我们只是一味的递增 直到我们会发现在NULL字符
它的结束？
或者没有，是不是文件如何工作的？
>> JASON HIRSCHHORN：所以我们可以保持 递增的char *
直到我们找到空 -
>> 学生20：从本质上继续前进 逐字符，直到我们打
该文件的末尾。
>> JASON HIRSCHHORN：是的。
所以，这就是我们想要做的。
我们要坚持读书，性格 由字符，直到我们得到
该文件的末尾。
>> 学生20：是啊。
发现 -
什么是结束或停止的迹象 在一个文本文件的末尾。
>> JASON HIRSCHHORN：确定。
所以，当我们到达文件的末尾 - 我们怎么知道我们已经达到
一个文件的末尾？
如果我打电话 -
所以让我们退一步。
什么是函数？
让我们去这条线就在这里。
读取源文件。
谁可以给我那行代码？
>> 学生21：的fscanf？
>> JASON HIRSCHHORN：的fscanf。
确定。
如果我想读什么，很 具体而言，1字节？
>> 学生21：我不知道。
>> JASON HIRSCHHORN：确定。
甚至比的fscanf简单 - 什么是 -
我想从一个源文件中读取？
读取源文件。
什么是函数 - 是啊。
>> 学生22：这是用fread？
>> JASON HIRSCHHORN：FREAD。
我认为让我们坚持使用 那一个现在。
什么样的参数 并用fread走？
>> 学生22：可能的文件类型， 然后在文件中的位置？
>> JASON HIRSCHHORN：我可以在这里输入 要弄清楚什么类型的参数
FREAD需要？
>> 多名学生：人的fread。
>> JASON HIRSCHHORN：男性 fread和fwrite的。
看起来他们一起挂出。
所以用fread需要多少个参数？
>> 学生23：四。
>> JASON HIRSCHHORN：这需要 四个参数。
它需要一个指针，一个大小，而 的事情，这是奇怪的，和一些文件。
好不好？
让我们看一下这里。
“函数fread显示为N MEMB 数据元素，每个元素的字节大小
长，从流指向 流，将它们存储在该位置
通过指针发出。“
>> 所以四个参数。
为什么不让我只是复制这个， ，并将其粘贴在这里。
确定。
那么，谁可以开始填写 这些论点对我？
阿维。
>> AVI：取出无效。
把刚刚SRC。
取出指针和明星。
把src中。
然后 -
>> JASON HIRSCHHORN：所以我打算停止 你在那里，因为这是不正确。
你说得对与SRC，但是 应该在哪里SRC去了？
>> [插VOICES]
>> JASON HIRSCHHORN：应该 走在这里。
这就是SRC - 我们的src是一个类型。
让我们来看看这里。
这要求一个类型FILE *，我们 其实平时看到他们这样。
因此，这是要求的参数 类型的文件名为*流为src。
好不好？
>> 事情做大小 我们要读？
我在给你这 问题说明。
>> 学生24：一次一个字节。
>> JASON HIRSCHHORN：一个字节。
多大是一个字节？
它的大小是以字节为单位，还等什么 我可以把在那里？
>> 学生25：一。
>> JASON HIRSCHHORN：一。
右。
它的大小是在单位字节， 所以1是1个字节。
有多少我想读的时间。
>> 学生26：一？
>> JASON HIRSCHHORN：一件事。
我想读的大小一件事 1，一咬的时间。
和我在哪里把它，一旦我读它？
>> 学生27：目的地？
>> JASON HIRSCHHORN：所以我不能把 它直接进入目的地。
>> 学生28：你会放 它到第三指针？
>> 学生27：到了目的地。
>> JASON HIRSCHHORN：确定。
是啊。
>> 学生29：你可以声明某事 作为一个临时存储较早。
>> JASON HIRSCHHORN：确定。
给我说。
>> 学生29：另一个文件 指针，也许？
>> JASON HIRSCHHORN：确定。
因此，这是无效的明星 -
它是一个void类型的明星，所以也没有 必须是一个文件指针。
如果我在读一个字节， 那里将是一个不错的地方
存储一个字节？
>> 学生29：一个数组？
>> JASON HIRSCHHORN：一个数组。
确定。
还有什么是值得的 确切大小一个字节？
>> 学生30：一个char *？
>> 学生29：是啊。
>> JASON HIRSCHHORN：一个char * 不是一个字节。
>> 学生29：一个字符。
>> JASON HIRSCHHORN：一个char是一个字节。
对不对？
因此，让我们称这个缓冲区是一个通用的 名称用于这些东西存储
一些暂时的。
所以我创建了一个缓冲区。
对不对？
但它确实需要一个void *。
因此，也许你是对的，它 应该是大小为0的缓冲区。
因此，它存储一个 -
右。
>> 因为在这里权利 - 炭 缓冲器是一个字符，但
这需要一个void * -
一个指针。
所以我可以做到这一点，现在 缓冲器是一个指针。
我还能做什么？
>> 学生31：把为char未来的明星。
>> JASON HIRSCHHORN：我可以 创建它的char *。
确定。
什么是另一回事，我能怎么办？
还是让我们一起去这一个。
字符*缓冲区，所以什么 我摆在这里？
>> 学生31：缓冲区。
>> JASON HIRSCHHORN：缓冲区。
缓冲区是一个指针，指向一个char。
并在该位置，我们把 的东西，我们已经读取一个字节。
是啊。
阿维。
>> AVI：只是一个快速的问题。
你想用malloc缓冲？
>> JASON HIRSCHHORN：谁能 回答这个问题？
>> 学生32：嗯，它并不真正的 点任何东西的权利，所以 -
>> JASON HIRSCHHORN：但是做 我们想用malloc呢？
>> 学生32：如果你是这样做的 这样，我想，是啊，因为你需要
一些地方为它指向。
>> JASON HIRSCHHORN：我们 必须用malloc呢？
>> 学生33：如果你要 使用它的环的外侧。
>> JASON HIRSCHHORN：我们是否要 使用它的循环之外？
>> 学生34：是的。
>> 学生35：等待。
难道我们要声明它 在环路以外？
>> JASON HIRSCHHORN：所以我想我们有 在这里，我们是一些伪WHILE循环
想弄清楚，那 我们还没有得到到呢。
我们不需要将malloc它。
我们的主要工作时，它一定会 要使用这个循环中。
它不需要存在 超出此。
>> 因此，它可以是一个局部变量。
你有一个指针 一个局部变量。
>> 学生36：但它不是 指向任何东西。
>> JASON HIRSCHHORN：不，这不是 初始化为任何东西。
但我们不打算使用它也。
我们要装上去 这是我们第一次使用它。
所以，似乎确定。
所以我们这里不需要的malloc。
我认为这是确定不变。
确定。
我们是fread线。
让我们做的下一行。
>> 如果我们要写入一个文件，什么是 一个很好的函数用来做呢？
>> 学生37：fwrite的？
>> 学生38：FPRINTF？
>> JASON HIRSCHHORN：是FPRINTF之一。
有什么其它的吗？
>> 学生39：fwrite的。
>> JASON HIRSCHHORN：fwrite的。
而对于我们来说，fwrite的， 我们在这里看到的，是
可能是更好的选择。
它有四个参数为好。
NISHANT，你可以给 我的论点？
>> NISHANT：第一个是怎么回事 是公正的缓冲区。
>> JASON HIRSCHHORN：确定。
>> NISHANT：第二个的 只是要1。
第三个将是1。
而第四个将是DST。
>> JASON HIRSCHHORN：没有任何人有 关于该行的任何问题吗？
这看起来不错。
确定。
所以，现在它看起来像一件事情我们 失踪 - 其实，让我们写
这最后一道防线。
关闭文件。
谁可以完成了我们的写作 这最后的两行？
是。
对不起，你叫什么名字？
>> 露西：露西。
>> JASON HIRSCHHORN：露西。
>> 露西：FCLOSE src和再 FCLOSE目的地。
>> JASON HIRSCHHORN：FCLOSE，开括号， SRC，关闭括号，分号。
和FCLOSE -
是吗？
>> 露西：开括号，DST 然后分号。
>> JASON HIRSCHHORN：太好了。
而且我应该在年底包括哪些内容？
>> 露西：返回0。
>> JASON HIRSCHHORN：返回0。
难道我有什么打算？
只是一个问题。
是否一定要包括返回0？
>> 多名学生：号
>> JASON HIRSCHHORN：号
主要的自动完成 如果你到达终点。
但我认为这是很好的 包括它明确。
特别是当我们返回其他 整个事情的程序。
确定。
这是我们错过了什么 -
WHILE什么？
谁又能想到一些 -
有一些感觉是什么东西 能去那里？
即使它只是在一些伪代码 喜欢的语言？
>> 什么是我们真正 - 什么 我们想要去，直到？
是啊，露西。
>> 露西：文件的末尾。
>> JASON HIRSCHHORN：文件的末尾。
所以，你是什么文件到底意味着什么？
>> 露西：一旦你到达 该文件的末尾，停下来。
>> JASON HIRSCHHORN：确定。
所以一旦我们到达文件的末尾。
我们怎么知道什么时候我们已经达到 该文件的末尾？
>> 学生40：我认为缓冲区 将被设置为NULL。
>> 学生41：缓冲区声明 内循环。
>> JASON HIRSCHHORN：所以你认为 缓冲区将被设置为NULL。
为什么缓冲区设置为NULL？
>> 学生40：因为当你 用fread，你试图把
什么到缓冲区。
>> JASON HIRSCHHORN：确定。
所以，你在想用fread -
当我们已经达到的结束 文件，什么是用fread怎么办呢？
我认为这是问题 我们必须弄清楚。
什么是FREAD办？
它把空的缓冲区，或 它做别的吗？
我们怎样才能弄清楚它？
>> 学生42：人。
>> JASON HIRSCHHORN：人。
所以，让我们来看看在这里。
返回值。
如果成功，fread和fwrite的返回 读出或写入的项目数。
这个数目等于字节数 转让只有当大小为1。
如果发生错误，或者在该端 到达文件，返回值是一个
短期项目数或0。
>> 所以对于我们来说，如果用fread河段 该文件的末尾，以及从读出
文件末尾，什么都不剩 阅读，什么是它要回来吗？
>> 学生43：零？
>> JASON HIRSCHHORN：什么？
>> 学生43：零？
>> JASON HIRSCHHORN：零。
它会返回零。
所以我们知道，用fread，当我们已经 到达文件的结尾，会
返回零。
我们怎样才能用它来我们的优势在哪里？
>> AVI：你可以在外面声明一个变量 所谓单向循环。
如果检查等于 -
现在 - 之一。
>> JASON HIRSCHHORN：确定。
>> AVI：然后你可以把一个IF 之后用fread说，如果声明
用fread等于零 -
没有。
>> JASON HIRSCHHORN：谁 可以帮助阿维出来？
>> AVI：什么是价值 通过用fread返回？
>> JASON HIRSCHHORN：我们只是 走过去的。
>> AVI：你怎么表示呢？
>> JASON HIRSCHHORN：所以它返回 - 让我们 期待在这里 - 它返回一个
为size_t，它实质上是 的整数。
因此，它返回一个整数。
而在我们的例子中，它会 返回1或0 -
1，如果它读一件事 - 一个字节， 和0，如果我们已经走到了尽头。
所以，如果用fread -
是吗？
>> 学生45：你不能只是把全 用fread（缓冲液，1，1，SRC）进
while循环？
>> JASON HIRSCHHORN：所以你建议 这样做有进入这个？
>> [插VOICES]
>> JASON HIRSCHHORN：等一下。
因此，我们摆脱这一点。
所以你建议把 用fread到那里？
我们应该怎么也动 如果你想这样做？
>> 学生45：缓冲区以外。
>> JASON HIRSCHHORN：我们应该 也可以移动这个在这里。
>> 学生45：但这是否不断 向前移动？
>> [插VOICES]
>> JASON HIRSCHHORN：确定。
因此，这是Okshar建议。
我们创建缓冲区。
我们WHILE的fread，那么我们fwrite的。
对此怎么看？
>> 学生46：我唯一的问题是，会 它实际上执行命令的fread？
>> JASON HIRSCHHORN：大问题。
当你把一个函数调用 的条件里面，这是否
函数调用执行？
我们以前见过这样的例子。
对不对？
>> 学生46：确定。
是啊。
所以它确实执行。
>> JASON HIRSCHHORN：我们已经看到的东西 像之前，我们有一个
的条件里面的函数调用。
这是否函数调用执行？
是。
因此，答案是肯定的。
此函数调用将被执行。
但同样，这是我们想要的吗？
>> 什么是我们可以计算的一种方法 它是否是我们想要的吗？
>> 多名学生：运行呢？
>> JASON HIRSCHHORN：我们可以运行它。
但在此之前，我们做到这一点，我们可以 也有理由通过这一点。
如果 -
说我们有一个字节我们 文件中，我们会得到在这里，
我们会得到这个代码。
这将运行。
用fread将返回一个字节， 将其存储在缓冲器中。
这将评估为1， 右，后，他返回1。
>> 因此，尽管1。
这是否意味着里面的代码 WHILE循环将执行？
>> 学生47：是啊。
这是真的。
>> JASON HIRSCHHORN：是的。
图1是真实的。
这不是0。
所以，在这里里面的代码将被执行。
因此，我们将编写一个。
我们将回迁到这个 行一次。
现在，我们有 -
我们是在我们的文件的末尾。
我们从文件末尾读， 因为我们只有一个字节在里面。
>> 用fread返回0，门店 东西在缓冲区中。
老实说，我不知道是什么 它存储在缓冲区中。
我们也许可以仰望 来看看它做什么。
我真的不知道。
我们不知道，谁在乎什么 它在缓冲存储？
但它确实返回0。
并同时0执行？
>> WHILE 0将不会执行。
所以后来我们就搬到这里了。
因此，让我们一举手，如果这 是我们应该运行，或者如果我们的代码
首先应该做的改变。
所以，如果你想 - 你必须投票。
如果您认为我们应该运行这个代码 原样，请举手。
>> 确定。
还有一个 -
你有一个问题，关注？
是啊。
>> 学生48：当我们移动缓冲区 在循环之外，我们做
必须用malloc呢？
>> JASON HIRSCHHORN：大问题。
当我们移动的外部缓冲 循环，我们必须用malloc呢？
这是一个范围的问题。
如果我们初始化缓冲区外 这个循环的，将它存在
内循环的？
>> 多名学生：是的。
>> JASON HIRSCHHORN：是的。
其范围涵盖了循环内， 和，真的，里面的东西在它下面
这个代码，包括中 这里里面的东西。
所以我们并不需要用malloc它。
这是一个局部变量，其范围 还包括循环。
>> 学生49：我们是否需要释放呢？
>> JASON HIRSCHHORN：我们 需要空闲缓冲区？
>> 学生49：是的，如果我们不这样做的malloc。
>> JASON HIRSCHHORN：我们 需要空闲缓冲区？
我们不知道。
再次，这是一个局部变量， 所以我们并不需要释放它。
确定。
让我们看看会发生什么。
因此，它是未初始化的。
那是什么东西， 马库斯较早前建议。
因此，我们有这个错误，变量缓冲区 这里使用的时候被初始化。
>> 怎样才能解决这个问题？
>> 学生5​​0：malloc的呢？
>> 学生5​​1：等于null？
>> 学生5​​2：假设缓冲区的值等于NULL。
>> JASON HIRSCHHORN：确定。
看起来不错。
我们现在拥有它。
让我们创建一些尝试复制。
因此，我们有我们的文本文件。
我们怎样才能运行这个程序？
是啊。
>> 学生5​​3：你可以做点 斜线CP，test.txt的。
然后你就可以指定任何其他文件 它会存储到。
>> JASON HIRSCHHORN：确定。
我们叫它out.txt的。
酷？
赛格故障。
思考的赛格故障？
这是伟大的。
我们怎样才能找出 赛格故障？
什么？
>> 学生5​​4：GDB。
>> JASON HIRSCHHORN：GDB。
我们运行gdb的写点gdb的斜线， 我们的程序的名称。
没有命令行参数那里。
我们将设置一个 断点为主。
如果我想启动gdb，我该怎么办？
>> 学生5​​5：R。
>> JASON HIRSCHHORN：R.然后呢？
>> 学生5​​5：该参数呢？
>> JASON HIRSCHHORN：然后， 命令行参数。
让我们通过。
N的只是把我一行一行。
我会去，直到 我让我的赛格故障。
还有我的赛格故障。
它看起来像用fread引起 我的赛格故障。
我知道用fread引起我的赛格故障， 因为这是
行，我们只是执行。
>> 而那是唯一 发生在该行 -
两件事情都发生了。
FREAD要去，然后我们 做一些检查时。
我敢打赌，在WHILE 检查并没有引起我的赛格故障。
最有可能的，是FREAD 造成我的赛格故障。
我也看到一些东西在这里，存储器复制。
>> 内存拷贝。
听起来像移动存储 一个位置移动到另一个。
听起来似乎会发生 在用fread，也许有些记忆
从这里搬到这里。
让我们通过这一次。
我如何在启动它 并再次运行它？
是啊。
>> 学生5​​6：你需要把 缓冲区之前的符号？
>> JASON HIRSCHHORN：所以在与符号 缓冲会给我的地址
缓冲，这是一个char *。
让我们通过这一次运行。
我如何通过它运行一次吗？
>> 学生5​​7：你能刚 再键入run？
>> JASON HIRSCHHORN：只需再次键入运行。
因此，我们不打算 执行这条线。
因此，缓冲区是一个NULL指针。
正确吗？
它指向 - 让我们来看看。
如果我们有我们 -
画出这是一个快速的画面。
大家可以看看 我写在这里？
>> 因此堆栈中，我们有一个本地 变量，它被称为缓冲液，并
它是一个指针，指向一个char。
什么地址是这个字符的？
>> 学生5​​8：0X0。
>> JASON HIRSCHHORN：对。
那这是什么。
在这里，内部缓冲区，存储0X0。
这就是我们所拥有的 - 的 安装我们现在所拥有的。
所以这条线，用fread，把东西 从源代码在哪里？
这个框或此框？
这盒？
左框或右边的框中？
这项权利箱。
>> 它遵循的指针， 并把它放在这里。
当我们在尝试和触摸记忆 位置0，我们得到什么？
分段错误。
这就是我们现在所拥有的错误。
是啊。
>> 学生5​​9：你不是有 把明星缓冲？
还是没有？
对于FREAD？
>> JASON HIRSCHHORN：所以用fread 需要一个指针。
因此它在缓冲传递。
然后它会去参考 它里面的某个地方的fread。
但是再一次，我们看到，它需要一个指针。
我们并不需要把它star缓冲。
这将是路过 它无论是在这里。
而这将可能给我们一个错误 因为我们去引用它。
>> 对不对？
当我们去引用这个指针，当 我们试图访问这个位置，
我们得到一个错误 - 我们的分段错误。
所以 -
哎呀。
我们要退出了GDB的。
我们的产品线 -
我们的问题 - 是正确的 这里在这条线。
这是一个问题，因为 的这一行。
>> 我们怎样才能创建一个框， 访问中的fread。
对不对？
我们需要创建一个框的One 字节大，一个char的大小。
但是，我们需要这个盒子是可访问 当这个函数执行。
那么， -
是的。
任何想法？
>> 学生60：只需将其设置为 任何随机字符。
只是做字符缓冲区的equals 的字符。
然后，当你已经缓冲那里 -
>> JASON HIRSCHHORN：等待。
字符缓冲区？
因此，没有明星？
>> 学生60：是啊。
取出的明星。
等于一个随机字符。
>> JASON HIRSCHHORN：确定。
所以给我一个。
>> 学生60：像什么的。
然后当你有缓冲 在那里，你用 -
>> 学生61：星？
哦，不，连字符。
>> 学生60：使用符号。
>> JASON HIRSCHHORN：确定。
和什么有关fwrite的？
>> 学生60：再次使用该符号。
>> JASON HIRSCHHORN：好吧。
所以，你的想法是，我们创建了一个char和 装上去，然后
写入该字符。
>> 学生60：是啊。
>> JASON HIRSCHHORN：什么 人们认为呢？
>> 学生62：这是令人费解。
>> JASON HIRSCHHORN：确定。
让我们把它画出来。
所以这一次，我要在此画 红色栈这里，然后我们
将有 -
哦！
抱歉。
所以这个时候，我们有一些所谓 缓冲器，它是在栈上。
正确吗？
而我们在保存它，最初。
>> 然后，我们有我们要的fread调用。
它是需要一个字节从什么用fread 我们的文件，并把它的地方。
它把它在无论 事情的指向。
好了，我们有这个地址之前 -
0X0。
现在，我们有什么地址？
>> 学生63：无论 地址缓冲区。
>> JASON HIRSCHHORN：无论 地址缓冲区。
它可能会是 类似的东西。
可能将开始与b和 一个f，然后让其他六个
十六进制数字。
没关系。
一些地址。
我们正在通过该地址英寸
>> 我们打​​算把我们的单 字节的东西在那个地址。
因此，我们打算把我们的单 字节里面的东西在这里。
然后我们要去从写 什么是内部过这里。
没有任何人有任何疑问， 有关？
谁认为这代码将工作？
>> 举起你的手，如果你认为 这段代码将正常工作。
你必须采取的立场。
和谁认为这代码将无法正常工作？
举起你的手。
其他人都应该 提高他们的手。
确定。
迈克尔，你在哪里站着？
>> 迈克尔：我不能决定。
样的在中间。
>> JASON HIRSCHHORN：你 在中间。
挑一。
>> 迈克尔：我有信心 并说，它会奏效。
>> JASON HIRSCHHORN：确定。
你有信心，说出来的作品？
发生了什么事？
>> [插VOICES]
>> JASON HIRSCHHORN：无赛格故障。
我们怎样才能检查，看看是否 两件事情都是平等的？
两个文件都是平等的。
>> 学生64：没有变化。
>> JASON HIRSCHHORN：没有变化。
的diff检查之间的差异 两个文件，​​并且如果它返回
什么都没有，他们是一致的。
如果我们打开了，我们得到的文件。
所以这是正确的解决方案。
让我们来回顾一下它一次。
事实上，我们甚至没有 需要对它进行初始化。
>> 它可能看起来有点 清洁剂，如果你没有把
随机的东西在里面。
问题的关键是，你需要创建 一些空间来存放东西从
fread和拿东西 fwrite的出来的。
而这件事必须是本地 变量在堆栈上 - 你
可能已经malloc'd一些空间。
>> 所以，我们其实可以有 这里写的malloc和
这将有工作。
然后我们会一直存储 我们的东西在某处堆上。
但其实这是，也许， 最优雅的解决方案。
只是在栈上创建一些空间 为这些事情去了。
>> 我有两个其他意见。
如果你要轮流在这一点， 然后得到得分在此，我的意见
将如下所示。
这些1在这里，对我来说，看 像幻数。
这个1的方法，用fread而言， 有道理。
这是事物的数量 要读取或写入。
>> 但是这一次在这里应 也许是别的东西。
那么，什么是一个解决方案？
>> 学生65：字节大小。
>> JASON HIRSCHHORN：像这样？
>> 学生65：字符的大小。
>> JASON HIRSCHHORN：字符的大小。
是啊，字节是不是一个类型。
所以，大小字符的作品。
我们可以有，在顶部 我们的代码，＃定义。
叫什么BYTE和 这真是一个字符。
其实，一个更好的办法 可能是这一点 -
UINT。
任何人都知道是什么吗？
>> 抱歉。
我弄错了。
等待，没有。
哪一种方式它走？
任何人都知道是什么吗？
是啊。
>> 学生67：应该帮助规范 跨系统的东西，
有 - 像无符号整数 有8个字节？
>> JASON HIRSCHHORN：这是 完全正确。
在不同的机器， 一个char的大小 -
通常不是一个字符。
chars通常是一个字节。
但其他数据类型的大小是 在32位机器上不同大小
对一个64位的机器。
一个uint8_t有始终是8位 -
总是一个字节。
>> 我需要包括 标准整型的头文件。
所以，现在，这将有可能被 写这段代码的最佳方式。
所以我摆脱幻数。
而且我也有一个更符合逻辑 键入缓冲区。
这不是一个简单的字符，它是一个字节， 这正是我们所期望的那样。
>> 而在这里，我们实际上已经 一直有点更强大。
我们不认为它是一个字符，而 -
也许，谁知道 - 可能是一个不同的 大小不同的机器上。
实际上我们说这正是 一个字节，总是，不管是什么。
如果我们看看在这里，我们做CP。
嗯，哦。
发生了什么事？
>> 学生68：它可能被切换。
>> JASON HIRSCHHORN：什么？
>> 学生69：是吗？
>> 学生70：你没有 把它定义为一个类型。
>> 学生71：但应 在标准中定义。
>> 学生72：这是怎么回事？
>> 学生73：应该定义为是全部大写？
>> JASON HIRSCHHORN：所以它不是＃定义。
实际上，在这种情况下，我 要使用typedef。
因为我们使用它作为 一种类型在一个位置。
因此，在这种情况下，我们实际上要 的typedef像我们印刷的新型
字节，并且它实质上是这样。
这是一个有点不同的比＃定义。
>> 而现在，我们的代码完美的作品。
所以，再一次，＃定义需要的东西， 无处不在取代它
与其他的事情。
这只是一个宏观 -
速记摆脱幻数。
但在这种情况下，因为我们 使用它作为一个类型 -
就在这里 -
为了实现这一工作，我们需要 于typedef任何字节。
>> 而我们定义它在这里。
这不是一个结构，它实际上 只是一个无符号整数。
这是一个字节长。
此代码将在网上和 你们都应该有它现在。
>> 因此，我们有 -
完美 -
13分钟向左走 在问题设置5。
我想通过copy.c一起走， 然后我们将简单地谈一谈
关于其他部分 问题的设置。
因此，让我拉起来copy.c.
和很酷的事情是，我们实际上已经 已经写了很多这样的代码。
>> 我们从字面上写的代码只是 来到离开这里时，我是
我自己写的。
但是，这是copy.c，形成了基础 对于前两部分
这个问题对于whodunit.c，设置哪些 你需要写，和resize.c。
Recover.c，这是第三个和最后 问题集的一部分，是不是
根据关闭这个文件的。
>> 你将需要编写一个文件， 我们给你一个模板
文件中，但它没有任何 做copy.c.
但是因为copy.c是基础 前两部分中，我们将
通过它走了，所以你必须 一个良好的感觉是做什么的。
>> 和意见给予一定的它拿走。
我们已经写了一些了这一点。
首先，我们要确保 我们得到三个参数。
下一步，我们记住的文件名。
所以我们跳过这一步时， 我们编码我们的事 -
当我们的CP。
但在这里，他们正在做 它有点清洁。
>> 他们正在检查，以确保 这两个文件都不错，在
除了打开它们。
我们写这些代码只是现在，所以我 不会纠缠于这些代码。
接下来是一些东西，那是专门针对 文件中我们使用的类型而
是位图文件。
位图文件有一些元数据 与它们相关联。
>> 因此，第一个字节计 告诉你有关文件。
他们不是的颜色 像素中的图像。
他们告诉你有关文件。
而如果你通过问题集阅读， 你将有更多的信息
什么类型的元数据结构 所包含的位图。
>> 但是，这就是为什么我们有这个第一 设置 - 该代码就在这里。
我们正在阅读的元数据 -
两件元数据 - 文件 头和信息头。
我们正在检查它的某些部分 确保它是一个真正的位图文件
然后再继续。
>> 再次，这些都是细节，我们 现在不需要进入。
如果你通过问题集阅读， 你就会理解这些。
长话短说，这些都只是说， 这是一个位图文件，并
确认。
>> 接下来，我们正在写那些 到了文件中。
我们看到，在这里。
我们正在编写到了指针。
下一步，我们确定填充。
所以，再一次，为的是与特殊性 一个位图文件，一些线路包括
填充底。
而如果你通过问题集阅读， 您将了解更多有关填充。
这是式找到填充。
>> 重要的是要记住 -
当你改变一个位图的大小 文件，填充改变。
当你改变的大小 文件，填充改变。
它永远不会是 大于3 -
这将是0到3，包容性。
但是，当你改变的大小 东西，填充改变。
>> 如果我只有一个像素在该行，我 需要三个填充字节，因为
每一行必须是四的倍数 在一个位图文件字节长。
但是，如果我加倍，从一个像素去 其中每两个像素，
让我们说，是一个字节，那么我需要 两个字节填充，使
即等于4。
>> 所以，当我改变的东西的大小， 我需要改变的金额
填充我有。
这是否有意义给大家？
接下来，我们遍历每一行， 或通过所有行。
然后我们通过遍历 每行中的每个列。
我们对待这个点阵图样 一个网格，就像我们对待
董事会15。
>> 就像我们对待砖时 我们印在屏幕上。
行和列的网格。
那么 - 我们看到了这一点。
实际上，我们只是编码的。
我们创造了一些临时存储。
我们读到在那里，然后 我们写出来。
这正是我们只是做了。
>> 接下来，因为我说的每一行 结束在一些填充，我们
跳过该填充 -
旧的填充。
然后我们重新添加。
在这种情况下，我们要创建 完全相同的文件。
我们只是复制它。
所以，这条线是有点傻。
我们可以从字面上只是 把填充英寸
>> 但是，如果你改变了文件的大小， 你还想要这条线？
因此，如果我们改变一个文件的大小， 我们仍想跳过
在旧的填充？
>> 学生74：是的。
>> JASON HIRSCHHORN：所以我们做的。
正因为如此，同样，优惠 与源文件。
我们不关心填充 从源文件。
我们想要去到下一行。
但是，我们不能简单地把背 老金额填充。
我们需要把后面的 新的量填充。
>> 所以，当我们正在改变的大小 文件，我们还是想略过
填充在旧文件 - 什么 我们从阅读中。
但是，我们特此，我们将 需要放回一些不同的
填充数 我们已经确定。
是啊。
>> 学生75：这两个的顺序 线不要紧吧？
因为你处理 不同的文件。
>> JASON HIRSCHHORN：没错。
这两条线的顺序 没关系。
我们写这条线。
这是这里的文件 我们正在写。
这一点很重要，所以我们得到的 适量的填充。
这要处理的文件中。
我们想跳过权利 在填充。
>> 我们不想读 -
如果我们读一字节的时间，我们 不关心这些填充字节。
我们想要移动到下一行。
最后，就像露西给了我们， 我们关闭文件并返回0。
因此，这是copy.c.
而我们实际上写 - 我们大部分的 部分写这个，基本上。
>> 是你们成就了。
所以希望你有一个良好的感觉 什么的在这里发生了。
最大的区别，说实话，只是 与交易第一部分
位图文件的特殊性。
所以，我有我的下一张幻灯片， 什么我们需要做什么？
好吧，让我们想想侦探小说。
>> 而对于有人谁读通过 问题设置，有什么事我们
需要做的侦探小说？
简单。
位于Aleja。
>> ALEJA：你能不能拿出一部分 每个表示红色像素的。
然后 -
样的？
>> JASON HIRSCHHORN：确定。
因此，采取了各部分 像素是指红色。
这是接近，但不是全部。
>> 学生76：嗯，有 不同的方法来做到这一点。
>> JASON HIRSCHHORN：确定。
给我一个方法。
>> 学生76：取出所有的红色，和 再强调蓝色和绿色。
>> JASON HIRSCHHORN：确定。
因此，考虑这两个方面 -
这听起来像我们给它一个像素，它 具有红色，蓝色和绿色的层次。
我们要改变的相对水平 红色，蓝色和绿色的，这取决于
该像素。
凡在此代码应修改 相对红，蓝和绿
给定像素的水平。
之后我们读它 -
我们写它呢？
给我的行号。
>> 多名学生：83。
>> JASON HIRSCHHORN：83。
所以就在这里。
对于侦探小说，你的代码需要 写都应该去那里。
而这唯一的代码 你需要写。
因为，就像我们听到的，所有你需要 做的是改变这些相对蓝色，
红色和绿色的水平从每个像素。
>> 你读过它，现在你 会写出来。
我如何获得 - 如果我有这个东西 所谓三合一，就在这里，它的的
输入RGBTRIPLE -
好了，如果我们看着在bmp.h， 什么是RGBTRIPLE？
>> 学生77：这是一个结构。
>> JASON HIRSCHHORN：RGBTRIPLE 是一个结构。
我们看到，就在这里。
所以，如果我想访问，比方说， 该结构的红色级别，我该怎么办
访问此结构的红色级别？
>> [CLASS杂音]
>> 学生78：RGBTRIPLE.rgbtred？
>> JASON HIRSCHHORN：这是否正确？
>> 学生79：应该是三 点，而不是RGBTRIPLE点，？
>> JASON HIRSCHHORN：三重。
三重是局部变量，所以 在这里，这里没有指针。
所以我们只需要使用点符号。
这会给我的红​​色级别。
如果我想改变它，我只设置 它等于不同的东西。
如此反复，这行代码访问 这个变量这个结构里面，
我们可以将其设置为新的东西。
>> 因此对于推理小说，再次，这是 在本质上，我们需要做的。
很简单。
只要改变一些相对水平，并 这是哪里的代码去。
调整大小，另一方面， 是有点棘手。
事实上，调整大小大概是 这个问题最棘手的部分设置。
我们有三分钟就到了它。
>> 但是再一次，我们已经写 大部分代码，因此我们
应该是相当熟悉的。
有哪些事情是我们想要做的 调整大小，如果你读一下
问题设置？
如果你给我吧，我们 可以谈论他们。
有哪些事情是我们想干什么？
>> 学生80：垂直 -
所以你必须在水平方向调整其大小， 但垂直调整它的大小呢？
>> JASON HIRSCHHORN：所以，如果我们给出一个 像素，并且我们希望通过调整其大小
两个因素，它现在需要 调整水平和调整大小
垂直。
这是否有道理？
是啊。
所以这是可能的 最大的挑战。
和我们谈谈，在几秒钟之内。
是啊。
>> 学生81：我想它的方式 是你需要打印出来 -
>> JASON HIRSCHHORN：等待。
不要告诉我们你做了什么。
我们要谈的逻辑。
>> 学生81：确定。
究竟是什么问题？
>> JASON HIRSCHHORN：你刚才 提出你的手。
毫无疑问。
让我来介绍它。
让我讨论这个短暂。
因此，我们的一个像素，我们要 复制它，横向和
垂直。
因此，理想情况下我们在这里做的是什么，我们 阅读我们的象素，我们把它写
然而许多倍。
>> 但是，我们有我们的绝招在这里，因为 那么我们要跳到
下一行，并在写 开始下一行的。
因此，如果我们想复制这两个 水平和垂直方向是什么
一个很好的方法来做到这一点 -
一款不错的，虽然这样做呢？
所以我们并不需要时时寻求 围绕我们的文件放置的东西。
>> 这个问题可能没有 是有道理的，但我认为一个
答案是会有所帮助。
>> 学生82：创建一个数组？
>> JASON HIRSCHHORN：所以，让我们觉得 每个文件为一排。
让我们觉得行方面。
如果我们有我们的第一行从我们的小 图片中，我们可以作出这样的行
从成一张大图片大排， 然后复制但该行
很多时候它需要被复制， 而不是通过象素去象素
它得到混乱的时候 处理文件。
>> 因为如果我们有 -
我跑出来的空间。
如果这是我们的文件，我们有 一个像素在那里，我们希望把它
在那里，我们仍然有一些事情 那需要到那边去，当我们
写作和创造我们的新文件 -
我们的文件，该文件的两倍大。
>> 但它真的很难用文件功能 跳过各地新线
这样，然后回去在这里 并把东西在里面。
这几乎是不可能做到的事情 这样，如果是有道理的。
因此，如果我们认为行方面，我们可以 把我们的行，然后把它放在 -
垂直重复的行。
>> 这就是我们如何处理调整大小 垂直而不是水平。
这是那种快， 有点混乱。
不幸的是我们的时间到了。
我会站在外面那些你 谁在这里有关于问题
习题集，包括恢复。
>> 因此，让我们休会了。
再次，如果您有任何疑问， 我们可以聊天之外。