1 00:00:00,000 --> 00:00:09,780 >> [MUSIC CHƠI] 2 00:00:09,780 --> 00:00:11,150 >> ZAMYLA CHAN: Hãy giải quyết thu hồi. 3 00:00:11,150 --> 00:00:14,030 Phục hồi có lẽ là PSET yêu thích của tôi, và chủ yếu là bởi vì tôi nghĩ rằng đó là 4 00:00:14,030 --> 00:00:15,650 thực sự, thực sự mát mẻ. 5 00:00:15,650 --> 00:00:19,040 Về cơ bản, bạn sẽ được một bộ nhớ tập tin thẻ trong đó 6 00:00:19,040 --> 00:00:20,900 hình ảnh đã bị xóa. 7 00:00:20,900 --> 00:00:23,650 Nhưng những gì bạn sẽ làm là khôi phục lại tất cả. 8 00:00:23,650 --> 00:00:24,250 >> OK. 9 00:00:24,250 --> 00:00:28,230 Vì vậy, nó thực sự thú vị, nhưng có lẽ một ít đáng sợ, bởi vì bạn 10 00:00:28,230 --> 00:00:32,430 đưa ra một tập tin C trống rỗng và bạn phải điền nó vào 11 00:00:32,430 --> 00:00:36,250 OK, vì vậy chúng ta hãy phá vỡ này vào phần quản lý được. 12 00:00:36,250 --> 00:00:38,160 Bạn sẽ muốn mở tập tin thẻ nhớ. 13 00:00:38,160 --> 00:00:39,900 Điều đó có vẻ đơn giản. 14 00:00:39,900 --> 00:00:43,030 Sau đó, tìm đầu của một hình ảnh JPG. 15 00:00:43,030 --> 00:00:46,740 Tất cả các tập tin trên bộ nhớ này thẻ sẽ được JPG. 16 00:00:46,740 --> 00:00:50,840 Sau đó, khi bạn tìm thấy đầu, bạn sẽ mở một JPG mới, mà 17 00:00:50,840 --> 00:00:57,610 được, như, tạo ra một JPG, và viết 512 byte tại một thời gian cho đến khi một JPG mới 18 00:00:57,610 --> 00:01:02,930 tìm thấy, và kết thúc chương trình, một lần bạn phát hiện cuối của tập tin. 19 00:01:02,930 --> 00:01:06,400 >> Bước đầu tiên để đầu tiên là mở các tập tin thẻ nhớ. 20 00:01:06,400 --> 00:01:09,850 Nhưng anh đã biết rồi, và có một tập tin I / O chức năng đó sẽ 21 00:01:09,850 --> 00:01:12,030 chứng minh rất hữu ích. 22 00:01:12,030 --> 00:01:12,820 OK. 23 00:01:12,820 --> 00:01:14,760 Vì vậy, JPG là gì? 24 00:01:14,760 --> 00:01:16,330 Bởi vì chúng ta cần phải đầu nó. 25 00:01:16,330 --> 00:01:21,310 Vâng, JPG, giống như bản đồ bit, chỉ là trình tự của các byte. 26 00:01:21,310 --> 00:01:30,660 May mắn thay, mỗi JPG bắt đầu với một trong hai 0xFF, 0xd8, 0xFF, 0XE0, một chuỗi 27 00:01:30,660 --> 00:01:33,610 byte, hoặc một chuỗi các byte. 28 00:01:33,610 --> 00:01:37,250 >> Vì vậy, những bốn byte chỉ khởi đầu của một JPG. 29 00:01:37,250 --> 00:01:40,780 Không có gì khác hơn so với hai kết hợp bốn byte. 30 00:01:40,780 --> 00:01:44,840 Và may mắn cho chúng tôi, thực tế khác mà chúng tôi có thể tận dụng là mỗi 31 00:01:44,840 --> 00:01:48,550 JPG được lưu trữ side-by-side trên thẻ nhớ. 32 00:01:48,550 --> 00:01:52,210 Tôi đã đại diện cho cấu trúc của một thẻ nhớ sơ đồ này 33 00:01:52,210 --> 00:01:53,310 trượt ở đây. 34 00:01:53,310 --> 00:01:59,270 Ở đây, mỗi vuông, mỗi hình chữ nhật, đại diện cho 512 byte, và nó bắt đầu 35 00:01:59,270 --> 00:02:01,750 với một màu xám trong chúng ta không thực sự có một JPG. 36 00:02:01,750 --> 00:02:05,700 >> Nhưng sau đó chúng tôi cuối cùng nhấn một khối với một ngôi sao. 37 00:02:05,700 --> 00:02:10,940 Điều đó có nghĩa rằng trong bốn byte đầu tiên ra những 512 là một trong hai 38 00:02:10,940 --> 00:02:13,230 bắt đầu trình tự của một JPG. 39 00:02:13,230 --> 00:02:17,340 Và chúng tôi đi từ đó, và sau đó một lần một JPG kết thúc, người tiếp theo bắt đầu. 40 00:02:17,340 --> 00:02:20,990 Chúng tôi không bao giờ có nữa không gian màu xám ở giữa. 41 00:02:20,990 --> 00:02:25,550 >> Nhưng làm thế nào để chúng ta thực sự đọc này, và đọc 512 byte để chúng tôi có thể làm cho 42 00:02:25,550 --> 00:02:27,500 so sánh vị trí đầu tiên? 43 00:02:27,500 --> 00:02:33,470 Vâng, chúng ta hãy quay trở lại fread, mà có trong các cấu trúc sẽ chứa 44 00:02:33,470 --> 00:02:34,470 các byte mà bạn đang đọc. 45 00:02:34,470 --> 00:02:36,570 Vì vậy, bạn sẽ đặt những người trong đó - 46 00:02:36,570 --> 00:02:42,192 kích thước, số lượng, và sau đó inpointer mà bạn đang đọc từ. 47 00:02:42,192 --> 00:02:49,900 Bây giờ, chúng tôi muốn đọc 512 tại một thời điểm, và chúng tôi muốn lưu trữ này trong một bộ đệm, 48 00:02:49,900 --> 00:02:50,700 Tôi sẽ gọi nó. 49 00:02:50,700 --> 00:02:54,100 >> Về cơ bản, chúng ta sẽ giữ vào những 512 byte và làm 50 00:02:54,100 --> 00:02:55,500 việc với nó, phải không? 51 00:02:55,500 --> 00:02:58,260 Chúng tôi không biết mình sẽ so sánh đầu tiên bốn byte, hoặc chúng ta sẽ 52 00:02:58,260 --> 00:02:59,830 đọc nó vào, OK? 53 00:02:59,830 --> 00:03:05,050 Vì vậy, sau đó con trỏ dữ liệu sau đó sẽ phục vụ như là bộ đệm của bạn, và 54 00:03:05,050 --> 00:03:07,745 inpointer, tốt, đó là chỉ cần đi là thẻ nhớ của bạn. 55 00:03:07,745 --> 00:03:09,500 >> Sao cho sơ đồ mạch thẻ nhớ của chúng tôi. 56 00:03:09,500 --> 00:03:14,690 Chúng ta sẽ đọc 512 byte tại một thời điểm, lưu trữ mỗi khối 512 byte 57 00:03:14,690 --> 00:03:19,190 vào một bộ đệm, nắm giữ những đệm, những 512 byte, cho đến khi chúng ta biết 58 00:03:19,190 --> 00:03:22,000 chính xác những gì làm cho họ. 59 00:03:22,000 --> 00:03:25,960 Vì vậy, ngay từ đầu không phải là bất cứ điều gì, vì vậy chúng tôi sẽ đọc bộ đệm, so sánh nó, và 60 00:03:25,960 --> 00:03:28,160 chúng tôi sẽ không cần phải làm bất cứ điều gì với nó. 61 00:03:28,160 --> 00:03:32,030 Và sau đó, chúng tôi cuối cùng đã đánh một ngôi sao ngăn chặn, có nghĩa là chúng tôi đã 62 00:03:32,030 --> 00:03:33,630 JPG tìm thấy đầu tiên của chúng tôi. 63 00:03:33,630 --> 00:03:36,560 Vì vậy, các bộ đệm bây giờ giữ byte từ JPG đó. 64 00:03:36,560 --> 00:03:40,220 >> Lần sau 512 byte, vì họ không phải là một khối sao, cũng có 65 00:03:40,220 --> 00:03:41,740 một phần của JPG đó. 66 00:03:41,740 --> 00:03:47,630 Và JPG là liên tục từ đó trên trong, cho đến khi chúng tôi nhấn JPG tới. 67 00:03:47,630 --> 00:03:51,880 Và sau đó bộ đệm sau đó giữ 512 byte cho JPG đó, và 68 00:03:51,880 --> 00:03:53,580 như vậy, và vv. 69 00:03:53,580 --> 00:03:54,250 OK. 70 00:03:54,250 --> 00:03:58,980 >> Vì vậy, khi bạn nhấn đóng vai chính đầu tiên khối, JPG đầu tiên, làm thế nào bạn 71 00:03:58,980 --> 00:04:01,910 thực sự, tốt, mở nó? 72 00:04:01,910 --> 00:04:04,990 Chúng ta hãy làm một JPG mới. 73 00:04:04,990 --> 00:04:08,846 Tên tập tin cho một JPG sẽ được định dạng, số lượng, số lượng, 74 00:04:08,846 --> 00:04:13,830 number.jpg, trong đó họ đang có tên trong thứ tự mà chúng được tìm thấy, 75 00:04:13,830 --> 00:04:14,780 bắt đầu từ 0. 76 00:04:14,780 --> 00:04:19,890 >> Vì vậy, JPG đầu tiên mà bạn tìm thấy sẽ được 000.jpg. 77 00:04:19,890 --> 00:04:26,560 Vì vậy, có thể là một ý tưởng tốt để theo dõi bao nhiêu JPG bạn đã tìm thấy cho đến nay. 78 00:04:26,560 --> 00:04:27,610 Vì vậy, đó là tên tập tin. 79 00:04:27,610 --> 00:04:29,660 Nhưng làm thế nào để bạn thực sự làm điều đó không? 80 00:04:29,660 --> 00:04:34,310 Vâng, chúng ta sẽ sử dụng một chức năng gọi là sprintf. 81 00:04:34,310 --> 00:04:38,260 Một chút tương tự như printf, nơi bạn có thể sử dụng giữ chỗ cho các chuỗi, 82 00:04:38,260 --> 00:04:42,420 ngoại trừ trong trường hợp này, sprintf sẽ in các tập tin ra vào hiện tại 83 00:04:42,420 --> 00:04:45,550 thư mục, không phải vào thiết bị đầu cuối. 84 00:04:45,550 --> 00:04:46,120 >> OK. 85 00:04:46,120 --> 00:04:49,950 Vì vậy, ở đây chúng ta thấy rằng chúng tôi có tiêu đề, một mảng char để lưu các 86 00:04:49,950 --> 00:04:55,120 kết quả chuỗi, và chúng tôi vượt qua trong tiêu đề của chuỗi thực tế với một 87 00:04:55,120 --> 00:04:58,720 giữ chỗ, giống như chúng tôi đã học để làm với printf. 88 00:04:58,720 --> 00:05:05,530 Nhưng mã này mà tôi có ở đây sẽ cung cấp cho 2.jpg, không 002.jpg. 89 00:05:05,530 --> 00:05:09,920 Vì vậy, tôi sẽ để lại cho bạn để tìm hiểu làm thế nào để sửa đổi giữ chỗ để làm cho 90 00:05:09,920 --> 00:05:11,920 tên chính xác. 91 00:05:11,920 --> 00:05:12,610 >> OK. 92 00:05:12,610 --> 00:05:17,390 Vì vậy, một khi bạn đã sprintf'd sau đó bạn có thể mở tập tin đó, bởi vì nó tồn tại trong 93 00:05:17,390 --> 00:05:22,690 thư mục của bạn, với fopen, bằng cách sử dụng tiêu đề, và sau đó bất cứ điều gì bạn muốn chế độ 94 00:05:22,690 --> 00:05:25,140 để mở tập tin đó in 95 00:05:25,140 --> 00:05:30,260 Vì vậy, bây giờ mà chúng tôi đã mở một file JPG mới, bây giờ chúng tôi có thể viết 512 byte tại một 96 00:05:30,260 --> 00:05:33,320 thời gian, cho đến khi một JPG mới được tìm thấy. 97 00:05:33,320 --> 00:05:36,640 Vì vậy, chúng ta hãy nhìn lại ở cú pháp của fwrite. 98 00:05:36,640 --> 00:05:40,060 >> Tôi biết rằng tôi đang cho thấy slide này một rất nhiều, nhưng tôi chỉ muốn chắc chắn rằng 99 00:05:40,060 --> 00:05:43,530 các bạn không nên quá bối rối, bởi vì Tôi biết rằng nó rất dễ dàng để 100 00:05:43,530 --> 00:05:47,000 trộn lên đầu tiên và cuối cùng tranh luận, đặc biệt. 101 00:05:47,000 --> 00:05:54,390 Nhưng hãy nhớ rằng bạn đang viết từ bộ đệm của bạn vào file hình ảnh ra. 102 00:05:54,390 --> 00:05:59,250 >> Bây giờ bạn biết làm thế nào ghi 512 byte vào file JPG của bạn mà bạn đã 103 00:05:59,250 --> 00:06:03,230 tạo, tốt, chúng tôi muốn dừng lại quá trình khi chúng tôi đã đạt đến cuối 104 00:06:03,230 --> 00:06:06,720 thẻ của chúng tôi, bởi vì sẽ không có hơn bất kỳ hình ảnh được tìm thấy. 105 00:06:06,720 --> 00:06:10,760 Vì vậy, chúng ta hãy quay trở lại fread một lần nữa, tôi hứa. 106 00:06:10,760 --> 00:06:15,600 fread trả bao nhiêu mặt hàng kích thước, kích thước, đã sẵn sàng thành công. 107 00:06:15,600 --> 00:06:19,440 Lý tưởng nhất, điều này là có được bất cứ điều gì bạn vượt qua trong cho số, phải không? 108 00:06:19,440 --> 00:06:24,140 Bởi vì bạn đang cố gắng để đọc số các yếu tố kích thước, kích thước. 109 00:06:24,140 --> 00:06:29,380 Nhưng nếu fread là không thể đọc mà số yếu tố, sau đó nó sẽ trở lại 110 00:06:29,380 --> 00:06:32,530 bất cứ điều gì nó đọc số thành công. 111 00:06:32,530 --> 00:06:36,310 >> Bây giờ, có một điều quan trọng cần lưu ý là nếu bạn sử dụng một tập tin I / O 112 00:06:36,310 --> 00:06:43,860 chức năng như fgetc, nó cũng sẽ trở lại bao nhiêu mặt hàng nó đọc thành công. 113 00:06:43,860 --> 00:06:48,000 Những gì hữu ích về chức năng này là nếu bạn sử dụng chức năng bên trong của một 114 00:06:48,000 --> 00:06:53,190 điều kiện, nó sẽ thực thi chính nó trong khi xác định rằng điều kiện, đó là 115 00:06:53,190 --> 00:06:54,340 chỉ thực sự hữu ích. 116 00:06:54,340 --> 00:07:00,440 Vì vậy, nếu bạn có điều kiện này, nói, nếu đệm fread, DOG sizeof, 2, 117 00:07:00,440 --> 00:07:04,870 con trỏ, tương đương bằng 1, mà có nghĩa là tôi muốn đọc 118 00:07:04,870 --> 00:07:06,540 2 con chó vào thời điểm đó. 119 00:07:06,540 --> 00:07:13,490 Nhưng nếu fread trả về 1 thay vì 2 như dự kiến, điều đó có nghĩa rằng có 2 120 00:07:13,490 --> 00:07:16,480 con chó còn lại trong hồ sơ của tôi, mà là 1. 121 00:07:16,480 --> 00:07:22,450 Nhưng nếu nó trả về 2, sau đó tôi vẫn còn có những 2 con chó bên trong bộ đệm của tôi. 122 00:07:22,450 --> 00:07:26,280 >> Vì vậy, bây giờ mà cung cấp cho bạn một cảm giác như thế nào để kiểm tra cuối của tập tin, nhưng 123 00:07:26,280 --> 00:07:28,940 hãy đi qua giờ logic. 124 00:07:28,940 --> 00:07:32,460 Làm thế nào để chúng tôi thực sự mảnh tất cả những yếu tố này với nhau? 125 00:07:32,460 --> 00:07:36,880 Một khi chúng ta nhấn JPG đầu tiên của chúng tôi, kể từ khi chúng ta biết rằng JPG được lưu trữ 126 00:07:36,880 --> 00:07:40,910 liên tục kế nhau, chúng tôi sẽ viết cho đến khi chúng tôi đạt được kết thúc của tập tin thẻ. 127 00:07:40,910 --> 00:07:43,950 Nhưng chúng tôi không muốn viết bất cứ điều gì cho đến khi đó. 128 00:07:43,950 --> 00:07:48,710 Vì vậy, vấn đề, không chỉ là chúng ta đang ở khởi đầu của một JPG mới, nhưng liệu 129 00:07:48,710 --> 00:07:50,655 chúng tôi đã tìm thấy một JPG hay không. 130 00:07:50,655 --> 00:07:55,390 >> Nếu Đó là khởi đầu của một JPG mới, chúng tôi sẽ muốn đóng file JPG hiện tại của chúng tôi nếu 131 00:07:55,390 --> 00:07:59,110 chúng tôi có một mở, và mở một cái mới để viết vào. 132 00:07:59,110 --> 00:08:03,340 Nếu nó không phải là bắt đầu của JPG mới, Mặc dù vậy, chúng tôi sẽ giữ các tập tin JPG cùng 133 00:08:03,340 --> 00:08:05,910 mở và viết vào đó. 134 00:08:05,910 --> 00:08:10,100 Chúng tôi sẽ viết đệm của chúng tôi vào bất cứ JPG, chúng tôi đã mở, với điều kiện 135 00:08:10,100 --> 00:08:12,120 chúng tôi có một mở, tất nhiên. 136 00:08:12,120 --> 00:08:16,190 Nếu chúng ta đã không tìm thấy JPG đầu tiên của chúng tôi nhưng, chúng tôi không viết bất cứ điều gì. 137 00:08:16,190 --> 00:08:20,290 Và quá trình này tiếp tục cho đến khi bạn đến cuối của tập tin thẻ. 138 00:08:20,290 --> 00:08:23,410 >> Và cuối cùng, bạn sẽ muốn làm chắc chắn rằng bạn fclose bất kỳ 139 00:08:23,410 --> 00:08:25,800 tập tin mà bạn đã fopened. 140 00:08:25,800 --> 00:08:28,360 Một khi bạn cảm thấy thoải mái với khái niệm, hãy nhìn vào một số 141 00:08:28,360 --> 00:08:30,840 giả, mà tôi đã bao gồm ở đây. 142 00:08:30,840 --> 00:08:34,830 Trước tiên, bạn muốn mở các tập tin thẻ, và sau đó lặp lại quá trình sau đây 143 00:08:34,830 --> 00:08:37,144 cho đến khi bạn đã đạt đến cuối của thẻ. 144 00:08:37,144 --> 00:08:40,880 Bạn muốn đọc 512 byte vào một bộ đệm. 145 00:08:40,880 --> 00:08:43,934 Sử dụng bộ đệm đó, bạn sẽ muốn kiểm tra dù bạn đang ở khởi đầu của một 146 00:08:43,934 --> 00:08:45,300 JPG mới hay không. 147 00:08:45,300 --> 00:08:48,400 Và câu trả lời cho câu hỏi đó sẽ ảnh hưởng đến quản lý tập tin của bạn - 148 00:08:48,400 --> 00:08:51,940 các tập tin bạn mở, mà những người bạn đóng cửa. 149 00:08:51,940 --> 00:08:55,220 >> Sau đó, bạn đã tìm thấy một JPG? 150 00:08:55,220 --> 00:08:57,740 Làm thế nào có bạn được giữ theo dõi về điều đó? 151 00:08:57,740 --> 00:09:01,735 Sau đó, tùy thuộc vào điều đó, bạn sẽ thấy một trong hai viết vào JPG hiện tại mà bạn 152 00:09:01,735 --> 00:09:07,090 đã mở, hoặc không viết gì cả, bởi vì bạn đã không tìm thấy một JPG được nêu ra. 153 00:09:07,090 --> 00:09:10,870 Cuối cùng, một khi bạn đã đạt đến cuối các tập tin, bạn sẽ muốn đóng bất kỳ 154 00:09:10,870 --> 00:09:12,590 tập tin mà bạn đã mở còn lại. 155 00:09:12,590 --> 00:09:14,590 Chúng tôi muốn được gọn gàng ở đây. 156 00:09:14,590 --> 00:09:18,790 >> Và với điều đó, bạn đã thu hồi tất cả các các tập tin bị mất tích từ bộ nhớ 157 00:09:18,790 --> 00:09:21,620 thẻ, đó là một kỳ công khá tuyệt vời. 158 00:09:21,620 --> 00:09:23,430 Vì vậy, pat mình ở mặt sau. 159 00:09:23,430 --> 00:09:27,560 Nhưng, có một yếu tố hơn các PSET, đó là cuộc thi. 160 00:09:27,560 --> 00:09:30,920 Bạn sẽ thấy rằng tất cả các hình ảnh mà bạn đã phục hồi thực sự 161 00:09:30,920 --> 00:09:32,820 hình ảnh của các nhân viên của CS50. 162 00:09:32,820 --> 00:09:38,500 Vì vậy, nếu bạn đang ở trên khuôn viên trường hoặc một nơi nào đó gần, sau đó bạn có thể chụp ảnh với 163 00:09:38,500 --> 00:09:42,600 các nhân viên, và các phần đó có hầu hết các hình ảnh với nhân viên 164 00:09:42,600 --> 00:09:46,940 từ các tập tin phục hồi của họ sẽ nhận được một giải thưởng tuyệt vời. 165 00:09:46,940 --> 00:09:50,650 Cùng với đó, sau đó bạn đã hoàn tất hồi phục PSET. 166 00:09:50,650 --> 00:09:53,600 Tên tôi là Zamyla, và đây là CS50. 167 00:09:53,600 --> 00:10:01,835