>> 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作為一個零指針 - 一個指針到零 -
某處在內存中 你永遠無法訪問。
>> 所以，如果事情是為null，則 知道它沒有被初始化，
或者有什麼也沒有。
所以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：我們 需要空閒緩衝區？
我們不知道。
再次，這是一個局部變量， 所以我們並不需要釋放它。
確定。
讓我們看看會發生什麼。
因此，它是未初始化的。
那是什麼東西， 馬庫斯較早前建議。
因此，我們有這個錯誤，變量緩衝區 這裡使用的時候被初始化。
>> 怎樣才能解決這個問題？
>> 學生50：malloc的呢？
>> 學生51：等於null？
>> 學生52：假設緩衝區的值等於NULL。
>> JASON HIRSCHHORN：確定。
看起來不錯。
我們現在擁有它。
讓我們創建一些嘗試複製。
因此，我們有我們的文本文件。
我們怎樣才能運行這個程序？
是啊。
>> 學生53：你可以做點 斜線CP，test.txt的。
然後你就可以指定任何其他文件 它會存儲到。
>> JASON HIRSCHHORN：確定。
我們叫它out.txt的。
酷？
賽格故障。
思考的賽格故障？
這是偉大的。
我們怎樣才能找出 賽格故障？
什麼？
>> 學生54：GDB。
>> JASON HIRSCHHORN：GDB。
我們運行gdb的寫點gdb的斜線， 我們的程序的名稱。
沒有命令行參數那裡。
我們將設置一個 斷點為主。
如果我想啟動gdb，我該怎麼辦？
>> 學生55：R。
>> JASON HIRSCHHORN：R.然後呢？
>> 學生55：該參數呢？
>> JASON HIRSCHHORN：然後， 命令行參數。
讓我們通過。
N的只是把我一行一行。
我會去，直到 我讓我的賽格故障。
還有我的賽格故障。
它看起來像用fread引起 我的賽格故障。
我知道用fread引起我的賽格故障， 因為這是
行，我們只是執行。
>> 而那是唯一 發生在該行 -
兩件事情都發生了。
FREAD要去，然後我們 做一些檢查時。
我敢打賭，在WHILE 檢查並沒有引起我的賽格故障。
最有可能的，是FREAD 造成我的賽格故障。
我也看到一些東西在這裡，存儲器複製。
>> 內存拷貝。
聽起來像移動存儲 一個位置移動到另一個。
聽起來似乎會發生 在用fread，也許有些記憶
從這裡搬到這裡。
讓我們通過這一次。
我如何在啟動它 並再次運行它？
是啊。
>> 學生56：你需要把 緩衝區之前的符號？
>> JASON HIRSCHHORN：所以在與符號 緩衝會給我的地址
緩衝，這是一個char *。
讓我們通過這一次運行。
我如何通過它運行一次嗎？
>> 學生57：你能剛 再鍵入run？
>> JASON HIRSCHHORN：只需再次鍵入運行。
因此，我們不打算 執行這條線。
因此，緩衝區是一個NULL指針。
正確嗎？
它指向 - 讓我們來看看。
如果我們有我們 -
畫出這是一個快速的畫面。
大家可以看看 我寫在這裡？
>> 因此堆棧中，我們有一個本地 變量，它被稱為緩衝液，並
它是一個指針，指向一個char。
什麼地址是這個字符的？
>> 學生58：0X0。
>> JASON HIRSCHHORN：對。
那這是什麼。
在這裡，內部緩衝區，存儲0X0。
這就是我們所擁有的 - 的 安裝我們現在所擁有的。
所以這條線，用fread，把東西 從源代碼在哪裡？
這個框或此框？
這盒？
左框或右邊的框中？
這項權利箱。
>> 它遵循的指針， 並把它放在這裡。
當我們在嘗試和觸摸記憶 位置0，我們得到什麼？
分段錯誤。
這就是我們現在所擁有的錯誤。
是啊。
>> 學生59：你不是有 把明星緩衝？
還是沒有？
對於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：所以，讓我們覺得 每個文件為一排。
讓我們覺得行方面。
如果我們有我們的第一行從我們的小 圖片中，我們可以作出這樣的行
從成一張大圖片大排， 然後複製但該行
很多時候它需要被複製， 而不是通過像素去像素
它得到混亂的時候 處理文件。
>> 因為如果我們有 -
我跑出來的空間。
如果這是我們的文件，我們有 一個像素在那裡，我們希望把它
在那裡，我們仍然有一些事情 那需要到那邊去，當我們
寫作和創造我們的新文件 -
我們的文件，該文件的兩倍大。
>> 但它真的很難用文件功能 跳過各地新線
這樣，然後回去在這裡 並把東西在裡面。
這幾乎是不可能做到的事情 這樣，如果是有道理的。
因此，如果我們認為行方面，我們可以 把我們的行，然後把它放在 -
垂直重複的行。
>> 這就是我們如何處理調整大小 垂直而不是水平。
這是那種快， 有點混亂。
不幸的是我們的時間到了。
我會站在外面那些你 誰在這裡有關於問題
習題集，包括恢復。
>> 因此，讓我們休會了。
再次，如果您有任何疑問， 我們可以聊天之外。