1 00:00:00,000 --> 00:00:05,330 2 00:00:05,330 --> 00:00:07,870 >> SPEAKER: Cho đến nay, nó có khả năng mà hầu hết các chương trình của bạn 3 00:00:07,870 --> 00:00:10,170 có được một chút phù du. 4 00:00:10,170 --> 00:00:13,310 Bạn chạy một chương trình như Mario hay tham lam. 5 00:00:13,310 --> 00:00:17,350 Nó làm điều gì đó, nó có thể nhắc nhở người sử dụng đối với một số thông tin, 6 00:00:17,350 --> 00:00:20,400 in một số đầu ra cho màn hình, nhưng sau đó khi chương trình của bạn đã kết thúc, 7 00:00:20,400 --> 00:00:23,252 có thực sự không có bằng chứng nó đã từng chạy ở nơi đầu tiên. 8 00:00:23,252 --> 00:00:25,960 Ý tôi là, chắc chắn, bạn có thể đã rời nó mở trong cửa sổ thiết bị đầu cuối, 9 00:00:25,960 --> 00:00:29,770 nhưng nếu bạn xóa màn hình của bạn, có thực sự không có bằng chứng rằng nó tồn tại. 10 00:00:29,770 --> 00:00:33,720 Chúng tôi không có một phương tiện lưu trữ thông tin liên tục, thông tin 11 00:00:33,720 --> 00:00:36,890 mà tồn tại sau khi chúng tôi chương trình đã ngừng hoạt động, 12 00:00:36,890 --> 00:00:39,241 hoặc chúng ta không có được đến thời điểm này. 13 00:00:39,241 --> 00:00:41,490 May mắn thay, mặc dù c làm cung cấp cho chúng tôi với khả năng 14 00:00:41,490 --> 00:00:44,220 để làm điều này bằng cách thực hiện một cái gì đó gọi là 15 00:00:44,220 --> 00:00:48,330 một tập tin, một cấu trúc mà về cơ bản đại diện cho một tập tin mà bạn sẽ tăng gấp đôi 16 00:00:48,330 --> 00:00:53,826 bấm vào máy tính của bạn, nếu bạn sử dụng một môi trường người dùng đồ họa. 17 00:00:53,826 --> 00:00:55,700 Nói chung khi làm việc với c, chúng tôi thực sự 18 00:00:55,700 --> 00:00:59,965 sẽ được làm việc với con trỏ đến tập tin stars-- files-- 19 00:00:59,965 --> 00:01:02,090 ngoại trừ một chút khi chúng ta nói về một cặp vợ chồng 20 00:01:02,090 --> 00:01:04,560 các chức năng mà làm việc với các tập tin con trỏ. 21 00:01:04,560 --> 00:01:08,990 Bạn không cần phải có sự đào quá sâu vào con trỏ hiểu biết 22 00:01:08,990 --> 00:01:09,730 bản thân. 23 00:01:09,730 --> 00:01:12,870 Có một chút teeny nhỏ nơi mà chúng tôi sẽ nói về họ, 24 00:01:12,870 --> 00:01:18,090 nhưng nói chung là tập con trỏ và con trỏ, trong khi quan hệ với nhau, 25 00:01:18,090 --> 00:01:20,290 là không chính xác những điều tương tự. 26 00:01:20,290 --> 00:01:22,440 >> Bây giờ tôi có ý nghĩa gì khi Tôi nói dữ liệu bền vững? 27 00:01:22,440 --> 00:01:23,650 Dữ liệu bền vững là gì? 28 00:01:23,650 --> 00:01:25,232 Tại sao chúng ta quan tâm đến nó? 29 00:01:25,232 --> 00:01:27,190 Nói, ví dụ, rằng bạn đang chạy một chương trình 30 00:01:27,190 --> 00:01:29,850 hoặc bạn đã viết lại một chương trình đó là một trò chơi, 31 00:01:29,850 --> 00:01:32,960 và bạn muốn theo dõi của tất cả các chuyển động của người dùng 32 00:01:32,960 --> 00:01:36,620 vì vậy mà có lẽ nếu có điều gì sai, bạn có thể xem các tập tin sau trận đấu. 33 00:01:36,620 --> 00:01:39,970 Đó là những gì chúng tôi có nghĩa là khi chúng ta nói về dữ liệu liên tục. 34 00:01:39,970 --> 00:01:43,930 >> Trong quá trình chạy của bạn chương trình, một tập tin được tạo ra. 35 00:01:43,930 --> 00:01:45,680 Và khi chương trình của bạn đã ngừng hoạt động, 36 00:01:45,680 --> 00:01:48,689 tập tin đó vẫn còn tồn tại trên hệ thống của bạn. 37 00:01:48,689 --> 00:01:50,230 Và chúng ta có thể nhìn vào nó và kiểm tra nó. 38 00:01:50,230 --> 00:01:53,670 Và do đó, chương trình sẽ được thiết lập để đã tạo ra một số dữ liệu liên tục, 39 00:01:53,670 --> 00:01:57,390 dữ liệu tồn tại sau khi chương trình đã chạy xong. 40 00:01:57,390 --> 00:02:02,320 >> Bây giờ tất cả những chức năng mà làm việc với việc tạo ra các tập tin và thao tác 41 00:02:02,320 --> 00:02:04,940 chúng theo nhiều cách khác nhau sống trong io.h tiêu chuẩn, 42 00:02:04,940 --> 00:02:08,210 mà là một tập tin tiêu đề bạn đã có thể được cân 43 00:02:08,210 --> 00:02:10,910 bao gồm cả ở đầu khá nhiều tất cả các chương trình của bạn 44 00:02:10,910 --> 00:02:14,130 bởi vì nó có chứa một trong những hầu hết các chức năng hữu ích cho chúng ta, 45 00:02:14,130 --> 00:02:16,130 printf, mà còn cho phép sống trong io.h. chuẩn 46 00:02:16,130 --> 00:02:20,400 Vì vậy, bạn không cần phải nhốt bao gồm bất kỳ tập tin bổ sung có thể 47 00:02:20,400 --> 00:02:23,540 để làm việc với các tập tin con trỏ. 48 00:02:23,540 --> 00:02:29,980 >> Bây giờ mỗi chức năng con trỏ tập tin duy nhất, hoặc mỗi tập tin duy nhất I / O, đầu ra đầu vào 49 00:02:29,980 --> 00:02:33,310 chức năng, chấp nhận như là một các thông số đầu vào của nó hay 50 00:02:33,310 --> 00:02:35,822 một pointer-- tập tin ngoại trừ cho một, fopen, mà 51 00:02:35,822 --> 00:02:38,280 là những gì bạn sử dụng để có được các tập tin con trỏ ở nơi đầu tiên. 52 00:02:38,280 --> 00:02:41,010 Nhưng sau khi bạn đã mở nộp và bạn nhận được tập tin con trỏ, 53 00:02:41,010 --> 00:02:43,510 sau đó bạn có thể vượt qua chúng như đối số cho các chức năng khác nhau 54 00:02:43,510 --> 00:02:46,720 chúng ta sẽ nói về ngày hôm nay, cũng như nhiều người khác 55 00:02:46,720 --> 00:02:48,520 để bạn có thể làm việc với các tập tin. 56 00:02:48,520 --> 00:02:50,980 >> Vì vậy, có sáu khá những cái cơ bản chung 57 00:02:50,980 --> 00:02:52,870 rằng chúng ta sẽ nói đến hôm nay. 58 00:02:52,870 --> 00:02:57,160 fopen và đồng hành của nó Hàm fclose, fgetc 59 00:02:57,160 --> 00:03:02,670 và chức năng đồng hành của nó fputc, và fread và chức năng đồng hành của nó, 60 00:03:02,670 --> 00:03:03,820 fwrite. 61 00:03:03,820 --> 00:03:05,180 Vì vậy, hãy thẳng vào nó. 62 00:03:05,180 --> 00:03:07,050 >> fopen-- nó làm gì? 63 00:03:07,050 --> 00:03:10,050 Vâng, nó sẽ mở ra một tập tin và nó mang đến cho bạn một con trỏ tập tin vào nó, 64 00:03:10,050 --> 00:03:14,000 vì vậy mà sau đó bạn có thể sử dụng nộp con trỏ như một đối số 65 00:03:14,000 --> 00:03:16,730 với bất kỳ tập tin khác I / O chức năng. 66 00:03:16,730 --> 00:03:19,100 Điều quan trọng nhất nhớ với fopen 67 00:03:19,100 --> 00:03:24,222 được rằng sau khi bạn đã mở file hoặc thực hiện một cuộc gọi như một ở đây, 68 00:03:24,222 --> 00:03:26,930 bạn cần kiểm tra để đảm bảo mà con trỏ mà bạn đã trở lại 69 00:03:26,930 --> 00:03:28,320 không bằng null. 70 00:03:28,320 --> 00:03:31,320 Nếu bạn không theo dõi các video trên con trỏ, điều này có thể không có ý nghĩa. 71 00:03:31,320 --> 00:03:35,639 Nhưng nếu bạn cố gắng và tới đích thu hồi con trỏ null, 72 00:03:35,639 --> 00:03:38,180 chương trình của bạn có thể sẽ phải chịu đựng một phân đoạn [không nghe được]. 73 00:03:38,180 --> 00:03:40,540 Chúng tôi muốn đảm bảo rằng chúng tôi có một con trỏ trở lại hợp pháp. 74 00:03:40,540 --> 00:03:43,665 Phần lớn thời gian chúng tôi sẽ đã nhận được một con trỏ hợp pháp trở lại 75 00:03:43,665 --> 00:03:45,280 và nó sẽ không là một vấn đề. 76 00:03:45,280 --> 00:03:46,760 >> Vì vậy, làm thế nào để chúng tôi thực hiện một cuộc gọi đến fopen? 77 00:03:46,760 --> 00:03:48,051 Nó trông khá nhiều như thế này. 78 00:03:48,051 --> 00:03:52,690 Tập tin sao ptr-- ptr là một generic đặt tên cho tập tin pointer-- fopen 79 00:03:52,690 --> 00:03:57,300 và chúng tôi vượt qua trong hai điều, một tên tập tin và một hoạt động, chúng tôi muốn thực hiện. 80 00:03:57,300 --> 00:04:01,690 Vì vậy, chúng ta có thể có một cuộc gọi mà trông giống như this-- ptr sao tập 1 bằng fopen 81 00:04:01,690 --> 00:04:04,040 file1.txt. 82 00:04:04,040 --> 00:04:07,020 Và các hoạt động tôi đã chọn là r. 83 00:04:07,020 --> 00:04:08,639 >> Vậy điều gì làm bạn nghĩ rằng r là ở đây? 84 00:04:08,639 --> 00:04:11,180 Các loại của sự vật là những gì chúng tôi có thể có thể làm cho các tập tin? 85 00:04:11,180 --> 00:04:13,760 86 00:04:13,760 --> 00:04:17,500 Vì vậy, r là các hoạt động mà chúng ta chọn khi chúng ta muốn đọc một tập tin. 87 00:04:17,500 --> 00:04:20,260 Vì vậy, chúng ta sẽ cơ bản khi chúng tôi thực hiện cuộc gọi như thế này 88 00:04:20,260 --> 00:04:25,440 nhận được bản thân mình một con trỏ tập tin như vậy mà sau đó chúng ta có thể đọc thông tin 89 00:04:25,440 --> 00:04:27,770 từ file1.txt. 90 00:04:27,770 --> 00:04:34,190 >> Tương tự như vậy, chúng ta có thể mở tập tin 2.txt cho văn bản và vì vậy chúng tôi có thể vượt qua ptr2, 91 00:04:34,190 --> 00:04:38,210 con trỏ tập tin tôi đã tạo ra ở đây, như một tham số để bất kỳ chức năng 92 00:04:38,210 --> 00:04:40,080 ghi thông tin vào một tập tin. 93 00:04:40,080 --> 00:04:43,767 Và tương tự như văn bản, có Cũng có tùy chọn để phụ thêm, một. 94 00:04:43,767 --> 00:04:45,600 Sự khác biệt giữa bằng văn bản và phụ thêm 95 00:04:45,600 --> 00:04:50,920 được rằng khi bạn viết thư cho một tập tin, nếu bạn thực hiện một cuộc gọi đến fopen cho văn bản 96 00:04:50,920 --> 00:04:54,761 và tập tin đã tồn tại, đó là sẽ ghi đè lên toàn bộ tập tin. 97 00:04:54,761 --> 00:04:56,510 Nó sẽ bắt đầu ngay từ đầu, 98 00:04:56,510 --> 00:04:58,820 xóa tất cả các thông tin đó là đã có. 99 00:04:58,820 --> 00:05:02,210 >> Trong khi đó nếu bạn mở nó để phụ thêm, nó sẽ đi đến tận cùng của tập tin 100 00:05:02,210 --> 00:05:04,340 nếu có đã được văn bản trong nó hoặc thông tin trong đó, 101 00:05:04,340 --> 00:05:06,040 và sau đó nó sẽ bắt đầu viết từ đó. 102 00:05:06,040 --> 00:05:08,570 Vì vậy, bạn sẽ không mất bất kỳ thông tin mà bạn đã làm trước đó. 103 00:05:08,570 --> 00:05:12,110 Cho dù bạn muốn viết hoặc gắn thêm loại phụ thuộc vào tình hình. 104 00:05:12,110 --> 00:05:16,840 Nhưng có thể bạn sẽ biết những gì hoạt động đúng là khi thời gian đến. 105 00:05:16,840 --> 00:05:18,020 Vì vậy, đó là fopen. 106 00:05:18,020 --> 00:05:18,930 >> Những gì về fclose? 107 00:05:18,930 --> 00:05:21,600 Vâng, khá đơn giản, fclose chỉ chấp nhận con trỏ tập tin. 108 00:05:21,600 --> 00:05:24,000 Và như bạn mong đợi, nó đóng tập tin đó. 109 00:05:24,000 --> 00:05:29,270 Và một khi chúng ta đã đóng một tập tin, chúng ta không thể thực hiện bất kỳ tập tin I / O chức năng, 110 00:05:29,270 --> 00:05:31,420 đọc hoặc viết, trên tập tin đó. 111 00:05:31,420 --> 00:05:36,444 Chúng ta phải mở lại nộp một thời điểm khác để 112 00:05:36,444 --> 00:05:38,610 để tiếp tục làm việc với nó sử dụng các chức năng I / O. 113 00:05:38,610 --> 00:05:41,520 Vì vậy, phương tiện fclose chúng tôi đang thực hiện làm việc với các tập tin này. 114 00:05:41,520 --> 00:05:44,690 Và tất cả chúng ta cần phải vượt qua trong là tên của một con trỏ tập tin. 115 00:05:44,690 --> 00:05:50,010 Vì vậy, trên một vài trang trình bày trước, chúng tôi fopened tập 1 dot văn bản để đọc 116 00:05:50,010 --> 00:05:52,854 và chúng tôi giao mà nộp con trỏ tới ptr1. 117 00:05:52,854 --> 00:05:55,020 Bây giờ chúng tôi đã quyết định chúng tôi thực hiện đọc từ tập tin đó. 118 00:05:55,020 --> 00:05:56,561 Chúng tôi không cần phải làm bất cứ hơn với nó. 119 00:05:56,561 --> 00:05:58,890 Chúng tôi có thể ptr1 chỉ fclose. 120 00:05:58,890 --> 00:06:01,950 Và tương tự, có thể chúng tôi fclose những người khác. 121 00:06:01,950 --> 00:06:02,450 Được rồi. 122 00:06:02,450 --> 00:06:03,700 Vì vậy, đó là mở cửa và đóng cửa. 123 00:06:03,700 --> 00:06:05,780 Đó là hai cơ bản bắt đầu hoạt động. 124 00:06:05,780 --> 00:06:08,050 >> Bây giờ chúng tôi muốn thực sự làm một số công cụ thú vị, 125 00:06:08,050 --> 00:06:11,940 và các chức năng đầu tiên mà chúng tôi sẽ thấy rằng sẽ làm điều đó là fgetc-- 126 00:06:11,940 --> 00:06:14,110 nộp được một nhân vật. 127 00:06:14,110 --> 00:06:17,350 Đó là những gì fgetc thường sẽ dịch cho. 128 00:06:17,350 --> 00:06:20,190 Mục tiêu của nó trong cuộc sống là để đọc các ký tự tiếp theo, 129 00:06:20,190 --> 00:06:22,079 hoặc nếu điều này là rất của bạn Cuộc gọi đầu tiên để fgetc 130 00:06:22,079 --> 00:06:23,870 cho một tập tin cụ thể, ký tự đầu tiên. 131 00:06:23,870 --> 00:06:26,210 Nhưng rồi sau đó, bạn sẽ có được một kế tiếp, 132 00:06:26,210 --> 00:06:31,500 các nhân vật rất tiếp theo của tập tin đó, và lưu trữ nó trong một biến nhân vật. 133 00:06:31,500 --> 00:06:34,490 Như chúng ta đã thực hiện ở đây, char ch bằng fgetc, 134 00:06:34,490 --> 00:06:36,389 vượt qua trong tên của một con trỏ tập tin. 135 00:06:36,389 --> 00:06:38,180 Một lần nữa, nó rất quan trọng ở đây để nhớ 136 00:06:38,180 --> 00:06:41,430 rằng để có hoạt động này thành công, 137 00:06:41,430 --> 00:06:45,690 con trỏ tập tin bản thân có lẽ đã được mở để đọc. 138 00:06:45,690 --> 00:06:50,589 Chúng tôi không thể đọc một ký tự từ một tập tin con trỏ mà chúng tôi đã mở cho văn bản. 139 00:06:50,589 --> 00:06:52,630 Vì vậy, đó là một trong những hạn chế của fopen, phải không? 140 00:06:52,630 --> 00:06:55,470 Chúng tôi phải hạn chế mình chỉ biểu diễn 141 00:06:55,470 --> 00:06:57,710 một hoạt động với một con trỏ tập tin. 142 00:06:57,710 --> 00:07:00,220 Nếu chúng ta muốn đọc và viết từ cùng một tập tin, 143 00:07:00,220 --> 00:07:03,840 chúng ta sẽ phải mở hai riêng biệt tập tin con trỏ đến file-- cùng 144 00:07:03,840 --> 00:07:05,670 một cho đọc, một cho văn bản. 145 00:07:05,670 --> 00:07:08,400 >> Vì vậy, một lần nữa, lý do duy nhất Tôi mang lại cho rằng ngay bây giờ là 146 00:07:08,400 --> 00:07:11,920 bởi vì nếu chúng ta thực hiện cuộc gọi để fgetc, rằng con trỏ tập tin chắc hẳn 147 00:07:11,920 --> 00:07:14,172 được mở để đọc. 148 00:07:14,172 --> 00:07:15,880 Và sau đó khá đơn giản, tất cả chúng ta cần phải làm 149 00:07:15,880 --> 00:07:17,546 là vượt qua trong tên của con trỏ file. 150 00:07:17,546 --> 00:07:21,060 Vì vậy, ch char bằng ptr1 fgetc. 151 00:07:21,060 --> 00:07:23,200 >> Điều đó sẽ được chúng tôi các character-- tiếp theo 152 00:07:23,200 --> 00:07:25,575 hoặc một lần nữa, nếu đây là lần đầu tiên Hiện chúng tôi đã thực hiện cuộc gọi này, 153 00:07:25,575 --> 00:07:29,750 các character-- đầu tiên của bất cứ điều gì tập tin được trỏ đến bởi ptr1. 154 00:07:29,750 --> 00:07:32,210 Nhớ lại rằng đó là tập 1 dot văn bản. 155 00:07:32,210 --> 00:07:36,490 Nó sẽ nhận được các ký tự đầu tiên của mà và chúng tôi sẽ lưu trữ nó trong ch biến. 156 00:07:36,490 --> 00:07:37,941 Khá dễ dàng. 157 00:07:37,941 --> 00:07:40,190 Vì vậy, chúng tôi đã chỉ nhìn vào ba chức năng và đã được chúng tôi 158 00:07:40,190 --> 00:07:43,070 có thể làm một cái gì đó khá gọn gàng. 159 00:07:43,070 --> 00:07:46,320 >> Vì vậy, nếu chúng ta mất khả năng này nhận được một nhân vật 160 00:07:46,320 --> 00:07:48,943 và chúng ta lặp it-- vì vậy chúng tôi tiếp tục nhận được ký tự 161 00:07:48,943 --> 00:07:51,390 từ một file trên và hơn và over-- bây giờ chúng tôi 162 00:07:51,390 --> 00:07:54,500 có thể đọc tất cả các đơn nhân vật của một tập tin. 163 00:07:54,500 --> 00:07:58,670 Và nếu chúng ta in ra mọi vật ngay lập tức sau khi chúng ta đọc nó, 164 00:07:58,670 --> 00:08:01,960 bây giờ chúng tôi đã đọc từ một tập tin và in nội dung của nó vào màn hình. 165 00:08:01,960 --> 00:08:05,610 Chúng tôi đã nối hiệu quả tập tin đó trên màn hình. 166 00:08:05,610 --> 00:08:09,670 Và đó là những gì Linux lệnh mèo nào. 167 00:08:09,670 --> 00:08:13,250 >> Nếu bạn gõ mèo trong tên tập tin, nó sẽ in ra toàn bộ nội dung 168 00:08:13,250 --> 00:08:15,160 của các tập tin trong cửa sổ thiết bị đầu cuối của bạn. 169 00:08:15,160 --> 00:08:19,010 Và như vậy vòng lặp này ít ở đây, chỉ có ba dòng mã, 170 00:08:19,010 --> 00:08:23,270 nhưng nó có hiệu quả nhân đôi lệnh cat Linux. 171 00:08:23,270 --> 00:08:25,210 Vì vậy, điều này có thể cú pháp nhìn một chút lạ, 172 00:08:25,210 --> 00:08:26,670 nhưng đây là những gì đang xảy ra ở đây. 173 00:08:26,670 --> 00:08:31,460 Trong khi ch bằng fgetc, ptr không phải là bằng EOF-- đó là cả một ngụm, 174 00:08:31,460 --> 00:08:34,669 nhưng chúng ta hãy phá vỡ nó xuống chỉ do đó, nó là rõ ràng về cú pháp. 175 00:08:34,669 --> 00:08:37,169 Tôi đã củng cố nó vì lợi ích của không gian, 176 00:08:37,169 --> 00:08:39,049 mặc dù nó là một chút cú pháp phức tạp. 177 00:08:39,049 --> 00:08:41,194 >> Vì vậy, phần này trong xanh ngay Hiện tại, những gì là nó đang làm gì? 178 00:08:41,194 --> 00:08:42,860 Vâng, đó chỉ là cuộc gọi fgetc của chúng tôi, phải không? 179 00:08:42,860 --> 00:08:44,530 Chúng tôi đã nhìn thấy rằng trước. 180 00:08:44,530 --> 00:08:49,500 Nó có được một nhân vật từ các tập tin. 181 00:08:49,500 --> 00:08:53,220 Sau đó, chúng ta so sánh rằng nhân vật chống lại EOF. 182 00:08:53,220 --> 00:08:57,470 EOF là một giá trị đặc biệt đó là quy định tại io.h tiêu chuẩn, mà 183 00:08:57,470 --> 00:08:59,390 là kết thúc của nhân vật tập tin. 184 00:08:59,390 --> 00:09:03,450 Vì vậy, về cơ bản những gì sẽ xảy ra được lặp này sẽ đọc một ký tự, 185 00:09:03,450 --> 00:09:07,445 so sánh nó với EOF, các kết thúc của nhân vật tập tin. 186 00:09:07,445 --> 00:09:10,070 Nếu họ không phù hợp, vì vậy chúng tôi có không đạt đến kết thúc của tập tin, 187 00:09:10,070 --> 00:09:11,490 chúng tôi sẽ in ra ký tự đó. 188 00:09:11,490 --> 00:09:13,740 Sau đó chúng tôi sẽ quay trở lại bắt đầu của vòng lặp lại. 189 00:09:13,740 --> 00:09:18,310 Chúng tôi sẽ có được một nhân vật, kiểm tra chống lại EOF, in ra, và như vậy 190 00:09:18,310 --> 00:09:21,094 và như vậy và như vậy, Looping qua theo cách đó 191 00:09:21,094 --> 00:09:22,760 cho đến khi chúng tôi đã đạt đến cuối của tập tin. 192 00:09:22,760 --> 00:09:24,593 Và sau đó bởi thời điểm đó, chúng tôi sẽ có in 193 00:09:24,593 --> 00:09:26,210 ra toàn bộ nội dung của tập tin. 194 00:09:26,210 --> 00:09:29,450 Vì vậy, một lần nữa, chúng tôi đã chỉ nhìn thấy fopen, fclose, và fgetc 195 00:09:29,450 --> 00:09:34,950 và đã được chúng ta có thể nhân đôi một lệnh Linux terminal. 196 00:09:34,950 --> 00:09:38,850 >> Như tôi đã nói ở đầu, chúng tôi đã có fgetc và fputc, 197 00:09:38,850 --> 00:09:41,860 và fputc là bạn đồng hành chức năng của fgetc. 198 00:09:41,860 --> 00:09:44,880 Và như vậy, như bạn có thể tưởng tượng, nó là các văn bản tương đương. 199 00:09:44,880 --> 00:09:49,440 Nó cho phép chúng ta viết nhân vật duy nhất vào một tập tin. 200 00:09:49,440 --> 00:09:53,290 >> Một lần nữa, sự báo trước được, chỉ như nó là các fgetc, các tập tin 201 00:09:53,290 --> 00:09:56,660 rằng chúng tôi đang viết để chắc hẳn được mở ra cho văn bản hoặc cho phụ thêm. 202 00:09:56,660 --> 00:10:00,820 Nếu chúng ta cố gắng và sử dụng fputc vào một tập tin mà chúng tôi đã mở để đọc, 203 00:10:00,820 --> 00:10:02,760 chúng ta sẽ phải chịu đựng một chút của một sai lầm. 204 00:10:02,760 --> 00:10:04,440 Nhưng các cuộc gọi là khá đơn giản. 205 00:10:04,440 --> 00:10:08,000 vốn fputc A ptr2, tất cả đó là sẽ làm là nó 206 00:10:08,000 --> 00:10:12,040 sẽ viết thư vào A vào tập tin 2 dot 207 00:10:12,040 --> 00:10:14,760 văn bản, mà là tên của tập tin mà chúng tôi đã mở và giao 208 00:10:14,760 --> 00:10:17,280 con trỏ đến ptr2. 209 00:10:17,280 --> 00:10:20,430 Vì vậy, chúng ta sẽ viết vốn A nộp 2 dot văn bản. 210 00:10:20,430 --> 00:10:24,592 Và chúng ta sẽ viết một dấu chấm than chỉ nộp 3 dot 211 00:10:24,592 --> 00:10:27,330 văn bản, mà đã được trỏ đến bởi ptr3. 212 00:10:27,330 --> 00:10:29,730 Vì vậy, một lần nữa, khá đơn giản ở đây. 213 00:10:29,730 --> 00:10:32,727 >> Nhưng bây giờ chúng ta có thể làm một chuyện khác. 214 00:10:32,727 --> 00:10:34,560 Chúng tôi có ví dụ này chúng tôi chỉ đi qua 215 00:10:34,560 --> 00:10:38,950 về việc có thể để nhân rộng các con mèo Linux lệnh, một trong đó in ra 216 00:10:38,950 --> 00:10:40,500 vào màn hình. 217 00:10:40,500 --> 00:10:43,510 Vâng, bây giờ mà chúng tôi có khả năng đọc các ký tự từ các tập tin 218 00:10:43,510 --> 00:10:46,590 và viết các ký tự vào các tập tin, tại sao chúng ta không chỉ cần thay thế đó 219 00:10:46,590 --> 00:10:50,720 gọi printf với một cuộc gọi đến fputc. 220 00:10:50,720 --> 00:10:54,090 >> Và bây giờ chúng tôi đã nhân đôi cp, một lệnh Linux cơ bản 221 00:10:54,090 --> 00:10:59,100 mà chúng ta đã nói về chặng đường dài trước đây trong Linux lệnh video. 222 00:10:59,100 --> 00:11:01,070 Chúng tôi đã có hiệu quả nhân đôi mà ngay tại đây. 223 00:11:01,070 --> 00:11:04,790 Chúng tôi đang đọc một nhân vật và sau đó chúng tôi viết rằng nhân vật đến một file khác. 224 00:11:04,790 --> 00:11:07,660 Đọc từ một tập tin, văn bản khác, hơn và hơn 225 00:11:07,660 --> 00:11:11,350 và hơn nữa cho đến khi chúng ta nhấn EOF. 226 00:11:11,350 --> 00:11:14,250 Chúng ta phải kết thúc nộp, chúng tôi đang cố gắng để sao chép từ. 227 00:11:14,250 --> 00:11:18,500 Và bằng cách đó chúng tôi sẽ có văn bản tất cả của các nhân vật chúng ta cần phải tập tin 228 00:11:18,500 --> 00:11:19,500 mà chúng tôi muốn gửi đến. 229 00:11:19,500 --> 00:11:24,270 Vì vậy, đây là cp, các lệnh sao chép Linux. 230 00:11:24,270 --> 00:11:26,550 >> Vào lúc bắt đầu của video này, tôi đã có sự báo trước 231 00:11:26,550 --> 00:11:29,840 rằng chúng ta sẽ nói chuyện một chút chút về con trỏ. 232 00:11:29,840 --> 00:11:32,480 Dưới đây là cụ thể mà chúng tôi sẽ nói về con trỏ 233 00:11:32,480 --> 00:11:34,800 thêm vào tập tin con trỏ. 234 00:11:34,800 --> 00:11:37,870 Vì vậy, chức năng này có vẻ loại đáng sợ. 235 00:11:37,870 --> 00:11:39,120 Nó có một vài thông số. 236 00:11:39,120 --> 00:11:40,430 Có rất nhiều xảy ra ở đây. 237 00:11:40,430 --> 00:11:42,760 Có rất nhiều khác nhau màu sắc và văn bản. 238 00:11:42,760 --> 00:11:47,100 Nhưng thực sự, nó chỉ là phiên bản chung của fgetc 239 00:11:47,100 --> 00:11:50,110 cho phép chúng tôi để có được bất kỳ lượng thông tin. 240 00:11:50,110 --> 00:11:53,560 Nó có thể là một chút không hiệu quả nếu chúng tôi nhận các ký tự cùng một lúc, 241 00:11:53,560 --> 00:11:55,770 lặp lại thông qua các tập tin một ký tự tại một thời điểm. 242 00:11:55,770 --> 00:12:00,230 Nó sẽ không thể đẹp hơn để có được 100 tại một thời điểm hoặc 500 tại một thời điểm? 243 00:12:00,230 --> 00:12:03,250 >> Vâng, fread và chức năng đồng hành của nó fwrite, mà chúng tôi sẽ nói về 244 00:12:03,250 --> 00:12:05,490 trong một giây, cho phép chúng tôi làm việc đó. 245 00:12:05,490 --> 00:12:08,480 Chúng ta có thể đọc một số lượng tùy ý các thông tin từ một tập tin 246 00:12:08,480 --> 00:12:10,290 và chúng ta lưu trữ nó ở đâu đó tạm thời. 247 00:12:10,290 --> 00:12:12,980 Thay vào đó là có thể chỉ phù hợp với nó trong một biến duy nhất, 248 00:12:12,980 --> 00:12:15,790 chúng ta có thể cần phải lưu trữ nó trong một mảng. 249 00:12:15,790 --> 00:12:19,980 Và như vậy, chúng tôi vượt qua trong bốn lập luận để fread-- một con trỏ 250 00:12:19,980 --> 00:12:23,940 đến vị trí mà chúng tôi đi để lưu trữ thông tin, 251 00:12:23,940 --> 00:12:29,180 lớn như thế nào mỗi đơn vị thông tin sẽ có bao nhiêu đơn vị thông tin 252 00:12:29,180 --> 00:12:35,192 chúng tôi muốn có được, và từ tập tin đó, chúng tôi muốn có được chúng. 253 00:12:35,192 --> 00:12:37,150 Có lẽ tốt nhất minh họa với một ví dụ ở đây. 254 00:12:37,150 --> 00:12:41,640 Vì vậy, chúng ta hãy nói rằng chúng ta khai báo một mảng 10 số nguyên. 255 00:12:41,640 --> 00:12:45,080 Chúng tôi đã chỉ cần khai báo trên ngăn xếp tùy tiện int arr 10. 256 00:12:45,080 --> 00:12:46,970 Vì vậy, đó là khá đơn giản. 257 00:12:46,970 --> 00:12:51,970 Bây giờ những gì chúng tôi đang làm dù là frecall là chúng ta đang đọc kích thước của int 258 00:12:51,970 --> 00:12:54,180 lần 10 byte thông tin. 259 00:12:54,180 --> 00:12:59,040 Kích thước của int phúc four-- đó kích thước của một số nguyên trong c. 260 00:12:59,040 --> 00:13:02,790 >> Vì vậy, những gì chúng tôi đang làm là chúng ta đang đọc 40 byte giá trị của thông tin 261 00:13:02,790 --> 00:13:05,850 từ tập tin trỏ đến bởi ptr. 262 00:13:05,850 --> 00:13:08,600 Và chúng tôi đang lưu trữ những 40 byte một nơi nào đó 263 00:13:08,600 --> 00:13:12,080 nơi mà chúng tôi đã đặt sang một bên 40 byte giá trị của bộ nhớ. 264 00:13:12,080 --> 00:13:15,970 May mắn thay, chúng tôi đã làm điều đó bằng cách tuyên bố arr, mảng mà ngay tại đó. 265 00:13:15,970 --> 00:13:19,770 Đó là khả năng nắm giữ 10 đơn vị bốn byte. 266 00:13:19,770 --> 00:13:22,860 Vì vậy, trong tổng số, nó có thể chứa 40 byte giá trị của thông tin. 267 00:13:22,860 --> 00:13:26,540 Và bây giờ chúng ta đang đọc 40 byte thông tin từ các tập tin, 268 00:13:26,540 --> 00:13:30,330 và chúng tôi đang lưu trữ nó trong arr. 269 00:13:30,330 --> 00:13:35,470 >> Nhớ lại từ video trên con trỏ đó tên của một mảng, chẳng hạn như arr, 270 00:13:35,470 --> 00:13:38,370 thực sự chỉ là một con trỏ đến phần tử đầu tiên của nó. 271 00:13:38,370 --> 00:13:43,680 Vì vậy, khi chúng tôi vượt qua trong arr đó, chúng tôi là, trên thực tế, đi qua trong một con trỏ. 272 00:13:43,680 --> 00:13:46,120 >> Tương tự như vậy chúng ta có thể làm this-- chúng tôi không nhất thiết phải 273 00:13:46,120 --> 00:13:51,200 cần phải lưu đệm của chúng tôi trên stack. 274 00:13:51,200 --> 00:13:54,990 Chúng tôi cũng có thể tự động phân bổ một bộ đệm như thế này, sử dụng malloc. 275 00:13:54,990 --> 00:13:57,340 Hãy nhớ rằng, khi chúng ta tự động phân bổ bộ nhớ, 276 00:13:57,340 --> 00:14:00,550 chúng tôi đang tiết kiệm nó trên đống, không stack. 277 00:14:00,550 --> 00:14:02,110 Nhưng nó vẫn là một bộ đệm. 278 00:14:02,110 --> 00:14:06,810 >> Nó vẫn còn, trong trường hợp này, là giữ 640 byte thông tin 279 00:14:06,810 --> 00:14:09,230 vì một đôi chiếm tám byte. 280 00:14:09,230 --> 00:14:11,570 Và chúng tôi đang yêu cầu 80 người trong số họ. 281 00:14:11,570 --> 00:14:13,770 Chúng tôi muốn có không gian giữ 80 đôi. 282 00:14:13,770 --> 00:14:17,210 Vì vậy, 80 lần 8 là 640 byte thông tin. 283 00:14:17,210 --> 00:14:21,880 Và đó gọi là fread thu 640 byte thông tin 284 00:14:21,880 --> 00:14:27,770 từ tập tin trỏ đến bởi ptr và lưu trữ nó bây giờ trong arr2. 285 00:14:27,770 --> 00:14:32,770 >> Bây giờ chúng ta cũng có thể điều trị fread giống như một cuộc gọi đến fgetc. 286 00:14:32,770 --> 00:14:37,140 Trong trường hợp này, chúng tôi chỉ cố gắng có được một ký tự từ tập tin. 287 00:14:37,140 --> 00:14:40,070 Và chúng ta không cần một mảng để chứa một ký tự. 288 00:14:40,070 --> 00:14:43,170 Chúng tôi chỉ có thể lưu trữ nó trong một biến ký tự. 289 00:14:43,170 --> 00:14:46,390 >> Việc nắm bắt, mặc dù, là khi chúng ta chỉ có một biến, 290 00:14:46,390 --> 00:14:50,290 chúng ta cần phải vượt qua trong địa chỉ của biến đó 291 00:14:50,290 --> 00:14:52,550 vì nhớ lại rằng số đầu tiên cho fread 292 00:14:52,550 --> 00:14:59,210 là một con trỏ đến vị trí và bộ nhớ nơi mà chúng ta muốn lưu trữ các thông tin. 293 00:14:59,210 --> 00:15:01,550 Một lần nữa, tên của một Mảng là một con trỏ. 294 00:15:01,550 --> 00:15:04,200 Vì vậy, chúng ta không cần phải làm mảng ký hiệu. 295 00:15:04,200 --> 00:15:07,270 Nhưng c, nhân vật c ở đây, không phải là một mảng. 296 00:15:07,270 --> 00:15:08,390 Nó chỉ là một biến. 297 00:15:08,390 --> 00:15:11,840 Và vì vậy chúng tôi cần phải vượt qua một dấu và c để cho biết 298 00:15:11,840 --> 00:15:15,350 rằng đó là địa chỉ mà chúng tôi muốn để lưu trữ này một byte của thông tin, 299 00:15:15,350 --> 00:15:20,479 một nhân vật này mà chúng tôi đang thu thập từ ptr. 300 00:15:20,479 --> 00:15:22,270 Fwrite-- Tôi sẽ đi qua hơn này một chút 301 00:15:22,270 --> 00:15:25,440 quickly-- là khá nhiều tương đương chính xác của fread 302 00:15:25,440 --> 00:15:27,720 ngoại trừ nó cho văn bản thay vì đọc sách, chỉ 303 00:15:27,720 --> 00:15:31,610 như other-- chúng tôi đã mở và gần gũi, có được một nhân vật, 304 00:15:31,610 --> 00:15:32,530 viết một nhân vật. 305 00:15:32,530 --> 00:15:35,040 Bây giờ nó có được tùy tiện lượng thông tin, 306 00:15:35,040 --> 00:15:37,170 số lượng tùy ý bên phải của thông tin. 307 00:15:37,170 --> 00:15:39,790 Vì vậy, giống như trước đây, chúng ta có thể có một mảng các số nguyên 10 308 00:15:39,790 --> 00:15:43,210 nơi mà chúng tôi đã có thông tin được lưu trữ, có lẽ. 309 00:15:43,210 --> 00:15:46,580 >> Đó có lẽ là một số dòng mã mà nên đi giữa hai 310 00:15:46,580 --> 00:15:49,990 nơi tôi điền arr với một cái gì đó có ý nghĩa. 311 00:15:49,990 --> 00:15:51,880 Tôi điền vào nó với 10 số nguyên khác nhau. 312 00:15:51,880 --> 00:15:54,920 Và thay vào đó, những gì tôi làm là viết từ arr 313 00:15:54,920 --> 00:15:58,600 và thu thập các thông tin từ arr. 314 00:15:58,600 --> 00:16:02,390 Và tôi lấy thông tin và đưa nó vào các tập tin. 315 00:16:02,390 --> 00:16:05,410 >> Vì vậy, thay vì nó là từ các tập tin vào bộ đệm, 316 00:16:05,410 --> 00:16:08,790 chúng ta bây giờ đi từ bộ đệm để các tập tin. 317 00:16:08,790 --> 00:16:10,580 Vì vậy, nó chỉ là sự đảo ngược. 318 00:16:10,580 --> 00:16:16,680 Vì vậy, một lần nữa, giống như trước đây, chúng ta có thể cũng có một đoạn đống bộ nhớ 319 00:16:16,680 --> 00:16:19,600 rằng chúng tôi đã động phân bổ và đọc từ đó 320 00:16:19,600 --> 00:16:21,570 và viết rằng vào tập tin. 321 00:16:21,570 --> 00:16:24,900 >> Và chúng tôi cũng có một biến duy nhất khả năng nắm giữ một byte 322 00:16:24,900 --> 00:16:27,200 thông tin, chẳng hạn như một nhân vật. 323 00:16:27,200 --> 00:16:29,830 Nhưng một lần nữa, chúng ta cần phải vượt qua trong địa chỉ của biến đó 324 00:16:29,830 --> 00:16:31,840 khi chúng ta muốn đọc từ nó. 325 00:16:31,840 --> 00:16:35,280 Vì vậy, chúng ta có thể ghi thông tin chúng ta tìm thấy tại địa chỉ đó 326 00:16:35,280 --> 00:16:39,050 để con trỏ tập tin, ptr. 327 00:16:39,050 --> 00:16:41,630 >> Có rất nhiều khác tập tin lớn I / O chức năng 328 00:16:41,630 --> 00:16:44,650 mà làm những việc khác nhau bên cạnh những người chúng tôi đã nói chuyện về ngày hôm nay. 329 00:16:44,650 --> 00:16:46,450 Một cặp vợ chồng của những người thân bạn có thể tìm thấy hữu ích 330 00:16:46,450 --> 00:16:50,840 là fgets và fputs, đó là tương đương 331 00:16:50,840 --> 00:16:56,190 của fgetc và fputc nhưng cho đọc một chuỗi duy nhất từ ​​một tập tin. 332 00:16:56,190 --> 00:16:59,020 Thay vì một nhân vật duy nhất, nó sẽ đọc toàn bộ một chuỗi. 333 00:16:59,020 --> 00:17:02,940 fprintf, mà về cơ bản cho phép bạn sử dụng printf để ghi vào tập tin. 334 00:17:02,940 --> 00:17:05,619 Vì vậy, cũng giống như bạn có thể làm thay thế các biến sử dụng 335 00:17:05,619 --> 00:17:09,900 i placeholders phần trăm và phần trăm d, và như vậy, với printf 336 00:17:09,900 --> 00:17:14,690 bạn tương tự như vậy có thể lấy chuỗi printf và in một cái gì đó 337 00:17:14,690 --> 00:17:16,800 như thế vào một tập tin. 338 00:17:16,800 --> 00:17:20,720 >> fseek-- nếu bạn có một máy nghe nhạc DVD là sự tương tự tôi thường sử dụng here-- 339 00:17:20,720 --> 00:17:23,109 là loại giống như cách sử dụng của bạn tua lại và nhanh chóng chuyển tiếp 340 00:17:23,109 --> 00:17:25,819 nút để di chuyển xung quanh bộ phim. 341 00:17:25,819 --> 00:17:28,369 Tương tự như vậy, bạn có thể di chuyển xung quanh các tập tin. 342 00:17:28,369 --> 00:17:30,250 Một trong những điều bên trong rằng cấu trúc file 343 00:17:30,250 --> 00:17:34,270 c tạo ra cho bạn là một chỉ số bạn đang ở đâu trong file. 344 00:17:34,270 --> 00:17:36,420 Bạn có ở rất bắt đầu, tại byte số không? 345 00:17:36,420 --> 00:17:39,290 Bạn có ở byte 100, byte 1000, và như vậy? 346 00:17:39,290 --> 00:17:44,340 Bạn có thể sử dụng tùy tiện di chuyển để fseek mà chỉ về phía trước hoặc phía sau. 347 00:17:44,340 --> 00:17:46,744 >> Và ftell, một lần nữa tương tự như một máy nghe nhạc DVD, 348 00:17:46,744 --> 00:17:49,660 giống như một chiếc đồng hồ nhỏ mà nói bạn có bao nhiêu phút và giây bạn 349 00:17:49,660 --> 00:17:52,480 đang vào một bộ phim cụ thể. 350 00:17:52,480 --> 00:17:56,990 Tương tự như vậy, ftell cho bạn biết nhiều byte bạn đang vào tập tin. 351 00:17:56,990 --> 00:18:00,210 feof là một phiên bản khác nhau phát hiện cho dù bạn đã 352 00:18:00,210 --> 00:18:01,700 đạt đến kết thúc của tập tin. 353 00:18:01,700 --> 00:18:03,600 Và ferror là một chức năng mà bạn có thể sử dụng 354 00:18:03,600 --> 00:18:06,959 để phát hiện xem một cái gì đó có đi sai làm việc với một tập tin. 355 00:18:06,959 --> 00:18:08,750 Một lần nữa, điều này chỉ là trầy xước bề mặt. 356 00:18:08,750 --> 00:18:12,730 Vẫn còn rất nhiều tập tin hơn I / O chức năng trong io.h. chuẩn 357 00:18:12,730 --> 00:18:16,620 Nhưng điều này có thể sẽ giúp bạn bắt đầu làm việc với các tập tin con trỏ. 358 00:18:16,620 --> 00:18:17,640 Tôi Doug Lloyd. 359 00:18:17,640 --> 00:18:19,750 Đây là CS50. 360 00:18:19,750 --> 00:18:21,669