1 00:00:00,000 --> 00:00:05,330 2 00:00:05,330 --> 00:00:07,870 >> 演講嘉賓:到目前為止,它可能 大多數的程序 3 00:00:07,870 --> 00:00:10,170 已經有點短暫。 4 00:00:10,170 --> 00:00:13,310 你運行像馬里奧或貪婪的程序。 5 00:00:13,310 --> 00:00:17,350 它做的東西,它可能提示 對於某些信息的用戶, 6 00:00:17,350 --> 00:00:20,400 打印某些輸出到屏幕上, 但是當你的程序已經結束了, 7 00:00:20,400 --> 00:00:23,252 真的沒有證據表明有 這是有史以​​來第一位執行。 8 00:00:23,252 --> 00:00:25,960 我的意思是,當然,你可能已經離開 它在終端窗口中打開, 9 00:00:25,960 --> 00:00:29,770 但如果你清楚你的屏幕上,有 真的沒有證據證明它的存在。 10 00:00:29,770 --> 00:00:33,720 我們沒有存儲的手段 持久性信息,信息 11 00:00:33,720 --> 00:00:36,890 我們以後存在 程序已停止運行, 12 00:00:36,890 --> 00:00:39,241 或者我們還沒有到這一點。 13 00:00:39,241 --> 00:00:41,490 幸運的是,雖然,C做 我們提供的能力 14 00:00:41,490 --> 00:00:44,220 通過實施這樣做 叫什麼 15 00:00:44,220 --> 00:00:48,330 一個文件,這樣的結構,基本上 代表你會加倍文件 16 00:00:48,330 --> 00:00:53,826 單擊您的計算機上,如果你 用於圖形用戶環境。 17 00:00:53,826 --> 00:00:55,700 一般工作時 與C,我們實際上 18 00:00:55,700 --> 00:00:59,965 將要與工作 指針files--文件stars-- 19 00:00:59,965 --> 00:01:02,090 除了一點點 當我們談論的一對夫婦 20 00:01:02,090 --> 00:01:04,560 的函數 使用文件指針工作。 21 00:01:04,560 --> 00:01:08,990 你並不需要真的挖到 太深入的了解指針 22 00:01:08,990 --> 00:01:09,730 自己。 23 00:01:09,730 --> 00:01:12,870 有一點蠅頭位 在這裡,我們將談論他們, 24 00:01:12,870 --> 00:01:18,090 但一般文件指針和 三分球,而相互關聯的, 25 00:01:18,090 --> 00:01:20,290 不完全一樣的東西。 26 00:01:20,290 --> 00:01:22,440 >> 現在,這是什麼意思時, 我說的持久性數據? 27 00:01:22,440 --> 00:01:23,650 什麼是持久性數據? 28 00:01:23,650 --> 00:01:25,232 我們為什麼要關心它? 29 00:01:25,232 --> 00:01:27,190 說,例如,該 你正在運行的程序 30 00:01:27,190 --> 00:01:29,850 或者你已經重寫一個 程序,這是一個遊戲, 31 00:01:29,850 --> 00:01:32,960 你想跟踪 所有用戶的招式 32 00:01:32,960 --> 00:01:36,620 因此,也許如果出了問題, 您可以查看在比賽結束後的文件。 33 00:01:36,620 --> 00:01:39,970 這就是我們的時候,我們的意思是 談論持久性數據。 34 00:01:39,970 --> 00:01:43,930 >> 在運行的過程中你 程序,文件被創建。 35 00:01:43,930 --> 00:01:45,680 而當你的程序 已停止運行, 36 00:01:45,680 --> 00:01:48,689 該文件仍然存在你的系統上。 37 00:01:48,689 --> 00:01:50,230 我們可以看一下它,研究它。 38 00:01:50,230 --> 00:01:53,670 並且使得節目將被設置為 創造了一些持久性數據, 39 00:01:53,670 --> 00:01:57,390 程序後的數據存在 已完成運行。 40 00:01:57,390 --> 00:02:02,320 >> 現在,所有這些功能的工作 與創建文件和操作 41 00:02:02,320 --> 00:02:04,940 他們以不同的方式 住在標準io.h, 42 00:02:04,940 --> 00:02:08,210 這是一個頭文件 你可能是英鎊 43 00:02:08,210 --> 00:02:10,910 包括漂亮的頂部 多所有程序 44 00:02:10,910 --> 00:02:14,130 因為它包含的所述一個 對我們來說最有用的功能, 45 00:02:14,130 --> 00:02:16,130 printf的,這也讓 住在標準io.h. 46 00:02:16,130 --> 00:02:20,400 所以,你不需要砸向包括 任何其他文件可能 47 00:02:20,400 --> 00:02:23,540 為了與文件指針一起工作。 48 00:02:23,540 --> 00:02:29,980 >> 現在,每一個文件的指針功能, 或者每一個文件I / O輸入輸出 49 00:02:29,980 --> 00:02:33,310 功能,接收為一體 其參數或輸入 50 00:02:33,310 --> 00:02:35,822 文件pointer--除 一,FOPEN,這 51 00:02:35,822 --> 00:02:38,280 是你用什麼來獲取文件 指針擺在首位。 52 00:02:38,280 --> 00:02:41,010 但是,你打開後, 文件並且得到文件指針, 53 00:02:41,010 --> 00:02:43,510 那麼你可以將它們作為 參數的各種功能 54 00:02:43,510 --> 00:02:46,720 我們要談 今天,以及許多其他 55 00:02:46,720 --> 00:02:48,520 這樣您就可以使用文件。 56 00:02:48,520 --> 00:02:50,980 >> 因此,有6個漂亮 常見的基本要點 57 00:02:50,980 --> 00:02:52,870 那我們要談論今天。 58 00:02:52,870 --> 00:02:57,160 FOPEN和它的同伴 函數fclose函數,龜etc 59 00:02:57,160 --> 00:03:02,670 及其配套功能的fputc, 和FREAD及其配套功能, 60 00:03:02,670 --> 00:03:03,820 FWRITE。 61 00:03:03,820 --> 00:03:05,180 因此,讓我們馬上進去。 62 00:03:05,180 --> 00:03:07,050 >> fopen--它有什麼作用? 63 00:03:07,050 --> 00:03:10,050 那麼,它會打開一個文件,並將其 給你一個文件指針指向它, 64 00:03:10,050 --> 00:03:14,000 這樣你就可以使用 文件指針作為參數 65 00:03:14,000 --> 00:03:16,730 任何其他文件I / O功能。 66 00:03:16,730 --> 00:03:19,100 最重要的事情 要記住的fopen 67 00:03:19,100 --> 00:03:24,222 是,你必須開後 文件或在這裡取得像一個呼叫, 68 00:03:24,222 --> 00:03:26,930 你需要檢查,以確保 那你回來的指針 69 00:03:26,930 --> 00:03:28,320 不等於空。 70 00:03:28,320 --> 00:03:31,320 如果你還沒有看過上的視頻 三分球,這可能沒有什麼意義。 71 00:03:31,320 --> 00:03:35,639 但是,如果你嘗試取消引用 一個空指針召回, 72 00:03:35,639 --> 00:03:38,180 你的程序可能會吃虧 分段[聽不清]。 73 00:03:38,180 --> 00:03:40,540 我們要確保我們 得到了一個合法的指針返回。 74 00:03:40,540 --> 00:03:43,665 的大多數時間我們將 已經獲得了合法的指針回 75 00:03:43,665 --> 00:03:45,280 它不會成為一個問題。 76 00:03:45,280 --> 00:03:46,760 >> 那麼,我們如何撥打電話給fopen? 77 00:03:46,760 --> 00:03:48,051 它看起來非常像這樣。 78 00:03:48,051 --> 00:03:52,690 文件明星ptr-- PTR是一個通用的 命名文件pointer-- FOPEN 79 00:03:52,690 --> 00:03:57,300 我們通過在兩件事情,一個文件名 和操作我們要進行。 80 00:03:57,300 --> 00:04:01,690 所以,我們可能有一個電話,看起來像 this--文件明星PTR 1等於FOPEN 81 00:04:01,690 --> 00:04:04,040 FILE1.TXT。 82 00:04:04,040 --> 00:04:07,020 而我所選擇的操作為r。 83 00:04:07,020 --> 00:04:08,639 >> 那麼,你認為r是在這裡嗎? 84 00:04:08,639 --> 00:04:11,180 什麼是各種各樣的事情,我們 也許能夠做的文件嗎? 85 00:04:11,180 --> 00:04:13,760 86 00:04:13,760 --> 00:04:17,500 以r是操作,我們 選擇當我們要讀取文件。 87 00:04:17,500 --> 00:04:20,260 所以我們基本上是在 我們做這樣的呼籲 88 00:04:20,260 --> 00:04:25,440 越來越自己一個文件指針 這樣,我們便可以讀取信息 89 00:04:25,440 --> 00:04:27,770 從FILE1.TXT。 90 00:04:27,770 --> 00:04:34,190 >> 同樣,我們可以打開的文件2.txt 寫作,所以我們可以通過PTR2, 91 00:04:34,190 --> 00:04:38,210 我在這裡創建的文件指針, 作為參數傳遞給任何函數 92 00:04:38,210 --> 00:04:40,080 將信息寫入到一個文件。 93 00:04:40,080 --> 00:04:43,767 而類似的寫作,有 還可以選擇追加一個。 94 00:04:43,767 --> 00:04:45,600 之間的差 寫作和附加 95 00:04:45,600 --> 00:04:50,920 是當你寫一個文件, 如果你打個電話給fopen寫作 96 00:04:50,920 --> 00:04:54,761 而該文件已經存在,它的 要覆蓋整個文件。 97 00:04:54,761 --> 00:04:56,510 這將啟動 在開始的時候, 98 00:04:56,510 --> 00:04:58,820 刪除所有信息 這是已經存在。 99 00:04:58,820 --> 00:05:02,210 >> 然而,如果你打開它進行追加, 將進入該文件的結束 100 00:05:02,210 --> 00:05:04,340 如果有已經在文本 它或在它的信息, 101 00:05:04,340 --> 00:05:06,040 它將再啟動 從那裡寫作。 102 00:05:06,040 --> 00:05:08,570 所以,你不會丟失任何的 你以前做過的信息。 103 00:05:08,570 --> 00:05:12,110 無論你想要寫或追加 那種視情況而定。 104 00:05:12,110 --> 00:05:16,840 但是,你可能知道的 正確的操作是在時機成熟時。 105 00:05:16,840 --> 00:05:18,020 所以這是FOPEN。 106 00:05:18,020 --> 00:05:18,930 >> 什麼fclose函數? 107 00:05:18,930 --> 00:05:21,600 嗯,倒也乾脆,fclose函數 剛剛接受文件指針。 108 00:05:21,600 --> 00:05:24,000 正如你所期望的, 它將關閉該文件。 109 00:05:24,000 --> 00:05:29,270 一旦我們已經關閉的文件,我們不能 執行任何更多的文件I / O功能, 110 00:05:29,270 --> 00:05:31,420 讀取或寫入,在該文件中。 111 00:05:31,420 --> 00:05:36,444 我們不得不重新打開 文件中的另一個時間,以便 112 00:05:36,444 --> 00:05:38,610 繼續與工作 使用它的I / O功能。 113 00:05:38,610 --> 00:05:41,520 我們這樣做fclose函數方法 正與此文件。 114 00:05:41,520 --> 00:05:44,690 而所有我們需要傳遞的是 一個文件指針的名稱。 115 00:05:44,690 --> 00:05:50,010 因此,一對夫婦幻燈片前,我們 fopened文件1點文本閱讀 116 00:05:50,010 --> 00:05:52,854 我們分配了 文件指針ptr1的。 117 00:05:52,854 --> 00:05:55,020 現在我們已經決定我們 完成從文件中讀取。 118 00:05:55,020 --> 00:05:56,561 我們不需要做任何更多的它。 119 00:05:56,561 --> 00:05:58,890 我們可以只fclose函數ptr1的。 120 00:05:58,890 --> 00:06:01,950 同樣,我們能否 F關閉其他的。 121 00:06:01,950 --> 00:06:02,450 好的。 122 00:06:02,450 --> 00:06:03,700 這樣的開始和結束。 123 00:06:03,700 --> 00:06:05,780 這些是兩個基本 啟動操作。 124 00:06:05,780 --> 00:06:08,050 >> 現在,我們要以實際 做一些有趣的東西, 125 00:06:08,050 --> 00:06:11,940 和第一個功能,我們將 看到將這樣做是fgetc-- 126 00:06:11,940 --> 00:06:14,110 文件中獲取一個字符。 127 00:06:14,110 --> 00:06:17,350 這就是通常龜etc 將轉化。 128 00:06:17,350 --> 00:06:20,190 其人生目標是 讀取下一個字符, 129 00:06:20,190 --> 00:06:22,079 如果這是你很 到龜etc第一個電話 130 00:06:22,079 --> 00:06:23,870 為一個特定的文件, 第一個字符。 131 00:06:23,870 --> 00:06:26,210 但在那之後, 你的下一個, 132 00:06:26,210 --> 00:06:31,500 該文件的最下一個字符, 並將其存儲在一個字符變量。 133 00:06:31,500 --> 00:06:34,490 正如我們所做的, 焦炭CH等於龜etc, 134 00:06:34,490 --> 00:06:36,389 通過在一個文件指針的名稱。 135 00:06:36,389 --> 00:06:38,180 再次,這是非常 重要的是必須記住 136 00:06:38,180 --> 00:06:41,430 是,為了有 這種操作成功, 137 00:06:41,430 --> 00:06:45,690 文件指針本身意有所指 打開閱讀。 138 00:06:45,690 --> 00:06:50,589 我們不能從文件中讀取一個字符 指針,我們進行寫入操作。 139 00:06:50,589 --> 00:06:52,630 所以這是之一 的FOPEN的限制,對不對? 140 00:06:52,630 --> 00:06:55,470 我們一定要限制 我們只執行 141 00:06:55,470 --> 00:06:57,710 一個操作一個文件指針。 142 00:06:57,710 --> 00:07:00,220 如果我們想讀, 從同一個文件中寫入, 143 00:07:00,220 --> 00:07:03,840 我們就必須打開兩個獨立的 文件指向同一file-- 144 00:07:03,840 --> 00:07:05,670 一個用於讀,一個用於寫。 145 00:07:05,670 --> 00:07:08,400 >> 如此反复,唯一的理由 我提起這件事,現在是 146 00:07:08,400 --> 00:07:11,920 因為如果我們要撥打電話 到龜etc,該文件指針意有所指 147 00:07:11,920 --> 00:07:14,172 打開閱讀。 148 00:07:14,172 --> 00:07:15,880 然後倒也乾脆, 所有我們需要做的 149 00:07:15,880 --> 00:07:17,546 是通過在文件指針的名稱。 150 00:07:17,546 --> 00:07:21,060 因此,焦炭CH等於龜etc ptr1的。 151 00:07:21,060 --> 00:07:23,200 >> 那將讓我們 接下來character-- 152 00:07:23,200 --> 00:07:25,575 或再次,如果這是第一個 一次,我們已經取得了這一呼籲, 153 00:07:25,575 --> 00:07:29,750 的第一character--任何 文件由ptr1的指向。 154 00:07:29,750 --> 00:07:32,210 回想一下,這是文件1點文字。 155 00:07:32,210 --> 00:07:36,490 它會得到的第一個字符 我們將其存儲在變量通道。 156 00:07:36,490 --> 00:07:37,941 很簡單。 157 00:07:37,941 --> 00:07:40,190 因此,我們只看到三個 功能和已經我們 158 00:07:40,190 --> 00:07:43,070 可以做一些漂亮整潔。 159 00:07:43,070 --> 00:07:46,320 >> 因此,如果我們把這種能力 得到一個字符的 160 00:07:46,320 --> 00:07:48,943 我們循環它 - 所以我們 繼續得到字符 161 00:07:48,943 --> 00:07:51,390 從一個文件過來, 過去,over--現在我們 162 00:07:51,390 --> 00:07:54,500 可以讀取每一個 字符的文件名。 163 00:07:54,500 --> 00:07:58,670 如果我們打印的每一個字符 之後我們讀它, 164 00:07:58,670 --> 00:08:01,960 我們現在已經從文件中讀取和 印刷的內容到屏幕上。 165 00:08:01,960 --> 00:08:05,610 我們已經有效地連接起來 在屏幕上該文件。 166 00:08:05,610 --> 00:08:09,670 而這正是 Linux命令的貓一樣。 167 00:08:09,670 --> 00:08:13,250 >> 如果您在文件名中鍵入的貓,它 將打印出的全部內容 168 00:08:13,250 --> 00:08:15,160 在終端窗口中的文件。 169 00:08:15,160 --> 00:08:19,010 所以這裡這個小環, 只有三行代碼, 170 00:08:19,010 --> 00:08:23,270 但它有效地複製 Linux命令貓。 171 00:08:23,270 --> 00:08:25,210 所以這個語法可能 看起來有點怪異, 172 00:08:25,210 --> 00:08:26,670 但這裡的這裡發生了什麼。 173 00:08:26,670 --> 00:08:31,460 雖然CH等於龜etc,ptr不 等於EOF--它是一個整體一口, 174 00:08:31,460 --> 00:08:34,669 但讓​​我們把它分解只 所以很明顯的語法。 175 00:08:34,669 --> 00:08:37,169 我已經鞏固了它 為求空間, 176 00:08:37,169 --> 00:08:39,049 雖然這是一個有點 語法棘手。 177 00:08:39,049 --> 00:08:41,194 >> 因此,這部分綠色右 現在,它在幹什麼? 178 00:08:41,194 --> 00:08:42,860 好吧,這只是我們的龜etc電話,對不對? 179 00:08:42,860 --> 00:08:44,530 我們已經看到過。 180 00:08:44,530 --> 00:08:49,500 它獲得一種 字符從該文件。 181 00:08:49,500 --> 00:08:53,220 然後,我們比較一下 性格對EOF。 182 00:08:53,220 --> 00:08:57,470 EOF是一個特殊的值,它是 在標準io.h,定義了 183 00:08:57,470 --> 00:08:59,390 為文件結束字符。 184 00:08:59,390 --> 00:09:03,450 所以基本上什麼事情要發生 在這個循環將讀取一個字符, 185 00:09:03,450 --> 00:09:07,445 把它比作EOF時, 文件結束符。 186 00:09:07,445 --> 00:09:10,070 如果它們不匹配,所以我們沒有 到達文件的結尾, 187 00:09:10,070 --> 00:09:11,490 我們將打印字符的。 188 00:09:11,490 --> 00:09:13,740 然後,我們將回到 重新開始循環。 189 00:09:13,740 --> 00:09:18,310 我們會得到一個字符,檢查 對EOF,打印出來,等 190 00:09:18,310 --> 00:09:21,094 等等, 以這種方式遍歷 191 00:09:21,094 --> 00:09:22,760 直到我們到達了文件的末尾。 192 00:09:22,760 --> 00:09:24,593 然後由這一點, 我們將印 193 00:09:24,593 --> 00:09:26,210 出文件的全部內容。 194 00:09:26,210 --> 00:09:29,450 所以,再一次,我們只看到 FOPEN和fclose和龜etc 195 00:09:29,450 --> 00:09:34,950 而且我們已經可以複製 Linux終端命令。 196 00:09:34,950 --> 00:09:38,850 >> 正如我在開始時說, 我們有龜etc和的fputc, 197 00:09:38,850 --> 00:09:41,860 和的fputc是伴侶 和函數fgetc的。 198 00:09:41,860 --> 00:09:44,880 所以,如你所想, 它是寫入等效。 199 00:09:44,880 --> 00:09:49,440 它可以讓我們寫一個 單個字符到一個文件。 200 00:09:49,440 --> 00:09:53,290 >> 同樣,需要注意的是,剛 就像是與龜etc,該文件 201 00:09:53,290 --> 00:09:56,660 我們正在編寫到一定發生了 打開寫入或追加。 202 00:09:56,660 --> 00:10:00,820 如果我們嘗試使用的fputc上的文件 我們已經為讀而打開, 203 00:10:00,820 --> 00:10:02,760 我們要吃虧 有點錯誤。 204 00:10:02,760 --> 00:10:04,440 但通話是非常簡單的。 205 00:10:04,440 --> 00:10:08,000 的fputc大寫的A PTR2,所有 這是怎麼回事要做的就是它的 206 00:10:08,000 --> 00:10:12,040 打算寫的信 成阿成的文件2點 207 00:10:12,040 --> 00:10:14,760 文本,這是的名稱 文件我們打開並分配 208 00:10:14,760 --> 00:10:17,280 指針PTR2。 209 00:10:17,280 --> 00:10:20,430 所以,我們要編寫一個 大寫字母A到文件2點文字。 210 00:10:20,430 --> 00:10:24,592 我們將編寫一個感嘆號 指向文件3點 211 00:10:24,592 --> 00:10:27,330 文本,這是由ptr3指出。 212 00:10:27,330 --> 00:10:29,730 如此反复,很簡單在這裡。 213 00:10:29,730 --> 00:10:32,727 >> 但是現在我們可以做的另一件事。 214 00:10:32,727 --> 00:10:34,560 我們有這樣的例子 我們只是在看 215 00:10:34,560 --> 00:10:38,950 對能夠複製貓 Linux命令,打印出一 216 00:10:38,950 --> 00:10:40,500 到屏幕上。 217 00:10:40,500 --> 00:10:43,510 好了,現在我們有能力 以從文件中讀取字符 218 00:10:43,510 --> 00:10:46,590 和寫入字符的文件, 為什麼我們不只是替換了 219 00:10:46,590 --> 00:10:50,720 調用printf一個調用的fputc。 220 00:10:50,720 --> 00:10:54,090 >> 現在,我們已經重複CP, 一個非常基本的Linux命令 221 00:10:54,090 --> 00:10:59,100 我們剛才談到的方式長 以前在Linux命令的視頻。 222 00:10:59,100 --> 00:11:01,070 我們有效地已經 重複的就在這裡。 223 00:11:01,070 --> 00:11:04,790 我們讀一個字符,然後我們 寫這個角色到另一個文件。 224 00:11:04,790 --> 00:11:07,660 從一個文件讀,寫 到另一個,遍地 225 00:11:07,660 --> 00:11:11,350 一遍又一遍,直到我們遇到EOF。 226 00:11:11,350 --> 00:11:14,250 我們一定要的到底 文件我們試圖從複製。 227 00:11:14,250 --> 00:11:18,500 而由我們自己編寫的所有 的字符,我們需要將文件 228 00:11:18,500 --> 00:11:19,500 我們正在寫。 229 00:11:19,500 --> 00:11:24,270 因此,這是CP,Linux的複製命令。 230 00:11:24,270 --> 00:11:26,550 >> 在一開始 這個視頻,我的告誡 231 00:11:26,550 --> 00:11:29,840 我們會聊 關於指針點點。 232 00:11:29,840 --> 00:11:32,480 下面是具體在哪裡我們 要談論的指針 233 00:11:32,480 --> 00:11:34,800 除了文件指針。 234 00:11:34,800 --> 00:11:37,870 所以這個功能看起來有種可怕的。 235 00:11:37,870 --> 00:11:39,120 它有幾個參數。 236 00:11:39,120 --> 00:11:40,430 有很多怎麼回事。 237 00:11:40,430 --> 00:11:42,760 有很多的不同 顏色和文字。 238 00:11:42,760 --> 00:11:47,100 但實際上,它只是 龜etc通用版 239 00:11:47,100 --> 00:11:50,110 這使我們能夠得到任何 的信息量。 240 00:11:50,110 --> 00:11:53,560 它可以是一個有點低效率的,如果我們是 獲得的字符之一的時間, 241 00:11:53,560 --> 00:11:55,770 通過文件迭代 一個字符的時間。 242 00:11:55,770 --> 00:12:00,230 那豈不是更好得到 100在一個時間或500的時間? 243 00:12:00,230 --> 00:12:03,250 >> 那麼,FR​​EAD和它的伴侶函數 FWRITE,我們將談談 244 00:12:03,250 --> 00:12:05,490 在第二,使我們能夠做到這一點。 245 00:12:05,490 --> 00:12:08,480 我們可以讀取任意數量 從文件中的信息 246 00:12:08,480 --> 00:12:10,290 我們存儲在某個地方暫時的。 247 00:12:10,290 --> 00:12:12,980 而不是能夠只 在一個變量適合它, 248 00:12:12,980 --> 00:12:15,790 我們可能需要將其存放在數組中。 249 00:12:15,790 --> 00:12:19,980 因此,我們通過在四個 參數fread--指針 250 00:12:19,980 --> 00:12:23,940 到我們的位置 要存儲的信息, 251 00:12:23,940 --> 00:12:29,180 多大每個信息單元 將成為信息多少個單位 252 00:12:29,180 --> 00:12:35,192 我們想要收購,而從 我們希望得到他們的文件。 253 00:12:35,192 --> 00:12:37,150 也許最好的說明 在這裡的一個例子。 254 00:12:37,150 --> 00:12:41,640 因此,讓我們說,我們聲明 10整數數組。 255 00:12:41,640 --> 00:12:45,080 我們在剛剛宣布 堆棧任意詮釋ARR 10。 256 00:12:45,080 --> 00:12:46,970 所以這是非常簡單的。 257 00:12:46,970 --> 00:12:51,970 現在我們正在做的雖然是什麼 frecall是我們在閱讀為int的大小 258 00:12:51,970 --> 00:12:54,180 次10字節的信息。 259 00:12:54,180 --> 00:12:59,040 INT存在尺寸four--那 在C的整數的大小。 260 00:12:59,040 --> 00:13:02,790 >> 因此,我們正在做的事情是,我們正在閱讀 40個字節的信息 261 00:13:02,790 --> 00:13:05,850 從文件指向PTR。 262 00:13:05,850 --> 00:13:08,600 我們要存儲這些 40個字節的地方 263 00:13:08,600 --> 00:13:12,080 在這裡,我們已預留 40個字節的內存。 264 00:13:12,080 --> 00:13:15,970 幸運的是,我們已經完成了由 聲明ARR,該數組就在這裡。 265 00:13:15,970 --> 00:13:19,770 是能夠保持的 10四字節單元。 266 00:13:19,770 --> 00:13:22,860 因此,在總,它可以容納40 個字節的信息。 267 00:13:22,860 --> 00:13:26,540 而我們現在正在讀40個字節 從文件的信息, 268 00:13:26,540 --> 00:13:30,330 我們正在將它存儲在編曲。 269 00:13:30,330 --> 00:13:35,470 >> 從指針的視頻回憶 的陣列,如改編的名稱, 270 00:13:35,470 --> 00:13:38,370 真的只是一個指針 其第一元件。 271 00:13:38,370 --> 00:13:43,680 所以,當我們通過在編曲那裡,我們 是的,其實,傳遞一個指針。 272 00:13:43,680 --> 00:13:46,120 >> 同樣,我們可以做的this-- 我們不一定 273 00:13:46,120 --> 00:13:51,200 需要保存我們的緩衝區在堆棧中。 274 00:13:51,200 --> 00:13:54,990 我們還可以動態地分配 一個緩衝區就是這樣,用malloc。 275 00:13:54,990 --> 00:13:57,340 請記住,當我們 動態分配內存, 276 00:13:57,340 --> 00:14:00,550 我們將其保存在 堆,而不是疊。 277 00:14:00,550 --> 00:14:02,110 但它仍然是一個緩衝區。 278 00:14:02,110 --> 00:14:06,810 >> 它仍然在這種情況下,是 保持640個字節的信息 279 00:14:06,810 --> 00:14:09,230 因為雙佔用了八個字節。 280 00:14:09,230 --> 00:14:11,570 而且我們要求為80人。 281 00:14:11,570 --> 00:14:13,770 我們希望能有空間 持有80雙打。 282 00:14:13,770 --> 00:14:17,210 因此,80倍8是640個字節的信息。 283 00:14:17,210 --> 00:14:21,880 這調用fread是 收集640個字節的信息 284 00:14:21,880 --> 00:14:27,770 從文件指向 PTR現在將它存儲在ARR2。 285 00:14:27,770 --> 00:14:32,770 >> 現在,我們也可以把FREAD 就像調用龜etc。 286 00:14:32,770 --> 00:14:37,140 在這種情況下,我們只是想 從文件中獲取一個字符。 287 00:14:37,140 --> 00:14:40,070 我們不需要 數組來保存一個字符。 288 00:14:40,070 --> 00:14:43,170 我們只需將其存放在 一個字符變量。 289 00:14:43,170 --> 00:14:46,390 >> 美中不足的,不過,是 當我們只是有一個變量, 290 00:14:46,390 --> 00:14:50,290 我們需要傳遞的 該變量的地址 291 00:14:50,290 --> 00:14:52,550 因為回想一下, 第一個參數FREAD 292 00:14:52,550 --> 00:14:59,210 是指向的位置和存儲器 在這裡我們要存儲的信息。 293 00:14:59,210 --> 00:15:01,550 再次,一個名 陣列是一個指針。 294 00:15:01,550 --> 00:15:04,200 所以我們並不需要做符號陣列。 295 00:15:04,200 --> 00:15:07,270 但是,C,字符c 這裡,不是數組。 296 00:15:07,270 --> 00:15:08,390 這只是一個變量。 297 00:15:08,390 --> 00:15:11,840 因此,我們需要傳遞一個 符號C到指示 298 00:15:11,840 --> 00:15:15,350 那這就是我們想要的地址 存儲信息的這一個字節, 299 00:15:15,350 --> 00:15:20,479 這一個字符 我們收集的PTR。 300 00:15:20,479 --> 00:15:22,270 Fwrite--我會去通過 這一點 301 00:15:22,270 --> 00:15:25,440 quickly--幾乎是 FREAD的完全等效 302 00:15:25,440 --> 00:15:27,720 除了它的寫作 而不是閱讀,只是 303 00:15:27,720 --> 00:15:31,610 像other--我們已經開 和關閉,進入一個人物, 304 00:15:31,610 --> 00:15:32,530 寫一個字。 305 00:15:32,530 --> 00:15:35,040 現在,獲得任意 的信息量, 306 00:15:35,040 --> 00:15:37,170 右的任意數量的信息。 307 00:15:37,170 --> 00:15:39,790 因此,只要像以前一樣,我們可以 有10整數數組 308 00:15:39,790 --> 00:15:43,210 在這裡我們已經有 信息存儲,也許吧。 309 00:15:43,210 --> 00:15:46,580 >> 這可能是一些代碼行 應在這兩者之間去 310 00:15:46,580 --> 00:15:49,990 在這裡我填寫常用3與 有意義的事。 311 00:15:49,990 --> 00:15:51,880 我填補它與10個不同的整數。 312 00:15:51,880 --> 00:15:54,920 而相反,就是我 做的是從編曲寫 313 00:15:54,920 --> 00:15:58,600 和收集從ARR的信息。 314 00:15:58,600 --> 00:16:02,390 我要帶的資料 把球送入該文件。 315 00:16:02,390 --> 00:16:05,410 >> 因此,而不是其被 文件到緩衝器, 316 00:16:05,410 --> 00:16:08,790 我們現在從去 緩衝區到該文件。 317 00:16:08,790 --> 00:16:10,580 因此,它正好相反。 318 00:16:10,580 --> 00:16:16,680 如此反复,就如同之前,我們就可以 也有一個內存堆塊 319 00:16:16,680 --> 00:16:19,600 我們動態地已經 分配並從閱讀 320 00:16:19,600 --> 00:16:21,570 並編寫該文件。 321 00:16:21,570 --> 00:16:24,900 >> 而且我們也有一個變量 能夠容納一個字節 322 00:16:24,900 --> 00:16:27,200 的信息,諸如字符。 323 00:16:27,200 --> 00:16:29,830 但同樣,我們需要傳遞 該變量的地址 324 00:16:29,830 --> 00:16:31,840 當我們想從中讀取。 325 00:16:31,840 --> 00:16:35,280 因此,我們可以寫信息 我們發現在該地址 326 00:16:35,280 --> 00:16:39,050 該文件指針,PTR。 327 00:16:39,050 --> 00:16:41,630 >> 還有很多其他的 大文件I / O功能 328 00:16:41,630 --> 00:16:44,650 即做各種事情,除了 那些我們已經談到了今天。 329 00:16:44,650 --> 00:16:46,450 一對夫婦的那些 你可能會發現有用 330 00:16:46,450 --> 00:16:50,840 是fgets和的fputs, 它們是等效 331 00:16:50,840 --> 00:16:56,190 的龜etc和的fputc但對於閱讀 從文件中一個字符串。 332 00:16:56,190 --> 00:16:59,020 而不是一個單一的字符, 它會讀取整個字符串。 333 00:16:59,020 --> 00:17:02,940 fprintf中,基本上允許 你用printf寫入文件。 334 00:17:02,940 --> 00:17:05,619 所以,就像你可以做 使用變量替換 335 00:17:05,619 --> 00:17:09,900 佔位符%的I和 百分之d和等,具有的printf 336 00:17:09,900 --> 00:17:14,690 你同樣可以把 printf的字符串和打印的東西 337 00:17:14,690 --> 00:17:16,800 這樣的一個文件。 338 00:17:16,800 --> 00:17:20,720 >> fseek--如果你有一台DVD播放機 就是這個比喻我通常使用這裡 - 339 00:17:20,720 --> 00:17:23,109 有點像用你 快退和快進 340 00:17:23,109 --> 00:17:25,819 按鈕移動影片各地。 341 00:17:25,819 --> 00:17:28,369 同樣,您可以在文件移動。 342 00:17:28,369 --> 00:17:30,250 一個裡面的東西 該文件的結構 343 00:17:30,250 --> 00:17:34,270 將c為您創建是一個指標 在那裡你是在文件中。 344 00:17:34,270 --> 00:17:36,420 你是在很 開始,在0字節? 345 00:17:36,420 --> 00:17:39,290 你是在字節100, 字節1000,以此類推? 346 00:17:39,290 --> 00:17:44,340 您可以使用fseek的任意移動 該指標前進或後退。 347 00:17:44,340 --> 00:17:46,744 >> 而FTELL,再次 類似於DVD播放機, 348 00:17:46,744 --> 00:17:49,660 就像一個小時鐘,告訴 你有多少分鐘,你秒 349 00:17:49,660 --> 00:17:52,480 是到特定的電影。 350 00:17:52,480 --> 00:17:56,990 同樣,FTELL告訴您如何 你是到文件的字節數。 351 00:17:56,990 --> 00:18:00,210 的feof是一個不同的版本 檢測你是否已經 352 00:18:00,210 --> 00:18:01,700 到達文件的結尾。 353 00:18:01,700 --> 00:18:03,600 和ferror是一個函數 您可以使用 354 00:18:03,600 --> 00:18:06,959 檢測到的東西是否有 出了問題的工作與文件。 355 00:18:06,959 --> 00:18:08,750 同樣,這僅僅是 表面文章。 356 00:18:08,750 --> 00:18:12,730 仍然有很多更多的文件I / O 在標準io.h.功能 357 00:18:12,730 --> 00:18:16,620 但是,這可能會得到你 開始與文件指針工作。 358 00:18:16,620 --> 00:18:17,640 我是道格·勞埃德。 359 00:18:17,640 --> 00:18:19,750 這是CS50。 360 00:18:19,750 --> 00:18:21,669