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:所以,让我们觉得 每个文件为一排。 让我们觉得行方面。 如果我们有我们的第一行从我们的小 图片中,我们可以作出这样的行 从成一张大图片大排, 然后复制但该行 很多时候它需要被复制, 而不是通过象素去象素 它得到混乱的时候 处理文件。 因为如果我们有 - 我跑出来的空间。 如果这是我们的文件,我们有 一个像素在那里,我们希望把它 在那里,我们仍然有一些事情 那需要到那边去,当我们 写作和创造我们的新文件 - 我们的文件,该文件的两倍大。 但它真的很难用文件功能 跳过各地新线 这样,然后回去在这里 并把东西在里面。 这几乎是不可能做到的事情 这样,如果是有道理的。 因此,如果我们认为行方面,我们可以 把我们的行,然后把它放在 - 垂直重复的行。 这就是我们如何处理调整大小 垂直而不是水平。 这是那种快, 有点混乱。 不幸的是我们的时间到了。 我会站在外面那些你 谁在这里有关于问题 习题集,包括恢复。 因此,让我们休会了。 再次,如果您有任何疑问, 我们可以聊天之外。