演講嘉賓:到目前為止,它可能 大多數的程序 已經有點短暫。 你運行像馬里奧或貪婪的程序。 它做的東西,它可能提示 對於某些信息的用戶, 打印某些輸出到屏幕上, 但是當你的程序已經結束了, 真的沒有證據表明有 這是有史以​​來第一位執行。 我的意思是,當然,你可能已經離開 它在終端窗口中打開, 但如果你清楚你的屏幕上,有 真的沒有證據證明它的存在。 我們沒有存儲的手段 持久性信息,信息 我們以後存在 程序已停止運行, 或者我們還沒有到這一點。 幸運的是,雖然,C做 我們提供的能力 通過實施這樣做 叫什麼 一個文件,這樣的結構,基本上 代表你會加倍文件 單擊您的計算機上,如果你 用於圖形用戶環境。 一般工作時 與C,我們實際上 將要與工作 指針files--文件stars-- 除了一點點 當我們談論的一對夫婦 的函數 使用文件指針工作。 你並不需要真的挖到 太深入的了解指針 自己。 有一點蠅頭位 在這裡,我們將談論他們, 但一般文件指針和 三分球,而相互關聯的, 不完全一樣的東西。 現在,這是什麼意思時, 我說的持久性數據? 什麼是持久性數據? 我們為什麼要關心它? 說,例如,該 你正在運行的程序 或者你已經重寫一個 程序,這是一個遊戲, 你想跟踪 所有用戶的招式 因此,也許如果出了問題, 您可以查看在比賽結束後的文件。 這就是我們的時候,我們的意思是 談論持久性數據。 在運行的過程中你 程序,文件被創建。 而當你的程序 已停止運行, 該文件仍然存在你的系統上。 我們可以看一下它,研究它。 並且使得節目將被設置為 創造了一些持久性數據, 程序後的數據存在 已完成運行。 現在,所有這些功能的工作 與創建文件和操作 他們以不同的方式 住在標準io.h, 這是一個頭文件 你可能是英鎊 包括漂亮的頂部 多所有程序 因為它包含的所述一個 對我們來說最有用的功能, printf的,這也讓 住在標準io.h. 所以,你不需要砸向包括 任何其他文件可能 為了與文件指針一起工作。 現在,每一個文件的指針功能, 或者每一個文件I / O輸入輸出 功能,接收為一體 其參數或輸入 文件pointer--除 一,FOPEN,這 是你用什麼來獲取文件 指針擺在首位。 但是,你打開後, 文件並且得到文件指針, 那麼你可以將它們作為 參數的各種功能 我們要談 今天,以及許多其他 這樣您就可以使用文件。 因此,有6個漂亮 常見的基本要點 那我們要談論今天。 FOPEN和它的同伴 函數fclose函數,龜etc 及其配套功能的fputc, 和FREAD及其配套功能, FWRITE。 因此,讓我們馬上進去。 fopen--它有什麼作用? 那麼,它會打開一個文件,並將其 給你一個文件指針指向它, 這樣你就可以使用 文件指針作為參數 任何其他文件I / O功能。 最重要的事情 要記住的fopen 是,你必須開後 文件或在這裡取得像一個呼叫, 你需要檢查,以確保 那你回來的指針 不等於空。 如果你還沒有看過上的視頻 三分球,這可能沒有什麼意義。 但是,如果你嘗試取消引用 一個空指針召回, 你的程序可能會吃虧 分段[聽不清]。 我們要確保我們 得到了一個合法的指針返回。 的大多數時間我們將 已經獲得了合法的指針回 它不會成為一個問題。 那麼,我們如何撥打電話給fopen? 它看起來非常像這樣。 文件明星ptr-- PTR是一個通用的 命名文件pointer-- FOPEN 我們通過在兩件事情,一個文件名 和操作我們要進行。 所以,我們可能有一個電話,看起來像 this--文件明星PTR 1等於FOPEN FILE1.TXT。 而我所選擇的操作為r。 那麼,你認為r是在這裡嗎? 什麼是各種各樣的事情,我們 也許能夠做的文件嗎? 以r是操作,我們 選擇當我們要讀取文件。 所以我們基本上是在 我們做這樣的呼籲 越來越自己一個文件指針 這樣,我們便可以讀取信息 從FILE1.TXT。 同樣,我們可以打開的文件2.txt 寫作,所以我們可以通過PTR2, 我在這裡創建的文件指針, 作為參數傳遞給任何函數 將信息寫入到一個文件。 而類似的寫作,有 還可以選擇追加一個。 之間的差 寫作和附加 是當你寫一個文件, 如果你打個電話給fopen寫作 而該文件已經存在,它的 要覆蓋整個文件。 這將啟動 在開始的時候, 刪除所有信息 這是已經存在。 然而,如果你打開它進行追加, 將進入該文件的結束 如果有已經在文本 它或在它的信息, 它將再啟動 從那裡寫作。 所以,你不會丟失任何的 你以前做過的信息。 無論你想要寫或追加 那種視情況而定。 但是,你可能知道的 正確的操作是在時機成熟時。 所以這是FOPEN。 什麼fclose函數? 嗯,倒也乾脆,fclose函數 剛剛接受文件指針。 正如你所期望的, 它將關閉該文件。 一旦我們已經關閉的文件,我們不能 執行任何更多的文件I / O功能, 讀取或寫入,在該文件中。 我們不得不重新打開 文件中的另一個時間,以便 繼續與工作 使用它的I / O功能。 我們這樣做fclose函數方法 正與此文件。 而所有我們需要傳遞的是 一個文件指針的名稱。 因此,一對夫婦幻燈片前,我們 fopened文件1點文本閱讀 我們分配了 文件指針ptr1的。 現在我們已經決定我們 完成從文件中讀取。 我們不需要做任何更多的它。 我們可以只fclose函數ptr1的。 同樣,我們能否 F關閉其他的。 好的。 這樣的開始和結束。 這些是兩個基本 啟動操作。 現在,我們要以實際 做一些有趣的東西, 和第一個功能,我們將 看到將這樣做是fgetc-- 文件中獲取一個字符。 這就是通常龜etc 將轉化。 其人生目標是 讀取下一個字符, 如果這是你很 到龜etc第一個電話 為一個特定的文件, 第一個字符。 但在那之後, 你的下一個, 該文件的最下一個字符, 並將其存儲在一個字符變量。 正如我們所做的, 焦炭CH等於龜etc, 通過在一個文件指針的名稱。 再次,這是非常 重要的是必須記住 是,為了有 這種操作成功, 文件指針本身意有所指 打開閱讀。 我們不能從文件中讀取一個字符 指針,我們進行寫入操作。 所以這是之一 的FOPEN的限制,對不對? 我們一定要限制 我們只執行 一個操作一個文件指針。 如果我們想讀, 從同一個文件中寫入, 我們就必須打開兩個獨立的 文件指向同一file-- 一個用於讀,一個用於寫。 如此反复,唯一的理由 我提起這件事,現在是 因為如果我們要撥打電話 到龜etc,該文件指針意有所指 打開閱讀。 然後倒也乾脆, 所有我們需要做的 是通過在文件指針的名稱。 因此,焦炭CH等於龜etc ptr1的。 那將讓我們 接下來character-- 或再次,如果這是第一個 一次,我們已經取得了這一呼籲, 的第一character--任何 文件由ptr1的指向。 回想一下,這是文件1點文字。 它會得到的第一個字符 我們將其存儲在變量通道。 很簡單。 因此,我們只看到三個 功能和已經我們 可以做一些漂亮整潔。 因此,如果我們把這種能力 得到一個字符的 我們循環它 - 所以我們 繼續得到字符 從一個文件過來, 過去,over--現在我們 可以讀取每一個 字符的文件名。 如果我們打印的每一個字符 之後我們讀它, 我們現在已經從文件中讀取和 印刷的內容到屏幕上。 我們已經有效地連接起來 在屏幕上該文件。 而這正是 Linux命令的貓一樣。 如果您在文件名中鍵入的貓,它 將打印出的全部內容 在終端窗口中的文件。 所以這裡這個小環, 只有三行代碼, 但它有效地複製 Linux命令貓。 所以這個語法可能 看起來有點怪異, 但這裡的這裡發生了什麼。 雖然CH等於龜etc,ptr不 等於EOF--它是一個整體一口, 但讓​​我們把它分解只 所以很明顯的語法。 我已經鞏固了它 為求空間, 雖然這是一個有點 語法棘手。 因此,這部分綠色右 現在,它在幹什麼? 好吧,這只是我們的龜etc電話,對不對? 我們已經看到過。 它獲得一種 字符從該文件。 然後,我們比較一下 性格對EOF。 EOF是一個特殊的值,它是 在標準io.h,定義了 為文件結束字符。 所以基本上什麼事情要發生 在這個循環將讀取一個字符, 把它比作EOF時, 文件結束符。 如果它們不匹配,所以我們沒有 到達文件的結尾, 我們將打印字符的。 然後,我們將回到 重新開始循環。 我們會得到一個字符,檢查 對EOF,打印出來,等 等等, 以這種方式遍歷 直到我們到達了文件的末尾。 然後由這一點, 我們將印 出文件的全部內容。 所以,再一次,我們只看到 FOPEN和fclose和龜etc 而且我們已經可以複製 Linux終端命令。 正如我在開始時說, 我們有龜etc和的fputc, 和的fputc是伴侶 和函數fgetc的。 所以,如你所想, 它是寫入等效。 它可以讓我們寫一個 單個字符到一個文件。 同樣,需要注意的是,剛 就像是與龜etc,該文件 我們正在編寫到一定發生了 打開寫入或追加。 如果我們嘗試使用的fputc上的文件 我們已經為讀而打開, 我們要吃虧 有點錯誤。 但通話是非常簡單的。 的fputc大寫的A PTR2,所有 這是怎麼回事要做的就是它的 打算寫的信 成阿成的文件2點 文本,這是的名稱 文件我們打開並分配 指針PTR2。 所以,我們要編寫一個 大寫字母A到文件2點文字。 我們將編寫一個感嘆號 指向文件3點 文本,這是由ptr3指出。 如此反复,很簡單在這裡。 但是現在我們可以做的另一件事。 我們有這樣的例子 我們只是在看 對能夠複製貓 Linux命令,打印出一 到屏幕上。 好了,現在我們有能力 以從文件中讀取字符 和寫入字符的文件, 為什麼我們不只是替換了 調用printf一個調用的fputc。 現在,我們已經重複CP, 一個非常基本的Linux命令 我們剛才談到的方式長 以前在Linux命令的視頻。 我們有效地已經 重複的就在這裡。 我們讀一個字符,然後我們 寫這個角色到另一個文件。 從一個文件讀,寫 到另一個,遍地 一遍又一遍,直到我們遇到EOF。 我們一定要的到底 文件我們試圖從複製。 而由我們自己編寫的所有 的字符,我們需要將文件 我們正在寫。 因此,這是CP,Linux的複製命令。 在一開始 這個視頻,我的告誡 我們會聊 關於指針點點。 下面是具體在哪裡我們 要談論的指針 除了文件指針。 所以這個功能看起來有種可怕的。 它有幾個參數。 有很多怎麼回事。 有很多的不同 顏色和文字。 但實際上,它只是 龜etc通用版 這使我們能夠得到任何 的信息量。 它可以是一個有點低效率的,如果我們是 獲得的字符之一的時間, 通過文件迭代 一個字符的時間。 那豈不是更好得到 100在一個時間或500的時間? 那麼,FR​​EAD和它的伴侶函數 FWRITE,我們將談談 在第二,使我們能夠做到這一點。 我們可以讀取任意數量 從文件中的信息 我們存儲在某個地方暫時的。 而不是能夠只 在一個變量適合它, 我們可能需要將其存放在數組中。 因此,我們通過在四個 參數fread--指針 到我們的位置 要存儲的信息, 多大每個信息單元 將成為信息多少個單位 我們想要收購,而從 我們希望得到他們的文件。 也許最好的說明 在這裡的一個例子。 因此,讓我們說,我們聲明 10整數數組。 我們在剛剛宣布 堆棧任意詮釋ARR 10。 所以這是非常簡單的。 現在我們正在做的雖然是什麼 frecall是我們在閱讀為int的大小 次10字節的信息。 INT存在尺寸four--那 在C的整數的大小。 因此,我們正在做的事情是,我們正在閱讀 40個字節的信息 從文件指向PTR。 我們要存儲這些 40個字節的地方 在這裡,我們已預留 40個字節的內存。 幸運的是,我們已經完成了由 聲明ARR,該數組就在這裡。 是能夠保持的 10四字節單元。 因此,在總,它可以容納40 個字節的信息。 而我們現在正在讀40個字節 從文件的信息, 我們正在將它存儲在編曲。 從指針的視頻回憶 的陣列,如改編的名稱, 真的只是一個指針 其第一元件。 所以,當我們通過在編曲那裡,我們 是的,其實,傳遞一個指針。 同樣,我們可以做的this-- 我們不一定 需要保存我們的緩衝區在堆棧中。 我們還可以動態地分配 一個緩衝區就是這樣,用malloc。 請記住,當我們 動態分配內存, 我們將其保存在 堆,而不是疊。 但它仍然是一個緩衝區。 它仍然在這種情況下,是 保持640個字節的信息 因為雙佔用了八個字節。 而且我們要求為80人。 我們希望能有空間 持有80雙打。 因此,80倍8是640個字節的信息。 這調用fread是 收集640個字節的信息 從文件指向 PTR現在將它存儲在ARR2。 現在,我們也可以把FREAD 就像調用龜etc。 在這種情況下,我們只是想 從文件中獲取一個字符。 我們不需要 數組來保存一個字符。 我們只需將其存放在 一個字符變量。 美中不足的,不過,是 當我們只是有一個變量, 我們需要傳遞的 該變量的地址 因為回想一下, 第一個參數FREAD 是指向的位置和存儲器 在這裡我們要存儲的信息。 再次,一個名 陣列是一個指針。 所以我們並不需要做符號陣列。 但是,C,字符c 這裡,不是數組。 這只是一個變量。 因此,我們需要傳遞一個 符號C到指示 那這就是我們想要的地址 存儲信息的這一個字節, 這一個字符 我們收集的PTR。 Fwrite--我會去通過 這一點 quickly--幾乎是 FREAD的完全等效 除了它的寫作 而不是閱讀,只是 像other--我們已經開 和關閉,進入一個人物, 寫一個字。 現在,獲得任意 的信息量, 右的任意數量的信息。 因此,只要像以前一樣,我們可以 有10整數數組 在這裡我們已經有 信息存儲,也許吧。 這可能是一些代碼行 應在這兩者之間去 在這裡我填寫常用3與 有意義的事。 我填補它與10個不同的整數。 而相反,就是我 做的是從編曲寫 和收集從ARR的信息。 我要帶的資料 把球送入該文件。 因此,而不是其被 文件到緩衝器, 我們現在從去 緩衝區到該文件。 因此,它正好相反。 如此反复,就如同之前,我們就可以 也有一個內存堆塊 我們動態地已經 分配並從閱讀 並編寫該文件。 而且我們也有一個變量 能夠容納一個字節 的信息,諸如字符。 但同樣,我們需要傳遞 該變量的地址 當我們想從中讀取。 因此,我們可以寫信息 我們發現在該地址 該文件指針,PTR。 還有很多其他的 大文件I / O功能 即做各種事情,除了 那些我們已經談到了今天。 一對夫婦的那些 你可能會發現有用 是fgets和的fputs, 它們是等效 的龜etc和的fputc但對於閱讀 從文件中一個字符串。 而不是一個單一的字符, 它會讀取整個字符串。 fprintf中,基本上允許 你用printf寫入文件。 所以,就像你可以做 使用變量替換 佔位符%的I和 百分之d和等,具有的printf 你同樣可以把 printf的字符串和打印的東西 這樣的一個文件。 fseek--如果你有一台DVD播放機 就是這個比喻我通常使用這裡 - 有點像用你 快退和快進 按鈕移動影片各地。 同樣,您可以在文件移動。 一個裡面的東西 該文件的結構 將c為您創建是一個指標 在那裡你是在文件中。 你是在很 開始,在0字節? 你是在字節100, 字節1000,以此類推? 您可以使用fseek的任意移動 該指標前進或後退。 而FTELL,再次 類似於DVD播放機, 就像一個小時鐘,告訴 你有多少分鐘,你秒 是到特定的電影。 同樣,FTELL告訴您如何 你是到文件的字節數。 的feof是一個不同的版本 檢測你是否已經 到達文件的結尾。 和ferror是一個函數 您可以使用 檢測到的東西是否有 出了問題的工作與文件。 同樣,這僅僅是 表面文章。 仍然有很多更多的文件I / O 在標準io.h.功能 但是,這可能會得到你 開始與文件指針工作。 我是道格·勞埃德。 這是CS50。