[Powered by Google Translate] [Walkthrough - Vấn đề Set 4] [Zamyla Chan - Đại học Harvard] [Đây là CS50. - CS50.TV] Được rồi. Xin chào, tất cả mọi người, và được chào đón để Walkthrough 4. Hôm nay pset của chúng tôi là Forensics. Forensics là một pset thực sự thú vị liên quan đến việc đối phó với các tập tin bitmap để khám phá những người phạm tội. Sau đó, chúng tôi đang đi để thay đổi kích thước một số tập tin bitmap, sau đó chúng tôi cũng sẽ đối phó với một phần thực sự thú vị được gọi là phục hồi, trong đó về cơ bản chúng tôi đang bàn giao một thẻ nhớ trong đó có người đã vô tình xóa tất cả các tập tin của họ, và chúng tôi đang yêu cầu để phục hồi các tập tin. Nhưng trước tiên, trước khi chúng tôi nhận được vào các pset, tôi thực sự chỉ muốn chúc mừng tất cả mọi người. Chúng tôi đang về tại điểm giữa của khóa học này. Đố 0 là phía sau chúng tôi, và chúng tôi tại pset4, do đó, về cơ bản, chúng tôi đang nửa chừng. Chúng ta đã đi một chặng đường dài nếu bạn nhìn lại để psets của bạn, pset0 và pset1, để chúc mừng cho mình về điều đó, và chúng tôi đang đi để có được vào một số công cụ thực sự thú vị. Vì vậy, hộp công cụ của chúng tôi cho pset này, một lần nữa, thay vì chạy sudo yum-y cập nhật, chúng tôi có thể chỉ cần chạy update50 nếu bạn đang ở phiên bản 17,3 và ở trên của thiết bị. Vì vậy, hãy chắc chắn để chạy update50 - đó là dễ dàng hơn rất nhiều, ít hơn một vài ký tự - để đảm bảo rằng bạn đang ở phiên bản mới nhất của thiết bị. Đặc biệt quan trọng để update50 khi chúng tôi bắt đầu sử dụng CS50 tra. Vì vậy, hãy chắc chắn rằng bạn làm điều đó. Đối với tất cả các phần pset này, chúng ta sẽ được giao dịch với đầu vào và đầu ra tập tin, tập tin I / O. Chúng tôi sẽ được đi qua rất nhiều các chương trình đối phó với mảng trỏ đến các tập tin và vật như thế, vì vậy chúng tôi muốn chắc chắn rằng chúng tôi thực sự quen thuộc và thoải mái giao dịch với đầu vào và đầu ra vào các tập tin. Trong đoạn code phân phối cho pset này là một tập tin gọi là% s, và đó là những gì chúng tôi đang đi tìm là có được thực sự hữu ích cho chúng tôi bởi vì chúng tôi sẽ kết thúc thực sự sao chép các tập tin copy.c và chỉ cần thay đổi nó một chút để có thể để đạt được 2 phần đầu tiên của bộ vấn đề. Và như vậy thì như tôi đã đề cập trước đây, chúng ta đang đối phó với bitmap cũng như hình ảnh JPEG. Vì vậy, thực sự hiểu cấu trúc của các tập tin được tổ chức như thế nào, làm thế nào chúng ta thực sự có thể dịch 0 và 1 vào cấu trúc và những điều chúng ta thực sự có thể hiểu và giải thích và chỉnh sửa, sẽ được thực sự quan trọng, do đó, đi sâu vào JPEG và các tập tin bitmap và hiểu rõ cấu trúc của những người. Pset4, như thường lệ, bắt đầu với một phần của câu hỏi. Những người sẽ đối phó với các tập tin I / O và giúp bạn quen với điều đó. Sau đó, phần 1 là Whodunit, trong đó bạn đang đưa ra một tập tin bitmap trông giống như dấu chấm màu đỏ trên tất cả. Và sau đó về cơ bản những gì chúng ta sẽ làm là tập tin này và chỉ cần chỉnh sửa nó một chút vào một phiên bản mà chúng ta có thể đọc. Về cơ bản, một khi chúng ta kết thúc, chúng ta sẽ có cùng một tập tin, ngoại trừ chúng ta sẽ có thể để xem tin nhắn ẩn ẩn bởi tất cả những dấu chấm màu đỏ. Sau đó, Resize là một chương trình đó, đưa ra một tập tin và sau đó đưa ra tên của các tập tin mà nó ra và sau đó đưa ra một số, sẽ thực sự thay đổi kích thước mà bitmap đó giá trị số nguyên. Sau đó, cuối cùng, chúng tôi có pset Recover. Chúng tôi được cho một thẻ nhớ và sau đó có để phục hồi tất cả các hình ảnh đã bị vô tình xóa, nhưng, như chúng ta sẽ tìm hiểu, không thực sự bị xóa và loại bỏ từ tập tin; chúng ta chỉ cần loại bị mất nơi họ đã ở trong tập tin, nhưng chúng tôi sẽ phục hồi đó. Lớn. Vì vậy, đi sâu vào tập tin I / O đặc biệt, đây là một danh sách toàn bộ các chức năng mà bạn sẽ sử dụng. Bạn đã nhìn thấy một chút những điều cơ bản của fopen, fread và fwrite, nhưng chúng ta sẽ nhìn sâu hơn vào một số tập tin I / chức năng O như fputc, trong đó bạn chỉ cần viết một ký tự tại một thời điểm, fseek, nơi bạn loại di chuyển các tập tin chỉ báo vị trí tới lui, và sau đó một số người khác. Nhưng chúng tôi sẽ đi vào đó một chút sau đó trong các pset. Vì vậy, đầu tiên, chỉ để có được vào một tập tin I / O trước khi chúng ta đi vào các pset, để mở một tập tin, ví dụ, những gì bạn phải làm là thực sự thiết lập một con trỏ đến tập tin đó. Vì vậy, chúng tôi có một con trỏ * FILE. Trong trường hợp này, tôi gọi nó là một trong con trỏ bởi vì đó sẽ là infile của tôi. Và vì vậy tôi sẽ sử dụng fopen chức năng và sau đó là tên của tập tin và sau đó là chế độ mà tôi sẽ được giao dịch với tập tin. Vì vậy, có "r" trong trường hợp này để đọc, "w" để ghi, và sau đó "a" cho phụ thêm. Ví dụ, khi bạn đang làm việc với một infile và tất cả những gì bạn muốn làm là đọc các bit và byte lưu trữ ở đó, sau đó bạn có thể sẽ muốn sử dụng "r" như chế độ của bạn. Khi bạn muốn thực sự viết, loại làm cho một tập tin mới, sau đó những gì chúng ta sẽ làm là chúng ta sẽ mở các tập tin mới và sử dụng chế độ "w" để viết. Vì vậy, sau đó khi bạn đang thực sự đọc vào các tập tin, cấu trúc như sau. Trước tiên, bạn bao gồm con trỏ đến struct sẽ chứa các byte mà bạn đang đọc. Vì vậy, đó sẽ là vị trí cuối cùng của các byte mà bạn đang đọc. Sau đó bạn sẽ cho biết kích thước, như về cơ bản có bao nhiêu byte chương trình của bạn đọc trong tập tin, kích thước cơ bản một trong những yếu tố, và sau đó bạn sẽ xác định có bao nhiêu yếu tố bạn muốn đọc. Và cuối cùng, bạn phải biết nơi bạn đang đọc, do đó sẽ là con trỏ trong của bạn. Tôi mã hóa bằng màu này vì fread cũng rất tương tự như fwrite, ngoại trừ bạn muốn làm cho chắc chắn rằng bạn sử dụng đúng thứ tự, hãy chắc chắn rằng bạn đang thực sự bằng văn bản hoặc đọc từ tập tin bên phải. Vì vậy, sau đó như trước đây, nếu chúng ta có kích thước của phần tử cũng như số lượng của các yếu tố, sau đó chúng ta có thể chơi xung quanh một chút. Nói rằng tôi có một cấu trúc DOG và do đó, sau đó tôi muốn đọc hai con chó tại một thời điểm. Những gì tôi có thể làm là nói kích thước của một trong những yếu tố là có được kích thước của một DOG và tôi sẽ thực sự đọc hai người trong số họ. Ngoài ra, những gì tôi có thể làm là nói tôi chỉ cần đi để đọc một trong những yếu tố và là một trong những yếu tố là có được kích thước của hai con chó. Vì vậy, đó là tương tự như làm thế nào bạn có thể chơi xung quanh với kích thước và số tùy thuộc vào những gì trực quan hơn cho bạn. Được rồi. Vì vậy, bây giờ chúng tôi nhận được các tập tin văn bản. Khi bạn muốn viết một tập tin, tham số đầu tiên thực sự là nơi mà bạn đang đọc từ. Vì vậy, đó là về cơ bản các dữ liệu mà bạn đang đi để viết vào tập tin, là con trỏ ra ở cuối. Vì vậy, khi bạn đang làm việc với pset, hãy chắc chắn rằng bạn không bị lẫn lộn. Có thể có định nghĩa bên cạnh. Bạn có thể kéo các định nghĩa trong hướng dẫn sử dụng bằng cách gõ người đàn ông và sau đó fwrite, ví dụ, thiết bị đầu cuối, hoặc bạn có thể tham khảo trở lại slide này và chắc chắn rằng bạn đang sử dụng một trong những quyền. Vì vậy, một lần nữa, fwrite, khi bạn có một tập tin mà bạn muốn để viết vào, đó là sẽ là đối số cuối cùng và đó sẽ là một con trỏ đến tập tin đó. Vì vậy, sau đó là làm thế nào chúng ta đối phó với văn bản có lẽ byte lại với nhau tại một thời điểm, nhưng nói rằng bạn muốn chỉ cần viết chỉ trong một nhân vật duy nhất. Như chúng ta sẽ thấy sau này trong ví dụ này, các bitmap chúng tôi sẽ có để sử dụng. Đó là khi chúng ta có thể sử dụng fputc, về cơ bản chỉ cần đặt một ký tự tại một thời điểm, chr, vào con trỏ tập tin, và con trỏ của chúng tôi ra khỏi đó. Vì vậy, sau đó bất cứ khi nào chúng ta tìm kiếm hoặc viết trong một tập tin, các tập tin được theo dõi của chúng tôi đang ở đâu. Vì vậy, nó là một loại của con trỏ, chỉ số vị trí tập tin. Và như vậy bất cứ khi nào chúng tôi viết hoặc đọc một lần nữa vào một tập tin, tập tin thực sự nhớ nó ở đâu, và do đó, nó tiếp tục từ nơi con trỏ. Điều này có thể có lợi khi bạn muốn, nói, đọc trong một số tiền nhất định để làm một cái gì đó và sau đó đọc trong số tiền sau đây, nhưng đôi khi chúng ta có thể muốn đi lại hoặc thực sự bắt đầu từ một giá trị tham khảo nhất định. Vì vậy, sau đó chức năng fseek, những gì nó làm là cho phép chúng ta di chuyển con trỏ trong một tập tin nhất định một số lượng nhất định các byte. Và sau đó những gì chúng ta phải làm là xác định nơi mà các giá trị tham khảo. Vì vậy, hoặc nó di chuyển về phía trước hoặc phía sau, từ nơi con trỏ chuột hiện tại, hoặc chúng ta có thể xác định rằng nó chỉ nên di chuyển từ đầu của tập tin hoặc từ ngày kết thúc của tập tin. Và như vậy bạn có thể vượt qua trong các giá trị tiêu cực hay tích cực đến số tiền, và rằng loại sẽ di chuyển con trỏ hoặc chuyển tiếp hoặc lùi. Trước khi chúng tôi nhận được vào psets khác, bất kỳ câu hỏi về tập tin I / O? Okay. Khi chúng tôi nhận được vào các ví dụ nhiều hơn, cảm thấy tự do để ngăn chặn tôi cho các câu hỏi. Vì vậy, trong Whodunit, bạn đang trao cho một tập tin bitmap tương tự như một màu đỏ này trên slide, và nó trông như thế này - một loạt các dấu chấm màu đỏ - và bạn không thực sự biết những gì được viết. Nếu bạn nheo mắt, bạn có thể nhìn thấy một màu sắc nhẹ hơi xanh bên trong giữa. Về cơ bản, đó là nơi mà văn bản được lưu trữ. Có một vụ giết người đã xảy ra, và chúng tôi cần phải tìm ra người đã làm nó. Để làm điều đó, chúng ta cần phải loại chuyển đổi ảnh sang một định dạng có thể đọc được. Nếu bạn từng gặp phải điều này, đôi khi sẽ có bộ dụng cụ nhỏ nơi bạn sẽ có một cái kính lúp với một bộ phim màu đỏ. Bất cứ ai? Yeah. Vì vậy, bạn sẽ là tay một cái gì đó như thế này, bạn sẽ có một kính lúp với bộ phim màu đỏ trên nó, bạn sẽ đặt nó lên trên ảnh, và bạn sẽ có thể để xem tin nhắn ẩn trong đó. Chúng tôi không có một kính lúp với bộ phim màu đỏ, do đó, thay vì chúng ta sẽ loại tạo của chúng ta pset này. Và do đó, người sử dụng sẽ whodunit đầu vào, sau đó các đầu mối, bmp, vì vậy đó là infile, đó là thông báo chấm đỏ, và sau đó họ nói verdict.bmp sẽ được outfile của chúng tôi. Vì vậy, nó sẽ tạo ra một hình ảnh bitmap mới tương tự như một đầu mối ngoại trừ trong một định dạng có thể đọc được mà chúng ta có thể nhìn thấy thông báo ẩn. Vì chúng ta sẽ được giao dịch với bitmap chỉnh sửa và thao tác của một số loại, chúng ta sẽ loại lặn vào trong cấu trúc của các tập tin bitmap. Chúng tôi đã đi qua những bit một chút trong bài giảng, nhưng chúng ta hãy nhìn vào một số chi tiết. Bitmap cơ bản chỉ là một sắp xếp của các byte nơi mà chúng tôi đã chỉ định byte có nghĩa là gì. Vì vậy, đây là loại giống như bản đồ của hình ảnh bitmap nói rằng nó bắt đầu với một số tập tin tiêu đề, bắt đầu với một số thông tin trong đó. Bạn thấy rằng số byte khoảng 14 kích cỡ được chỉ định của hình ảnh bitmap, và nó vẫn tiếp tục. Nhưng sau đó những gì chúng tôi đang thực sự quan tâm đến ở đây được bắt đầu từ khoảng số byte 54. Chúng tôi có những ba RGB. Những gì sẽ làm là có chứa các điểm ảnh thực tế, các giá trị màu. Tất cả mọi thứ ở trên đó trong tiêu đề là một số thông tin tương ứng với kích thước của hình ảnh, chiều rộng của hình ảnh, và chiều cao. Khi chúng tôi đi vào đệm sau này, chúng ta sẽ thấy lý do tại sao kích thước của hình ảnh có thể khác hơn chiều rộng hoặc chiều cao. Vì vậy, sau đó để đại diện cho những những hình ảnh bitmap là chuỗi các byte những gì chúng ta có thể làm là nói được rồi, tôi sẽ phải nhớ rằng tại chỉ số 14, đó là nơi kích thước là, ví dụ, nhưng thay vì những gì chúng ta sẽ làm gì để thực hiện điều này dễ dàng hơn được đóng gói nó trong một cấu trúc. Và vì vậy chúng tôi có hai cấu trúc được thực hiện đối với chúng tôi, một BITMAPFILEHEADER và một BITMAPINFOHEADER, và bất cứ khi nào chúng ta đọc trong tập tin đó, theo mặc định nó sẽ được đi theo thứ tự, và như vậy để nó cũng sẽ điền vào các biến như biWidth và biSize. Và cuối cùng, mỗi điểm ảnh được đại diện bởi ba byte. Người đầu tiên là số lượng màu xanh trong các điểm ảnh, thứ hai là số lượng màu xanh lá cây, và cuối cùng, số lượng của màu đỏ, trong đó 0 là cơ bản không có màu xanh lá cây màu xanh hoặc không có hoặc không có màu đỏ và sau đó ff là giá trị tối đa. Đây là những giá trị thập lục phân. Vì vậy, sau đó nếu chúng ta có ff0000, sau đó tương ứng với số tiền tối đa của màu xanh và sau đó không có màu xanh lá cây và không có màu đỏ, do đó, sau đó sẽ cung cấp cho chúng tôi một điểm ảnh màu xanh. Sau đó, nếu chúng ta có tất cả qua hội đồng quản trị của ff, thì đó có nghĩa là chúng tôi có một điểm ảnh màu trắng. Đây là loại đối diện với thường khi chúng ta nói RGB. Nó thực sự sẽ BGR. Vì vậy, nếu chúng ta thực sự nhìn vào một ví dụ về một hình ảnh bitmap - cho tôi kéo một ở đây. Đó là một chút nhỏ. Tôi phóng to, và chúng ta có thể nhìn thấy nó pixelated. Nó trông giống như các khối màu. Bạn có khối màu trắng và sau đó các khối màu đỏ. Nếu bạn chơi trong Microsoft Paint, ví dụ, bạn có thể làm một cái gì đó như thế bởi về cơ bản chỉ cần vẽ hình vuông theo một thứ tự cụ thể nào đó. Vì vậy, sau đó dịch này trong bitmap là như sau. Ở đây chúng tôi có điểm ảnh da trắng đầu tiên, tất cả 6 f của, và sau đó chúng tôi có màu đỏ nào, được chỉ định bởi 0000FF. Và do đó, thứ tự của các byte chúng ta có chỉ ra cách thức hình ảnh bitmap sẽ xem xét. Vì vậy, những gì tôi đã thực hiện ở đây là chỉ cần viết ra tất cả những byte và sau đó màu đỏ để bạn có thể loại thấy, nếu bạn nheo mắt một chút, làm thế nào loại đó cho thấy một khuôn mặt cười. Cách làm việc hình ảnh bitmap là tôi hình dung nó về cơ bản như là một mạng lưới. Và như vậy, theo mặc định, tất cả các dòng của lưới điện có phải là một bội số của 4 byte. Nếu chúng ta nhìn vào một hình ảnh bitmap, bạn điền vào giá trị mỗi. Ví dụ, bạn có thể có một màu đỏ, một màu xanh lá cây ở đây, một màu xanh ở đây, nhưng bạn phải đảm bảo rằng hình ảnh được làm đầy với một bội số của bốn byte. Vì vậy, nếu tôi muốn hình ảnh của tôi sẽ được rộng ba khối, sau đó tôi sẽ cần phải đặt một giá trị rỗng người cuối cùng làm cho nó là bội số của bốn. Vì vậy, sau đó tôi sẽ thêm vào một cái gì đó mà chúng ta đang gọi điện thoại đệm. Tôi chỉ sẽ chỉ ra rằng có một x. Bây giờ nói rằng chúng ta muốn một hình ảnh đó là 7 pixels, ví dụ. Chúng tôi có 1, 2, 3, 4, 5, 6, 7, và tất cả điều đó được điền vào với màu sắc. Cách mà hình ảnh bitmap làm việc là chúng ta cần một 8. Ngay bây giờ, chúng tôi có 1, 2, 3, 4, 5, 6, 7. Chúng ta cần 8 không gian cho hình ảnh bitmap để đọc một cách chính xác. Vì vậy, sau đó những gì chúng ta phải làm là thêm vào một chút của padding để đảm bảo rằng tất cả các chiều rộng được thống nhất và rằng tất cả các chiều rộng là một bội số của 4. Và vì vậy tôi trước đây chỉ ra, đệm là x hoặc nguệch ngoạc dòng, nhưng trong những hình ảnh bitmap thực tế đệm được chỉ định bởi một 0 thập lục phân. Vì vậy, đó sẽ là một nhân vật duy nhất, 0. Những gì có thể có ích là lệnh xxd. Những gì nó là thực sự cho bạn thấy, như tương tự như những gì tôi đã làm trước đây với các smiley khi tôi thực sự in ra mỗi màu sắc sẽ được cho điểm ảnh và sau đó màu mã hoá nó, khi bạn chạy xxd với các lệnh sau đây, sau đó nó thực sự sẽ in ra những màu sắc cho những điểm ảnh. Những gì bạn phải làm là ở đây tôi chỉ ra, như s-54 nói rằng tôi sẽ bắt đầu từ byte 54 vì trước đó, hãy nhớ nếu chúng ta nhìn lại bản đồ của các bitmap, đó là tất cả các thông tin tiêu đề và vật như thế. Nhưng những gì chúng tôi thực sự quan tâm là các điểm ảnh thực tế cho thấy màu sắc. Vì vậy, bằng cách thêm vào trong lá cờ đó,-s 54, sau đó chúng tôi có thể nhìn thấy các giá trị màu. Và đừng lo lắng về những lá cờ và những thứ phức tạp như thế. Trong spec bộ vấn đề, bạn sẽ có hướng dẫn về cách sử dụng xxd để hiển thị các điểm ảnh. Vì vậy, nếu bạn nhìn thấy ở đây, nó loại trông giống như một hộp màu xanh lá cây, điều này nhỏ. Tôi đã mã hóa bằng màu 00FF00 như về cơ bản nói không có màu xanh, rất nhiều màu xanh lá cây, và không có màu đỏ. Vì vậy, tương ứng với màu xanh lá cây. Như bạn thấy ở đây, chúng ta thấy một hình chữ nhật màu xanh lá cây. Hình chữ nhật màu xanh lá cây là chỉ có 3 điểm ảnh, do đó, sau đó những gì chúng ta phải làm để đảm bảo rằng hình ảnh là một bội số của 4 rộng thêm trong đệm thêm. Và như vậy thì đó là cách bạn nhìn thấy những số 0 ở đây. Điều này thực sự sẽ là kết quả của pset Resize của bạn, về cơ bản các bitmap nhỏ và sau đó mở rộng cho 4. Và vì vậy những gì chúng ta thấy là hình ảnh này rộng 12 pixels, nhưng 12 là một bội số của 4, và như vậy chúng tôi thực sự không thấy bất kỳ số 0 ở cuối vì chúng ta không cần thêm bất kỳ bởi vì nó hoàn toàn độn. Nó không có phòng nữa. Okay. Bất kỳ câu hỏi về đệm? Okay. Cool. Như tôi đã đề cập trước đây, các bitmap chỉ là một chuỗi các byte. Và vì vậy những gì chúng ta có là thay vì cần phải theo dõi số chính xác của byte tương ứng với một yếu tố cụ thể, chúng tôi thực sự đã tạo ra một cấu trúc đại diện cho rằng. Vì vậy, những gì chúng ta có là một cấu trúc RGBTRIPLE. Bất cứ khi nào bạn có một thể hiện của một triple RGB, bởi vì đây là một loại xác định cấu trúc, sau đó bạn có thể truy cập biến rgbtBlue, tương tự như xanh và đỏ biến, mà sẽ chỉ ra bao nhiêu màu xanh, màu xanh lá cây, và màu đỏ, tương ứng, bạn có. Vì vậy, nếu chúng ta có đặt biến màu xanh 0, thiết lập màu xanh lá cây ff, đó là giá trị tối đa bạn có thể có, và sau đó biến màu đỏ thiết lập là 0, sau đó những gì màu RGB ba đặc biệt này sẽ đại diện cho? >> [Sinh viên] Green. Green. Chính xác. Nó sẽ là hữu ích để biết rằng bất cứ khi nào bạn có một thể hiện của một triple RGB, bạn thực sự có thể truy cập vào số lượng của màu sắc - màu xanh, màu xanh lá cây, và màu đỏ - một cách riêng biệt. Bây giờ chúng ta đã nói chuyện về cấu trúc đó, chúng ta hãy nhìn vào các tập tin BMP. Đây là những cấu trúc thực hiện cho bạn. Ở đây chúng tôi có một cấu trúc BITMAPFILEHEADER. Quan tâm là kích thước. Sau đó, chúng tôi có tiêu đề thông tin, trong đó có một vài điều mà là thú vị đối với chúng tôi, cụ thể là các kích thước, chiều rộng và chiều cao. Như chúng ta sẽ đi vào sau này, khi bạn đọc trong tập tin, nó sẽ tự động đọc bởi vì chúng tôi đã thiết lập thứ tự để được giống. Vì vậy, các biSize sẽ chứa các byte bên phải tương ứng với kích thước thực tế của hình ảnh. Và sau đó ở đây, cuối cùng, như chúng tôi đã nói chuyện về, chúng tôi có RGBTRIPLE typedef struct. Chúng tôi có một rgbtBlue, Green, và Red liên kết với nó. Lớn. Okay. Bây giờ chúng ta hiểu bitmap một chút, hiểu rằng chúng ta có một phần đầu tập tin và một tiêu đề thông tin liên quan với nó và sau đó sau đó, chúng tôi có những thứ thú vị màu sắc, và những màu sắc được đại diện bởi cấu trúc RGBTRIPLE, và những người, lần lượt, có ba giá trị liên quan đến màu xanh, màu xanh lá cây, và màu đỏ. Vì vậy, bây giờ, chúng ta có thể nghĩ về việc phục hồi một chút. Xin lôi. Hãy suy nghĩ về Whodunit. Khi chúng tôi có tập tin đầu mối của chúng tôi, sau đó những gì chúng tôi muốn làm là đọc trong điểm ảnh pixel và sau đó bằng cách nào đó thay đổi những điểm ảnh để chúng tôi có thể sản xuất nó sang một định dạng có thể đọc được. Và như vậy để sản xuất nó, chúng ta sẽ viết pixel của điểm ảnh vào tập tin verdict.bmp. Đó là loại rất nhiều để làm. Chúng tôi nhận ra rằng. Vì vậy, những gì chúng tôi đã làm là chúng ta đã thực sự cung cấp cho bạn copy.c. % S không chỉ là làm cho một bản sao chính xác của một tập tin bitmap nhất định và sau đó đầu ra nó. Vì vậy, điều này đã mở các tập tin cho bạn, đọc điểm ảnh pixel, và sau đó viết nó vào một tập tin đầu ra. Chúng ta hãy nhìn vào lúc đó. Điều này được đảm bảo sử dụng đúng cách, nhận được các tên tập tin ở đây. Điều này không có là nó đặt tập tin đầu vào những gì chúng ta đã vượt qua trong infile đây, đó là lần thứ hai đối số dòng lệnh. Kiểm tra để chắc chắn rằng chúng tôi có thể mở tập tin. Kiểm tra để chắc chắn rằng chúng tôi có thể làm cho một outfile mới ở đây. Sau đó, điều này không ở đây, nó chỉ về cơ bản bắt đầu đọc trong các tập tin bitmap từ đầu. Đầu, như chúng ta biết, có chứa các BITMAPFILEHEADER, và do đó, những trình tự của các bit sẽ trực tiếp điền vào các BITMAPFILEHEADER. Vì vậy, những gì chúng tôi có ở đây là nói rằng bf BITMAPFILEHEADER - đó là biến mới của chúng ta về loại BITMAPFILEHEADER - chúng ta sẽ đặt bên trong bf những gì chúng ta đọc từ trong con trỏ, mà là infile của chúng tôi. Chúng ta đọc bao nhiêu? Chúng ta đọc trong chúng ta cần bao nhiêu byte để chứa các BITMAPFILEHEADER toàn bộ. Tương tự như vậy, đó là những gì chúng tôi làm cho các tiêu đề thông tin. Vì vậy, chúng tôi tiếp tục cùng tập tin của chúng tôi trong infile, và chúng tôi đang đọc các bit và byte, và chúng tôi đang cắm trực tiếp trong vào các trường hợp của các biến mà chúng tôi đang làm. Ở đây chúng ta chỉ cần đảm bảo rằng bitmap là một bitmap. Bây giờ chúng ta có một outfile, phải không? Vì vậy, nó là viết tắt khi chúng tôi tạo ra nó, cơ bản trống. Vì vậy, về cơ bản chúng ta phải tạo ra một bitmap mới từ đầu. Những gì chúng tôi làm là chúng ta phải đảm bảo rằng chúng tôi sao chép trong phần đầu tập tin và tiêu đề thông tin giống như các infile. Những gì chúng ta làm là viết - và hãy nhớ rằng bf là biến của loại BITMAPFILEHEADER, do đó, những gì chúng tôi làm là chúng ta chỉ cần sử dụng nội dung đó để viết vào các outfile. Ở đây, hãy nhớ chúng tôi đã nói về đệm, như thế nào cũng quan trọng để đảm bảo rằng số lượng điểm ảnh mà chúng tôi có là một bội số của 4. Đây là một công thức khá hữu ích để tính toán bao nhiêu đệm bạn có chiều rộng của tập tin của bạn. Tôi muốn các bạn phải nhớ rằng trong% s chúng ta có một công thức để tính đệm. Được không? Vì vậy mọi người hãy nhớ rằng. Lớn. Vì vậy, sau đó những gì% s tiếp theo là lặp đi lặp lại trên tất cả các scanlines. Nó đi qua các hàng đầu tiên và sau đó lưu giữ mọi gấp ba lần nó đọc và sau đó viết nó vào các outfile. Vì vậy, sau đó ở đây chúng tôi đang đọc chỉ có một RGB ba tại một thời điểm và sau đó đưa rằng ba cùng vào outfile. Phần khôn lanh là padding không phải là một triple RGB, và vì vậy chúng tôi có thể không chỉ cần đọc số tiền đó miếng đệm của ba RGB. Những gì chúng ta phải làm là thực sự chỉ cần di chuyển tập tin chỉ báo vị trí của chúng tôi, di chuyển con trỏ của chúng tôi, loại bỏ qua tất cả các lớp đệm để chúng tôi đang ở hàng tiếp theo. Và sau đó điều này không là bản sao cho bạn thấy làm thế nào bạn có thể muốn thêm các padding. Vì vậy, chúng tôi đã tính toán chúng ta cần bao nhiêu đệm, do đó có nghĩa rằng chúng ta cần số padding của số 0. Điều này không có một vòng lặp mà đặt số padding của số 0 vào outfile của chúng tôi. Và cuối cùng, bạn đóng cả hai tập tin. Bạn đóng infile cũng như outfile. Vậy đó là cách copy.c công trình, và đó sẽ là khá hữu ích. Thay vì chỉ thực sự trực tiếp sao chép và dán nó hoặc chỉ nhìn vào nó và gõ vào bất cứ điều gì bạn muốn, bạn chỉ có thể muốn thực hiện lệnh này trong thiết bị đầu cuối, cp% s whodunit.c, mà sẽ tạo ra một tập tin mới, whodunit.c, có chứa nội dung chính xác giống như bản sao không. Vì vậy, sau đó chúng ta có thể làm gì được sử dụng như một khuôn khổ mà trên đó để xây dựng và chỉnh sửa cho tập tin whodunit của chúng tôi. Đây là những-to dos để làm cho Whodunit, nhưng những gì copy.c là thực sự chăm sóc của hầu hết trong số họ cho chúng tôi. Vì vậy, tất cả chúng ta cần phải làm gì tiếp theo là thay đổi các điểm ảnh khi cần thiết để thực sự làm cho các tập tin có thể đọc được. Hãy nhớ rằng một điểm ảnh cho ba, vì vậy cho một biến nhất định RGBTRIPLE loại, bạn có thể truy cập, các giá trị màu xanh, màu xanh lá cây, và màu đỏ. Đó là sẽ có ích bởi vì nếu bạn có thể truy cập chúng, điều đó có nghĩa là bạn cũng có thể kiểm tra xem chúng, và điều đó có nghĩa là bạn cũng có thể thay đổi chúng. Vì vậy, khi chúng tôi trở về ví dụ kính lúp màu đỏ của chúng tôi, về cơ bản, đã hành động như là một loại của các bộ lọc cho chúng tôi. Vì vậy, những gì chúng tôi muốn làm là chúng tôi muốn để lọc tất cả của ba đang đến. Có một số cách khác nhau để làm điều này. Về cơ bản, bạn có thể có bất cứ loại bộ lọc bạn muốn. Có lẽ bạn muốn thay đổi tất cả các điểm ảnh màu đỏ hoặc có thể bạn muốn thay đổi một điểm ảnh màu sắc khác nhau để một màu khác nhau. Đó là vào bạn. Hãy nhớ rằng bạn có thể kiểm tra những gì màu pixel và sau đó bạn cũng có thể thay đổi nó như là bạn đang trải qua. Okay. Vì vậy, đó là Whodunit. Một khi bạn chạy Whodunit, bạn sẽ biết ai là thủ phạm của tội phạm. Bây giờ chúng ta sẽ đi đến thay đổi kích cỡ. Chúng ta sẽ vẫn được giao dịch với bitmap. Những gì chúng ta sẽ làm là chúng ta sẽ có một bitmap đầu vào và sau đó chúng ta sẽ phải vượt qua trong một số và sau đó nhận được một bitmap outfile đó là về cơ bản infile của chúng tôi thu nhỏ lại bởi n. Tập tin của tôi chỉ là một ảnh lớn. Sau đó, nếu n của tôi là 3, mở rộng quy mô cho 3, sau đó tôi sẽ lặp lại rằng điểm ảnh n số lần, như vậy 3 lần, và sau đó cũng quy mô nó xuống 3 lần là tốt. Vì vậy, bạn thấy tôi đang mở rộng quy mô theo chiều dọc cũng như theo chiều ngang. Và sau đây là một ví dụ. Nếu bạn có n = 2, bạn thấy rằng màu xanh điểm ảnh đầu tiên có lặp đi lặp lại hai lần theo chiều ngang cũng như hai lần theo chiều dọc. Và sau đó vẫn tiếp tục trên, và do đó bạn có một nhân rộng trực tiếp của hình ảnh ban đầu của bạn bởi hai. Vì vậy, sau đó nếu chúng ta chi tiết giả cho điều này, chúng tôi muốn để mở các tập tin. Và sau đó biết rằng nếu chúng ta trở lại đây, chúng ta thấy rằng độ rộng cho các outfile là có được khác hơn chiều rộng cho infile. Điều đó có nghĩa là gì? Điều đó có nghĩa là thông tin tiêu đề của chúng tôi là sẽ thay đổi. Và như vậy chúng ta sẽ muốn làm là cập nhật các thông tin tiêu đề, biết rằng khi chúng ta đọc trong các tập tin nếu bạn đang hoạt động trên khung copy.c, chúng tôi đã có một biến cho biết kích thước và vật như thế. Vì vậy, một khi bạn đã có, những gì bạn có thể muốn làm là thay đổi các biến cụ thể. Hãy nhớ rằng, nếu bạn có một cấu trúc, làm thế nào bạn truy cập các biến bên trong. Bạn sử dụng các nhà điều hành chấm, phải không? Vì vậy, sau đó sử dụng đó, bạn biết rằng bạn sẽ cần phải thay đổi các thông tin tiêu đề. Vì vậy, đây chỉ là một danh sách các yếu tố thực tế sẽ được thay đổi trong file của bạn. Kích thước tập tin sẽ được thay đổi, hình ảnh, cũng như chiều rộng và chiều cao. Vì vậy, sau đó sẽ trở lại bản đồ của các bitmap, nhìn cho dù đó là phần đầu tập tin hoặc phần tiêu đề các thông tin có chứa thông tin đó và sau đó thay đổi khi cần thiết. Một lần nữa, nói cp% s resize.c. Điều đó có nghĩa rằng resize.c bây giờ chứa tất cả mọi thứ chứa bên trong bản sao bởi vì bản sao cung cấp cho chúng ta một cách đọc vào mỗi điểm ảnh scanline pixel. Ngoại trừ bây giờ, thay vì chỉ cần thay đổi các giá trị như chúng tôi đã làm trong Whodunit, những gì chúng tôi muốn làm là chúng ta muốn viết nhiều bằng pixel dài như n của chúng tôi là lớn hơn 1. Sau đó, những gì chúng tôi muốn làm là chúng tôi muốn để nó giãn ra theo chiều ngang bằng n, cũng như căng nó theo chiều dọc n. Làm thế nào chúng ta có thể làm điều này? Nói n của bạn là 2 bạn có infile cho. Con trỏ của bạn sẽ bắt đầu tại một trong những người đầu tiên, và những gì bạn muốn làm nếu n là 2, bạn muốn in 2 của những người. Vì vậy, bạn in 2 của những người. Sau đó, con trỏ chuột của bạn sẽ chuyển sang pixel tiếp theo, đó là màu đỏ, và nó sẽ in ra 2 của những màu đỏ, phụ thêm vào những gì nó được thực hiện trước khi. Sau đó con trỏ sẽ di chuyển đến các điểm ảnh tiếp theo và vẽ trong 2 của những người. Nếu bạn nhìn lại khuôn khổ copy.c, điều này không đúng ở đây là nó tạo ra một thể hiện mới của một triple RGB, một biến mới gọi là ba. Và ở đây khi nó đọc vào nó, nó đọc từ 1 infile RGBTRIPLE và lưu trữ nó bên trong mà biến ba. Vì vậy, sau đó bạn thực sự có một biến đại diện cho rằng điểm ảnh cụ thể. Sau đó, khi bạn viết, những gì bạn có thể muốn làm là bọc lấy các báo cáo fwrite vào một vòng lặp for mà viết nó vào outfile của bạn nhiều lần khi cần thiết. Đó là đơn giản. Chỉ cần về cơ bản lặp lại quá trình viết n số lần quy mô nó theo chiều ngang. Nhưng sau đó chúng ta phải nhớ rằng đệm của chúng tôi là sẽ thay đổi. Trước đây, nói rằng chúng tôi đã có một cái gì đó của độ dài 3. Sau đó, chúng tôi sẽ chỉ thêm vào bao nhiêu đệm? Chỉ cần thêm một để làm cho nó là bội số của 4. Nhưng nói rằng chúng tôi đang nhân rộng hình ảnh này đặc biệt bởi n = 2. Vì vậy, sau đó chúng ta sẽ có bao nhiêu điểm ảnh màu xanh ở cuối? Chúng tôi sẽ có 6. 1, 2, 3, 4, 5, 6. Được rồi. 6 không phải là một bội số của 4. Bội số gần nhất của 4 là gì? Đó sẽ là 8. Vì vậy, chúng tôi đang thực sự sẽ có 2 ký tự của padding có. Có ai nhớ nếu chúng ta có một công thức để tính toán đệm và có thể được? [Không nghe được sinh viên phản ứng] >> Yeah, copy.c. Đúng. Có một công thức trong% s để tính toán bao nhiêu đệm bạn có có chiều rộng cụ thể của hình ảnh bitmap. Vì vậy, sau đó sẽ có ích khi bạn cần phải thêm vào một số tiền nhất định của padding để thực sự tìm ra bao nhiêu đệm bạn cần phải thêm. Nhưng có một lưu ý, mặc dù, là bạn muốn làm cho chắc chắn rằng bạn đang sử dụng đúng kích cỡ. Chỉ cần cẩn thận bởi vì về cơ bản bạn sẽ được giao dịch với hai hình ảnh bitmap. Bạn muốn đảm bảo rằng bạn đang sử dụng một trong những quyền. Khi bạn đang tính toán padding cho outfile, bạn muốn sử dụng độ rộng của outfile và không phải là chiều rộng của phần trước đó. Lớn. Đó là loại chăm sóc kéo dài toàn bộ một hình ảnh bitmap theo chiều ngang. Nhưng những gì chúng tôi muốn làm là thực sự căng nó theo chiều dọc cũng. Điều này là có được một chút phức tạp hơn bởi vì khi chúng tôi đã hoàn tất việc sao chép một hàng và viết hàng đó, con trỏ của chúng tôi là có được ở cuối. Vì vậy, nếu chúng ta đọc một lần nữa, sau đó nó chỉ để đọc đến dòng kế tiếp. Vì vậy, những gì chúng tôi muốn làm là loại tìm thấy một số cách sao chép những hàng một lần nữa hoặc chỉ cần loại hàng đó và sau đó viết lại nó một lần nữa. Như tôi đã loại ám chỉ, có một số cách khác nhau để làm điều này. Những gì bạn có thể làm như bạn đang trải qua và đọc thông qua các scanline cụ thể và thay đổi nó khi cần thiết, sau đó loại của các cửa hàng tất cả những điểm ảnh trong một mảng. Sau đó, sau này bạn biết rằng bạn sẽ cần để in ra mảng đó một lần nữa, và do đó bạn chỉ có thể sử dụng mảng để làm điều đó. Một cách khác để làm điều đó là bạn có thể sao chép một hàng, hiểu rằng bạn cần phải sao chép đó một lần nữa, do đó, thực sự di chuyển con trỏ của bạn, và đó sẽ được sử dụng fseek phương pháp. Bạn có thể di chuyển con trỏ của bạn tất cả các cách trở lại và sau đó lặp lại quá trình sao chép một lần nữa. Vì vậy, nếu số mở rộng quy mô của chúng tôi là n, sau đó bao nhiêu lần chúng tôi phải quay trở lại và viết lại một dòng? >> [Sinh viên] n - 1. >> Yeah, hoàn hảo. n - 1. Chúng tôi đã thực hiện nó một lần rồi, do đó, sau đó chúng tôi sẽ muốn lặp lại quá trình trở lại n - 1 số lần. Okay. Như vậy, có bạn có chức năng thay đổi kích cỡ của bạn. Bây giờ chúng ta có thể nhận được một phần thực sự thú vị, pset yêu thích của tôi, đó là phục hồi. Thay vì bitmap, lần này chúng tôi đang làm việc với các hình ảnh JPEG. Chúng tôi đang thực sự không đưa ra một tập tin chỉ của hình ảnh JPEG, chúng tôi đang đưa ra cơ bản là một định dạng thẻ nhớ liệu. Và do đó, điều này có một chút giá trị thông tin và rác trong đầu, và sau đó nó bắt đầu và nó có một loạt các tập tin JPEG. Tuy nhiên, chúng tôi bàn giao một thẻ mà chúng tôi đã xóa các hình ảnh; về cơ bản, chúng tôi đã quên nơi các bức ảnh được nằm trong thẻ. Vì vậy, sau đó nhiệm vụ của chúng tôi trong phục hồi là để đi thông qua định dạng thẻ này và tìm thấy những hình ảnh một lần nữa. May mắn thay, cấu trúc của các tập tin JPEG và các tập tin thẻ là một chút hữu ích. Nó chắc chắn có thể có được một chút phức tạp hơn nếu nó không được ở định dạng này cụ thể. Mỗi tập tin JPEG thực sự bắt đầu với hai chuỗi có thể được liệt kê ở trên. Về cơ bản, bất cứ khi nào bạn có một tập tin JPEG mới, nó bắt đầu với trình tự ffd8 ffe0 hay khác, ffd8 ffe1. Một điều hữu ích để biết là hình ảnh JPEG được lưu trữ liên tục kế nhau. Vì vậy, bất cứ khi nào file JPEG 1 kết thúc, một trong những khác bắt đầu. Vì vậy, không phải là bất kỳ loại trong giữa các giá trị đó. Một khi bạn nhấn bắt đầu của một JPEG, nếu bạn đã được đọc một ảnh JPEG, bạn biết rằng bạn đã nhấn kết thúc trước đó và bắt đầu của một trong những tiếp theo. Loại hình này, tôi đã thực hiện một sơ đồ. Một điều về hình ảnh JPEG là chúng ta có thể đọc chúng trong trình tự của 512 byte tại một thời điểm, tương tự với sự khởi đầu của thẻ. Chúng tôi không cần phải được kiểm tra tất cả các byte duy nhất vì đó sẽ hút. Vì vậy, thay vào đó, những gì chúng ta có thể làm là thực sự chỉ cần đọc 512 byte tại một thời điểm và sau đó, thay vì kiểm tra ở giữa những người trong những lát nhỏ nhỏ, chúng tôi chỉ có thể kiểm tra đầu 512 byte. Về cơ bản, trong bức tranh này, những gì bạn thấy là trong đầu của thẻ, bạn có giá trị mà không phải là thực sự có liên quan đến các hình ảnh JPEG thực tế bản thân. Nhưng sau đó những gì tôi có là một ngôi sao để cho biết một trong hai chuỗi khởi đầu cho một ảnh JPEG. Vì vậy, bất cứ khi nào bạn nhìn thấy một ngôi sao, bạn biết rằng bạn có một tập tin JPEG. Và sau đó tất cả các tập tin JPEG sẽ là bội số của 512 byte nhưng không nhất thiết phải là nhiều. Cách mà bạn biết rằng bạn đã đạt khác JPEG là nếu bạn nhấn một ngôi sao khác, một chuỗi bắt đầu của byte. Sau đó, những gì bạn có ở đây là bạn có tập tin JPEG đỏ tiếp tục cho đến khi bạn nhấn một ngôi sao, được chỉ định bởi một màu sắc mới. Bạn tiếp tục và sau đó bạn nhấn một ngôi sao khác, bạn nhấn khác JPEG, bạn tiếp tục tất cả các con đường cho đến khi kết thúc. Bạn đang ở hình ảnh cuối cùng ở đây, màu hồng. Bạn đi đến cùng cho đến khi bạn nhấn kết thúc của tập tin ký tự. Điều này sẽ thực sự hữu ích. Takeaways chủ yếu ở đây: Các tập tin thẻ không bắt đầu với một JPEG, nhưng khi JPEG bắt đầu, tất cả các hình ảnh JPEG được lưu trữ bên cạnh nhau. Một số giả cho phần Recover. Đầu tiên, chúng ta sẽ mở tập tin thẻ của chúng tôi, và đó là sẽ được sử dụng tập tin của chúng tôi I / O chức năng. Chúng ta sẽ lặp lại quá trình sau đây cho đến khi chúng tôi đã đạt đến kết thúc của tập tin. Chúng ta sẽ đọc 512 byte tại một thời điểm. Và những gì tôi nói ở đây là chúng ta đang đi để lưu trữ nó trong một bộ đệm, do đó, về cơ bản giữ trên 512 byte cho đến khi chúng ta biết chính xác những gì để làm với họ. Sau đó, những gì chúng tôi muốn làm là chúng tôi muốn để kiểm tra xem chúng tôi đã đạt một ngôi sao hay không. Nếu chúng tôi đã đạt một ngôi sao, nếu chúng tôi đã đạt một trình tự bắt đầu, sau đó chúng tôi biết rằng chúng tôi đã trúng một file JPEG. Những gì chúng tôi muốn làm là chúng ta sẽ muốn để tạo ra một tập tin mới trong thư mục pset4 của chúng tôi tiếp tục làm cho tập tin đó. Nhưng cũng có thể, nếu chúng ta đã thực hiện một JPEG, sau đó chúng tôi muốn kết thúc tập tin đó và đẩy nó vào thư mục pset4, mà chúng ta sẽ có tập tin được lưu trữ bởi vì nếu chúng ta không xác định mà chúng tôi đã kết thúc mà JPEG, sau đó chúng tôi về cơ bản sẽ có một số lượng không xác định. Các hình ảnh JPEG không bao giờ sẽ kết thúc. Vì vậy, chúng tôi muốn đảm bảo rằng khi chúng ta đang đọc vào một tập tin JPEG và văn bản rằng, chúng tôi muốn đặc biệt gần đó để mở một trong những kế tiếp. Chúng tôi sẽ muốn kiểm tra một vài điều. Chúng tôi muốn kiểm tra xem chúng ta đang ở bắt đầu của một JPEG mới với bộ đệm của chúng tôi và cũng có thể nếu chúng ta đã tìm thấy một ảnh JPEG trước bởi vì đó sẽ thay đổi quá trình của bạn một chút. Vì vậy, sau đó sau khi bạn đi qua tất cả các cách và bạn nhấn vào cuối của tập tin, sau đó những gì bạn sẽ muốn làm là bạn sẽ muốn đóng tất cả các tập tin đang mở. Điều đó có lẽ sẽ là JPEG cuối cùng tập tin mà bạn có, cũng như các tập tin thẻ mà bạn đã được giao dịch với. Trở ngại cuối cùng mà chúng ta cần phải giải quyết là làm thế nào để thực sự làm cho một tập tin JPEG và làm thế nào để thực sự đẩy nó vào thư mục. Pset yêu cầu mỗi JPEG mà bạn tìm thấy được trong các định dạng sau đây, nơi bạn có số jpg. Số lượng, ngay cả khi nó là 0, chúng ta gọi nó 000.jpg. Bất cứ khi nào bạn tìm thấy một JPEG trong chương trình của bạn, bạn sẽ muốn đặt tên nó theo thứ tự mà nó được tìm thấy. Điều này có nghĩa là gì? Chúng ta cần phải loại theo dõi của chúng tôi đã tìm thấy bao nhiêu và số lượng của mỗi JPEG nên được. Ở đây chúng ta sẽ tận dụng lợi thế của chức năng sprintf. Tương tự như printf, mà chỉ cần loại in một giá trị vào thiết bị đầu cuối, sprintf in các tập tin vào thư mục. Và vì vậy điều này sẽ làm gì nếu tôi đã có sprintf, tiêu đề, và sau đó các chuỗi có, nó sẽ in ra 2.jpg. Giả sử rằng tôi đã đóng các tập tin của tôi một cách chính xác, mà có thể chứa các tập tin mà tôi đã được viết ra. Nhưng có một điều là mã mà tôi có ở đây không hoàn toàn đáp ứng những gì pset yêu cầu. Pset yêu cầu rằng các tập tin JPEG thứ hai nên được đặt tên là 002 thay vì chỉ 2. Vì vậy, khi bạn in ra tên, sau đó có lẽ bạn có thể muốn thay đổi giữ chỗ hơi. Có ai nhớ làm thế nào chúng ta cho phép cho các không gian phụ khi chúng tôi in một cái gì đó? Yeah. >> [Sinh viên] Bạn đặt 3 giữa dấu phần trăm và 2. >> Yeah, hoàn hảo. Bạn sẽ đặt một 3 trong trường hợp này bởi vì chúng tôi muốn có không gian cho 3. % 3d có lẽ sẽ cung cấp cho bạn 002.jpg thay vì 2. Đối số đầu tiên vào các chức năng sprintf thực sự là một mảng char, mà trước đây chúng tôi biết như dây đàn. Những ý chí, loại giống như một lưu trữ tạm thời, chỉ cần lưu trữ các chuỗi kết quả. Bạn sẽ không thực sự được giao dịch với điều này, nhưng bạn cần phải bao gồm nó. Biết rằng tất cả các tên tập tin có số lượng, trong đó có ba nhân vật, và sau đó jpg, bao lâu mảng này nên được? Vứt bỏ một số. Bao nhiêu ký tự trong tiêu đề, trong tên? Vì vậy, có 3 hashtags, thời gian, jpg. >> [Sinh viên] 7. >> 7. Không khá. Chúng tôi sẽ muốn 8 bởi vì chúng tôi muốn để cho phép cho terminator vô giá trị như. Cuối cùng, chỉ để rút ra quá trình mà bạn sẽ được làm cho Recover, bạn có một số thông tin bắt đầu. Bạn tiếp tục cho đến khi bạn tìm thấy sự bắt đầu của một tập tin JPEG, và đó có thể hoặc là một trong hai chuỗi bắt đầu. Bạn tiếp tục đọc. Mỗi dấu gạch chéo ở đây đại diện 512 byte. Bạn tiếp tục đọc, viết, tiếp tục đọc cho đến khi bạn gặp phải một chuỗi bắt đầu. Một khi bạn đã có, bạn kết thúc JPEG hiện tại - trong trường hợp này, đó là màu đỏ, vì vậy bạn muốn kết thúc điều đó. Bạn muốn tên sprintf đó vào thư mục pset4 của bạn, sau đó bạn muốn mở một JPEG mới và sau đó tiếp tục đọc cho đến khi bạn gặp tiếp theo. Hãy đọc, tiếp tục đọc, và sau đó cuối cùng, cuối cùng, bạn sẽ đạt được kết thúc của tập tin, và do đó bạn sẽ muốn để đóng JPEG cuối cùng mà bạn đang làm việc với, sprintf rằng vào thư mục pset4 của bạn, và sau đó nhìn vào tất cả những hình ảnh mà bạn đã nhận được. Những hình ảnh thực sự hình ảnh của CS50 nhân viên, và vì vậy đây là phần thú vị tiền thưởng của các pset đến là bạn đang cạnh tranh trong các phần của bạn để tìm thấy những TFs trong những hình ảnh và chụp ảnh với họ để chứng minh rằng bạn đã thực hiện pset và do đó bạn có thể xem những nhân viên trong các hình ảnh. Vì vậy, sau đó bạn chụp ảnh với các nhân viên. Đôi khi bạn sẽ phải đuổi theo họ. Có lẽ một số người trong số họ sẽ cố gắng để chạy ra khỏi bạn. Bạn chụp ảnh với họ. Điều này được thực hiện liên tục. Nó không phải do khi pset là do. Thời hạn cuối cùng sẽ được công bố trong spec. Sau đó, cùng với trang web của bạn, tùy theo điều kiện nào phần mất hầu hết các hình ảnh với hầu hết các nhân viên sẽ giành chiến thắng một giải thưởng khá awesome. Đó là loại động cơ để có được pset4 bạn đã hoàn thành càng nhanh càng tốt bởi vì sau đó bạn có thể nhận được xuống để kinh doanh săn bắn xuống tất cả các CS50 nhân viên khác nhau. Đó không phải là bắt buộc, mặc dù, vì vậy một khi bạn có được những hình ảnh, sau đó bạn đã kết thúc với pset4. Và tôi đã kết thúc với Walkthrough 4, do đó, cảm ơn tất cả các bạn vì đã đến. Chúc may mắn với Forensics. [Vỗ tay] [CS50.TV]