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:所以,讓我們覺得 每個文件為一排。 讓我們覺得行方面。 如果我們有我們的第一行從我們的小 圖片中,我們可以作出這樣的行 從成一張大圖片大排, 然後複製但該行 很多時候它需要被複製, 而不是通過像素去像素 它得到混亂的時候 處理文件。 因為如果我們有 - 我跑出來的空間。 如果這是我們的文件,我們有 一個像素在那裡,我們希望把它 在那裡,我們仍然有一些事情 那需要到那邊去,當我們 寫作和創造我們的新文件 - 我們的文件,該文件的兩倍大。 但它真的很難用文件功能 跳過各地新線 這樣,然後回去在這裡 並把東西在裡面。 這幾乎是不可能做到的事情 這樣,如果是有道理的。 因此,如果我們認為行方面,我們可以 把我們的行,然後把它放在 - 垂直重複的行。 這就是我們如何處理調整大小 垂直而不是水平。 這是那種快, 有點混亂。 不幸的是我們的時間到了。 我會站在外面那些你 誰在這裡有關於問題 習題集,包括恢復。 因此,讓我們休會了。 再次,如果您有任何疑問, 我們可以聊天之外。