JASON Hirschhorn: Chào tất cả mọi người, để Tuần 6. Tôi rất vui khi thấy tất cả các bạn còn sống và cũng sau đố 0, bởi vì tôi biết rằng là một chút thô. Nhưng may mắn thay, tất cả các bạn đã làm cực kỳ tốt. Và vì vậy đó là tuyệt vời. Nếu bạn đang ở trong phần của tôi, tôi đã cho hầu hết của bạn sao câu đố của bạn đã. Một vài bạn, tôi gặp sau giờ học. Và nếu bạn là một sinh viên mở rộng và bạn không nhận được bài kiểm tra của bạn trở lại Chưa hết, TF của bạn có thể làm việc trên nó và phân loại nó, và sẽ nhận được nó trở lại cho bạn một thời gian ngắn. Vì vậy, sinh viên mở rộng của tôi là ai xem ngay bây giờ - hy vọng sống - Tôi sẽ nhận được câu đố của bạn một thời gian ngắn là tốt. Chương trình nghị sự của chúng tôi cho ngày hôm nay là như sau. Đầu tiên, chúng ta sẽ đi qua một số nguồn tài nguyên mà CS50 cung cấp cho bạn. Chúng ta sẽ đi qua Câu đố 0 tiếp theo, và Tôi sẽ trả lời bất kỳ câu hỏi ai có về các vấn đề cụ thể. Và sau đó, chúng tôi sẽ được đi qua tập tin I / O và vấn đề thiết lập 5. Hai chủ đề cuối cùng sẽ chiếm phần lớn trong phần hôm nay. Tôi đưa danh sách này lên mỗi tuần như một lời nhắc nhở cho tất cả các bạn, nhưng cốt lõi phần, chúng tôi chỉ có 90 phút - chúng tôi không thể để trang trải tất cả mọi thứ mà tôi rất thích để trang trải cho các bạn. Nhưng chúng tôi có một tấn các nguồn lực cho bạn rút ra sau khi khi bạn nhận được để biết vật liệu và làm việc thông qua vấn đề của bạn đặt ra. Một lời nhắc nhở rằng tôi có một văn bản trực tuyến hộp, thiết lập để bạn có thể điền vào nếu bạn có bất kỳ thông tin phản hồi cho tôi, cả tích cực và xây dựng, về phần. URL mà nằm ngay ở đây. Vì vậy, hãy dành một lúc nếu bạn có bất kỳ thông tin phản hồi, cho dù trong phần, hoặc sau, hoặc sau khi bạn xem video trực tuyến, để cung cấp cho tôi thông tin phản hồi của bạn. Tôi thực sự đánh giá cao bất kỳ và tất cả của nó. Vì vậy, tôi đã có cuộc trò chuyện nhỏ với rất nhiều của tôi sinh viên trong suốt tuần - như tôi tay câu đố trở lại, nói về Tất nhiên, nhìn thấy như thế nào bạn đang làm. Và một chủ đề đã đưa ra hơn và hơn khi nói về - trong đặc biệt - vấn đề đặt ra. Và tôi đã đóng gói chủ đề mà trên bảng ngay bây giờ. Về cơ bản, có sự khác biệt giữa biến trong cái gì đó là thực hiện một cách chính xác và một cái gì đó được thực hiện tốt. Hầu hết mọi người đã và đang làm tuyệt vời về tính đúng đắn - 5 hoặc 4 trên tất cả các psets. Hầu hết mọi người đang nhận được những tất cả thời gian. Tuy nhiên, chỉ vì bạn đã thực hiện một cái gì đó đúng không có nghĩa là bạn đã làm điều gì đó như thanh lịch, hoặc hiệu quả, hoặc như sạch như bạn có thể thực hiện nó. Và đó là những gì thiết kế - và đến một mức độ, phong cách ít - trục được cho. Vì vậy, tôi đẩy tất cả các bạn, và TF khác đang đẩy mạnh các bạn, không chỉ lần lượt trong những điều mà là chính xác, nhưng biến trong những điều được mã hóa tốt. Không làm không cần thiết cho các vòng, không tính toán lại nếu biến bạn không phải. Ví dụ, nhìn lại vấn đề thiết lập 4, khi đặt những viên gạch trên màn hình, mỗi dòng - mỗi viên gạch trong một hàng cho có cùng tọa độ y - cùng một chiều cao phối hợp. Vì vậy, y phối hợp không cần phải được tính toán bên trong nội thất lồng nhau cho vòng lặp mà bạn có thể sử dụng đặt những viên gạch trên màn hình. Nó chỉ cần được tính toán mỗi khi bạn chuyển sang một hàng, hoặc di chuyển xuống liên tiếp. Vì vậy, nói rằng nếu có 10 viên gạch trong một hàng, mỗi viên gạch có thể có cùng một y phối hợp, và rằng y phối hợp chỉ có thể được tính một lần cho tất cả những người. Nó không cần phải được tính toán 10 lần, cũng không có nhu cầu tính toán xảy ra trong thực tế chức năng cuộc gọi - các chức năng gọi gracked mới. Vì vậy, nếu đó là một chút bối rối cho bạn, quát hơn, những điều mà không cần phải xảy ra mỗi lần duy nhất bạn đi qua một vòng lặp FOR không nên đặt bên trong vòng lặp FOR, và không nên xảy ra mỗi khi bạn đi thông qua các vòng lặp FOR. Một ví dụ khác thiết kế tốt, chúng tôi thấy trong 3 tuần cho 15, bạn có thể giữ theo dõi các số không. Vì vậy, khi bạn khởi tạo hội đồng quản trị, bạn tiết kiệm - trong một biến toàn cầu, có lẽ - x và y tọa độ của không. Và sau đó bất cứ khi nào bạn - trong chức năng di chuyển của bạn, bất cứ khi nào bạn thực hiện một động thái thành công, bạn cập nhật vị trí của số không. Mà bạn sẽ tiết kiệm từ việc làm lồng nhau cho vòng xem xét thông qua hội đồng quản trị tất cả các thời gian trong chức năng di chuyển của bạn và tìm thấy những bằng không, hoặc tìm gạch, và sau đó kiểm tra những gì bên cạnh nó. Thay vào đó, bạn có vị trí của bằng không, bạn chỉ có thể xem trên, dưới, và bên trái và bên phải của nó, để tìm ngói bạn đang tìm kiếm. Vì vậy, trong điều khoản của chương trình chúng tôi viết, họ sẽ không bao giờ đủ lớn rằng một số các quyết định thiết kế đang thực sự sẽ cản trở bạn chương trình, hoặc làm cho nó chạy chậm hơn, hoặc thậm chí chạy ra khỏi bộ nhớ. Nhưng chúng tôi vẫn đẩy các bạn viết như thanh lịch và mã hiệu quả nhất có thể. Vì vậy, nếu bạn làm sẽ chỉ viết những điều có một lớn hơn đáng kể phạm vi, họ sẽ được viết với tốt thiết kế ngoài việc được chính xác. Vì vậy, một số bạn có đưa ra ngoài. Đó là điều mà chúng tôi đang tìm kiếm - một cái gì đó chúng ta sẽ tiếp tục đẩy các bạn vào. Nếu bạn có bất kỳ câu hỏi về thiết kế các chương trình của bạn, cảm thấy tự do để tiếp cận với tôi, và tôi hạnh phúc đến đi bộ qua chương trình của bạn với bạn, và chỉ ra một số thiết kế quyết định bạn đã thực hiện, và cung cấp cho bạn một số đề xuất về cách làm cho ngay cả quyết định thiết kế tốt hơn. Vì vậy, chúng ta sẽ di chuyển trên để nói về đố 0. Trước khi chúng tôi làm điều đó, không ai có thắc mắc về những gì Tôi đã được bảo hiểm cho đến nay? [Xào xạc tiếng ồn] JASON Hirschhorn: Bảy giây. OK. Hãy nói về đố 0 một chút. Hầu hết các bạn có đố của bạn 0 trở lại. Nếu bạn không, hy vọng Bạn có nhớ nó một chút. Nhưng nếu bạn đã thực hiện đố 0, sau đó bạn cũng có quyền truy cập vào các file PDF trực tuyến các giải pháp mẫu. Không ai có bất kỳ câu hỏi trước khi chúng tôi nhảy vào vật chất của tuần về một vấn đề cụ thể trên quiz 0 - tại sao câu trả lời là nó là gì? Có ai nhầm lẫn về bất cứ điều gì? Thậm chí nếu bạn có vấn đề ngay, nhưng chỉ muốn tôi giải thích nó một chút hơn, tôi rất vui để làm như vậy bây giờ. Vì vậy, tôi đã yêu cầu các bạn để chuẩn bị sẵn sàng với một số Câu hỏi suy nghĩ về 0. Vì vậy, những người muốn có được chúng tôi bắt đầu với một câu hỏi hay Câu hỏi nhận xét về 0? [Giấy xào xạc] JASON Hirschhorn: Không phải ai đã hoàn hảo. Vì vậy, tôi biết [LAUGHS] có phải là một số câu hỏi Câu hỏi về 0. OK. Vâng. Ompica. OMPICA: Số 10. JASON Hirschhorn: Số 10. Mà một số là 10? OMPICA: Các - JASON Hirschhorn: Tôi haven't - OMPICA: Các bao gồm - JASON Hirschhorn: Số 10 lên tám i - viết tám đến tôi? OMPICA: Vâng. JASON Hirschhorn: OK. Vì vậy, một câu hỏi khác bạn có thể có hỏi là tôi lời tiên tri? Câu trả lời là có. Trong phần trước khi các bài kiểm tra, tôi hỏi các bạn để mã cả Sterling và tám đến tôi. Cả hai đã xảy ra với xuất hiện trên các bài kiểm tra. Vì vậy, hy vọng, bạn trả tiền chú ý đến điều đó. Và nếu bạn đã có, sau đó bạn sẽ có có thể thực hiện tốt trên hai. Nhưng tám đến tôi, chúng tôi đã không thực sự đang nó trong lớp học, nhưng đó là, một lần nữa, hỏi về các bài kiểm tra. Vì vậy, một vài điều để có lưu ý khi mã hóa từ tám đến tôi. Điều đầu tiên, mỗi câu hỏi, là mà bạn cần phải kiểm tra nếu chuỗi tương đương với null. Một vài người đã cố gắng để kiểm tra sau này trong chương trình nếu s khung tôi là - do đó, một nhân vật cụ thể trong đó chuỗi - là bằng null. Nhưng hãy nhớ, không cho rằng về cơ bản - rất tốt để nghĩ về null như là một con trỏ không - một con trỏ đến không - nơi nào đó trong bộ nhớ nơi bạn không bao giờ có thể truy cập. Vì vậy, nếu một cái gì đó bằng null, bạn biết rằng nó đã không được khởi tạo, hoặc không có gì có. Vì vậy, s là một ngôi sao char, s khung tôi là một char. Vì vậy, nó có ý nghĩa để so sánh s để null, nhưng không s khung i thành vô giá trị. Nhưng một lần nữa - vì vậy đó là điều đầu tiên mà bạn đã phải làm - kiểm tra để chắc chắn rằng bạn thực sự có một chuỗi thực. Tiếp theo, bạn muốn đi qua mỗi nhân vật trong chuỗi. Và do đó sẽ giống như một khung s i, ví dụ, nếu tôi là lặp của bạn. Và có nhân vật đó, và nhận được giá trị thực tế của nó. Bạn có nó được lưu trữ như là một char, nhưng giá trị ASCII không - không như một nhân vật - không thực sự là số nguyên không. Đó là một số số khác mà bạn có thể tìm kiếm trong bảng ASCII. Vì vậy, một cách để sửa chữa cho điều đó - có lẽ là cách tốt nhất để sửa chữa cho đó - được trừ đi từ nó giá trị nhân vật - số không là một nhân vật. Vì vậy, trừ đi giá duy nhất, bằng không, một giá duy nhất. Điều đó sẽ đưa bất cứ điều gì bạn có số như một char, và làm cho nó bằng số là một số nguyên thực tế. Và đó là rất giống với phương pháp tiếp cận rất nhiều người mất trong vấn đề thiết lập 2, với Caesar và Viginere - những thuật toán mã hóa, khi bạn đã xoay chúng. Vì vậy, sau khi bạn có nó như là một số từ không để chín, sau đó - tùy thuộc vào nơi nó đi trong số cuối cùng - bạn cần phải nhân nó bởi một sức mạnh của 10. Một số người di chuyển từ phía sau để các phía trước, và nhân cá nhân số bởi một sức mạnh của 10. Một số người chuyển từ phía trước để trở lại - và vì vậy đã cao nhất đặt hàng số đầu tiên - và sẽ tiết kiệm được những người trong một biến truy cập toàn cầu. Và sau đó mỗi lần qua CHO vòng lặp, nhân tay khổng lồ chống biến 10, để làm cho không gian cho các char tiếp theo. Vì vậy, đó là một chút bối rối mà không tôi viết nó trên diễn đàn. Nhưng dung dịch mẫu có sẵn cho bạn. Nhưng đó là những điều lớn chúng tôi đang tìm kiếm. Cũng kiểm tra để đảm bảo rằng mỗi nhân vật cá nhân thực sự là một nhân vật giữa số không và chín, và không một số nhân vật khác, giống như một A, ví dụ. Đó là những điều mà chúng tôi đang tìm kiếm cho trong câu hỏi đó. Điều đó trả lời câu hỏi của bạn? OMPICA: Vâng. JASON Hirschhorn: OK. Được có bất kỳ câu hỏi khác Câu hỏi về 0? Những gì về biên dịch? Tất cả mọi người biên soạn phải không? Không. Có một - [LAUGHS] Thắc mắc về quá trình biên dịch? Wow. [Giấy xào xạc] JASON Hirschhorn: Có. Michael. MICHAEL: là số 7 - ngẫu nhiên? JASON Hirschhorn: Số 7. Số 7 đã có được một số nguyên ngẫu nhiên. Tuyệt vời. Vì vậy, bạn đang đưa ra một số nguyên a và một số nguyên b, và bạn muốn có một ngẫu nhiên số nguyên giữa a và b. Chúng tôi thực sự có thể viết này trên hội đồng quản trị, bởi vì này là một trong những dòng mã - một cách để làm điều đó. Vì vậy, chúng tôi đang đưa ra drand như một chức năng chúng tôi có thể sử dụng. Và những gì drand - giả sử nó được hạt giống - những gì drand trở lại? MICHAEL: Một float giữa 0.0 và 1.0. JASON Hirschhorn: Một số - yeah. Một số giữa 0 và 1. Và vì vậy chúng tôi có b và a. Và sau đó chúng tôi có số ngẫu nhiên của chúng tôi giữa 0 và 1 ban cho chúng ta drand. Một số người đã cố gắng để đưa b, hoặc b trừ một, hoặc một cái gì đó bên trong những ngoặc. Điều đó có nghĩa rằng họ đang đối số cho chức năng này. drand không có bất kỳ đối số - như getString không không có bất kỳ đối số. Vì vậy, nó chỉ là dấu ngoặc mở, đóng Dấu ngoặc đơn - và rằng, chính nó, là các cuộc gọi chức năng. Và cung cấp cho bạn một số giữa 0 và 1. Tất nhiên, chúng ta có cả một loạt rằng con số có thể được in Nói, nếu b là 10 và 5, chúng tôi thực sự muốn có một số với một loạt 5. Vì vậy, điều tiếp theo chúng ta cần làm là nhân này bởi phạm vi b trừ đi một. Vì vậy, giả định đó là nhân. Và rằng sẽ cung cấp cho chúng tôi một số trong một phạm vi nhất định. Và phạm vi cụ thể là sự khác biệt giữa b trừ đi một. Và cuối cùng, đó sẽ chỉ cung cấp cho nó từ - nói khoảng từ b trừ một là 5, mà sẽ cung cấp cho chúng ta một số 0-5. Nhưng nếu một trong thực tế, 5, chúng ta cần tăng phạm vi này lên đến nơi nó thực sự cho là, bằng cách thêm một. Để được quyền logic. Và sau đó, bạn sẽ phải một câu hỏi khác? MICHAEL: số Tôi chỉ cảm thấy thực sự câm ngay bây giờ. [LAUGHS] JASON Hirschhorn: số Không cảm thấy thực sự ngu ngốc. Một số người đấu tranh với câu hỏi này. Và sau đó, câu hỏi khác là, drand, bạn nói, cung cấp cho bạn một phao - trả về một phao. Nhưng chức năng này thực sự hỏi cho một số nguyên để được trả lại. Bạn không cần phải cast này một cách rõ ràng một số nguyên, bởi vì những hoạt động sẽ xử lý nó như một tất cả nổi - như một số điểm nổi. Như ý muốn này - thậm chí nếu điều này là một số nguyên, điều này sẽ được nhân cách chính xác. Tất cả các nhân sẽ làm việc. Bạn không cần phải bỏ nó ở đây. Trong thực tế, bạn không nên bỏ nó. Mà có - nếu bạn muốn bỏ một số đó là giữa 0 và 1 - một số ngẫu nhiên, một điểm nổi - sau đó nó sẽ hoặc được chỉ 0 hoặc 1, do đó bạn sẽ mất tất cả độ chính xác. Nhưng cuối cùng, khi bạn quay trở lại, nó sẽ tự động được gửi về là một số nguyên. Vì vậy, bạn không cần phải làm mà đúc chính mình. Vì vậy, đây là câu trả lời cho câu hỏi đó, số 7. Bất kỳ câu hỏi khác về đố 0? Yeah, Annie. ANNIE: Khi nào chúng ta sử dụng đệ quy - khi chúng ta sử dụng vòng lặp đi lặp lại? JASON Hirschhorn: Khi nào bạn sử dụng đệ quy - vì vậy thường nhiều hơn, ưu và nhược điểm của đệ quy so với một cách tiếp cận lặp đi lặp lại. Ai cũng có thể cung cấp chuyên nghiệp hoặc một con? Xin vui lòng? Không thể bất cứ ai. Những người có thể cung cấp chuyên nghiệp hoặc một con? [Giấy xào xạc] HỌC SINH 1: Recursive ít mã hóa - ít đánh máy? JASON Hirschhorn: Vì vậy, nói chung, đặc biệt là đệ quy, một chức năng - hoặc một thuật toán như hợp nhất loại - mà cho mượn một cách tiếp cận đệ quy - có thể đơn giản hơn mã đệ quy. Và chỉ có ý nghĩa hơn để làm điều đó đệ quy. Vì vậy, đó sẽ là một chuyên nghiệp để đệ quy. Những người khác? Yeah? HỌC SINH 2: Côn để đệ quy - Nó sử dụng nhiều bộ nhớ hơn. JASON Hirschhorn: Vì vậy, chính xác. Một hàm đệ quy sẽ tiếp tục bổ sung ngăn xếp khung vào stack. Vì vậy, nếu bạn đang hoạt động trên rất nhiều số, và phải gọi này hoạt động rất nhiều, sau đó bạn chắc chắn sẽ mất nhiều bộ nhớ hơn, trong khi một cách tiếp cận lặp đi lặp lại sẽ chỉ đặt một ngăn xếp khung trên stack, vì tất cả sẽ xảy ra trong vòng một chức năng. Bất kỳ ưu và nhược điểm khác? Yeah. HỌC SINH 3: Ưu điểm cho đệ quy. Bạn không cần phải xác định trong tiến bao nhiêu lần mã đã được lặp đi lặp lại. Bạn có thể có một số định trước của thời gian mà bạn phải lặp, sau đó đệ quy tốt hơn, vì nó có kết quả. JASON Hirschhorn: Tôi nghĩ rằng đó là sự thật. Nhưng tôi nghĩ rằng trong cả hai trường hợp bạn sẽ không bao giờ - có thể bạn sẽ nhận được một số đầu vào từ người sử dụng. Hoặc chức năng này sẽ có một số đầu vào mà sẽ xác định bao nhiêu lần nó nên chạy. Vì vậy, nói chung, bạn sẽ không cứng mã - thậm chí trong một cách tiếp cận lặp đi lặp lại - như thế nào nhiều lần lặp cần được chạy. Bạn đã có một bạn đã suy nghĩ về, Annie? OK. Vì vậy, những có lẽ là hai - ủng hộ lớn nhất và lớn nhất Con đến một đệ quy so với một cách tiếp cận lặp đi lặp lại. OK. Bất cứ điều gì khác trên quiz 0? Chúng ta hãy chuyển. Tập tin I / O. Có một đoạn ngắn tuyệt vời tuần này trên tập tin I / O mà hy vọng bạn đã xem nhiều lần, và ngưỡng mộ. Rất nhiều công việc đã đi vào đó, và tôi đã nghe nói nó là điên rồ hữu ích. Tôi cũng bao gồm các liên kết trên slide này, trong trường hợp bạn không có một cơ hội để xem nó 10 lần. Vì vậy, chúng ta sẽ đi một thời gian ngắn trong bước chính để mở và làm việc với các tập tin, và sau đó chúng ta sẽ đi sâu vào một vấn đề mã hóa trước khi kiểm tra các bộ vấn đề. Vì vậy, một lần nữa, tôi sẽ đặt này lên trên màn hình, nhưng tôi sẽ nói cho chỉ một phút về những gì chúng tôi làm gì ở đây với tập tin I/O-- có nghĩa là gì? Điều đó có nghĩa rằng chúng ta có thể tạo ra của chúng tôi các chương trình, và sau đó có các chương trình của chúng tôi xuất cảnh, và không thực hiện bất kỳ tác động trên thế giới bên ngoài của chương trình của chúng tôi. Nhưng khi chúng tôi bắt đầu làm việc với các tập tin - cả hai đọc chúng trong và tạo ra chúng - chúng ta có thể có một số ảnh hưởng đến thế giới bên ngoài của chương trình của chúng tôi. Cũng giống như nếu Microsoft Word đã không thể thực hiện bất kỳ các tài liệu Word, sau đó một khi Microsoft Word bỏ thuốc lá, tất cả các bạn công việc sẽ được đi, và nó sẽ thực sự là vô ích. Chúng tôi cuối cùng muốn có thể viết chương trình có thể ảnh hưởng đến thế giới xung quanh, cả hai bằng cách tham gia trong đầu vào phức tạp - về các tập tin và thông qua các tập tin, và cũng tạo ra thú vị và kết quả đầu ra hấp dẫn - về các loại tập tin khác nhau. Vì vậy, đó là lý do tại sao chúng tôi đang bắt đầu học cách làm việc với các tập tin. Cụ thể hơn, những gì chúng tôi làm là như sau. Nó rất đơn giản. Chỉ có một vài bước, và chúng được liệt kê ở đây trên mã này. Vì vậy, chúng ta sẽ đi qua dòng mã này bằng cách dòng. Đầu tiên, bạn sẽ thấy nổi bật - khi bạn đang làm việc với một tập tin, không phụ thuộc vào loại tập tin đó là, bạn cần phải mở nó. Và đó là với một cuộc gọi để fopen - ngay tại đây. Bạn bao gồm tên của tập tin. Nếu các tập tin không có trong thư mục của bạn, hoặc thư mục mà chương trình này cuộc sống, sau đó bạn cũng cần phải bao gồm một đường dẫn đến nơi tập tin đó là. Chúng ta sẽ cho rằng điều này tập tin gọi là "text.txt" - một tài liệu văn bản đơn giản - là trong cùng một thư mục như chương trình này là. Vì vậy, đó là một điều cần lưu tâm - đó nếu bạn muốn mở một tập tin ở một nơi khác, bạn thực sự cần bao gồm vị trí của nó. Thứ hai, bạn có thể vượt qua một đối số fopen, và đó là những gì bạn muốn làm với các tập tin. Có ba đối số chính bạn sẽ vượt qua để fopen. Ai có thể cho tôi những ba? Ai có thể cho tôi một trong số họ? Vâng. HỌC SINH 4: tên tập tin? JASON Hirschhorn: Xin lỗi. Ba lập luận chính bạn có thể vượt qua như là đối số thứ hai để fopen. Bạn nói đúng - tên tập tin là số đầu tiên. Nhưng đối số thứ hai là để fopen nói chung là ba dây, và - có. Aleja. ALEJA: A để phụ thêm. JASON Hirschhorn: A, nếu bạn muốn thêm vào một tập tin đã tồn tại. HỌC SINH 5: R để đọc. JASON Hirschhorn: R, nếu bạn muốn đọc từ một tập tin. HỌC SINH 6: W cho viết. JASON Hirschhorn: Và w, nếu bạn muốn viết vào một tập tin. Vì vậy, trong trường hợp này, chúng tôi đang viết vào tập tin, vì vậy chúng tôi có w. Bạn mở nó, bạn cũng phải lưu nộp ở đâu đó, và đó là với mã để phía bên tay trái của toán tử gán - Tôi là tạo ra một con trỏ đến một tập tin được gọi là, trong trường hợp này, tập tin. Chúng tôi sẽ không phải lo lắng gì này tất cả các mũ FILE điều. Chỉ cần nói rằng, đó là một chặng đường dài dòng số không và những người thân. Và đó là cách chúng ta sẽ vận hành nó và hiểu nó. Điều tiếp theo chúng ta cần làm - và này là vô cùng quan trọng - bất cứ khi nào bạn mở một tập tin - trên thực tế, bất cứ khi nào bạn gọi malloc, cho ví dụ, và nhận được một số bộ nhớ và cố gắng và lưu nó trong một con trỏ, bạn luôn luôn muốn kiểm tra để đảm bảo rằng chức năng không trở về null. Vì vậy, trong trường hợp này, chúng tôi đang kiểm tra để thực hiện chắc chắn rằng chúng tôi thực sự đã mở nộp một cách chính xác, và có không có lỗi trong chương trình của chúng tôi. Tiếp theo, khi chúng tôi đã kiểm tra để chắc chắn rằng chúng ta có một tập tin làm việc, chúng ta có thể viết, hoặc đọc từ, hoặc thêm vào các tập tin. Trong trường hợp này, tôi chỉ đơn giản in một dòng vào tập tin này. Làm thế nào để tôi biết rằng? Vâng, tôi đang sử dụng chức năng này gọi là fprintf. Tất cả các chức năng mà bạn sẽ sử dụng khi viết, hoặc đọc từ, hoặc thao tác tập tin sẽ tương tự như chức năng mà bạn đã nhìn thấy trước, nhưng bắt đầu bằng chữ F, đứng cho tập tin. Và fprintf, không giống như in bình thường của chúng tôi ứng dụng, nhận một đối số bổ sung, và đó là tập tin mà bạn muốn in dòng này. Tôi không có bất cứ điều gì để quyền của Ohai. Tôi không có người thứ ba lập luận printf - hoặc đối số thứ hai printf, các số thứ ba để fprintf, bởi vì tôi không có bất kỳ giữ chỗ ở đây. Tôi không bao gồm bất kỳ biến. Nhưng một lần nữa, fprintf và tất cả các tập tin chức năng hoạt động với các tập tin thường sẽ cần các tập tin mà họ đang điều hành. Cuối cùng, điều quan trọng cuối cùng làm là để đóng tập tin, giống như với - bất cứ khi nào chúng tôi malloc một cái gì đó, chúng tôi muốn giải phóng một cái gì đó, vì sợ chúng tôi có một rò rỉ bộ nhớ - chúng tôi muốn để đóng tập tin của chúng tôi. Nếu chương trình này đã thoát mà không đóng cửa các tập tin, tỷ lệ cược là không có gì sẽ đi sai, đặc biệt là nếu nó là một tập tin nhỏ. Nhưng chắc chắn là phong cách mã hóa tốt và thực hành phải luôn luôn đóng tập tin của bạn khi bạn đã hoàn tất sử dụng nó. Vì vậy, đó là những điều cơ bản của tập tin I / O. Bạn đã có thể thấy rằng trước khi, hoặc xem nó ở chỗ ngắn tuyệt vời. Không ai có bất kỳ câu hỏi, trước khi chúng ta đi vào một số mã hóa thực hành vấn đề, về tập tin I / O hoặc bước Tôi chỉ cần đi qua? [Gõ SOUNDS] JASON Hirschhorn: Bạn có có một câu hỏi, Avi? AVI: số JASON Hirschhorn: OK. Tôi sẽ chờ đợi thêm bảy giây. [LAUGHS] Đó là một mẹo thực sự tốt. Các bạn chỉ không thích đặt câu hỏi. Đó là tốt. OK. Vì vậy, vấn đề thực hành đầu tiên của chúng tôi là, chúng tôi đi lặp lại trong các chức năng của một công cụ dòng lệnh mà bạn có thể sử dụng trước - bản sao - các công cụ sao chép. Nếu bạn gõ cp và sau đó vượt qua nó hai đối số vào thiết bị đầu cuối của bạn, bạn có thể sao chép một tập tin. Và đó là những gì chúng ta sẽ viết ngay bây giờ. Vì vậy, một lần nữa, đọc tắt của slide này, tôi muốn bạn viết một chương trình mà có hai và chỉ có hai dòng lệnh đối số - một tập tin nguồn và file đích - và bản sao nội dung của nguồn tập tin vào tập tin điểm đến một byte tại một thời điểm. Vì vậy, đó là rất nhiều yêu cầu. Một lần nữa, một cách tiếp cận tốt này là để không đi thẳng vào mã C, nhưng chia nó ra thành một vài bước. Đầu tiên, suy nghĩ về logic - chính xác những gì tôi yêu cầu bạn làm - và hiểu tất cả các bước cho vấn đề này. Không trong C, chỉ trong một số giả, hoặc thậm chí là một mô hình tinh thần của những gì đang xảy ra. Tiếp theo, một khi bạn có giả xuống, tìm ra cách giả bản đồ vào các công cụ và những thứ chúng tôi đã học cách sử dụng trong C. Và cuối cùng, một khi bạn có tất cả những với nhau, bạn có thể mã vấn đề. Mất 5 đến 10 phút để làm việc về vấn đề này. Tôi sẽ đưa các hướng dẫn trở lại trong một giây. Và sau đó chúng ta sẽ đi qua mã giả, và mã nó sống như một nhóm. Nếu bạn có bất kỳ câu hỏi trong khi bạn đang làm việc này, cảm thấy tự do để nâng cao bàn tay của bạn, và tôi sẽ đến xung quanh và trả lời chúng. HỌC SINH 7: Tôi có thể swipe một mảnh giấy? JASON Hirschhorn: Chuyện gì vậy? [Gõ SOUNDS] JASON Hirschhorn: OK. Chúng ta hãy xem các giả đầu tiên, và sau đó tôi sẽ cung cấp cho bạn một vài chi tiết phút để kết thúc mã hóa. Những người muốn bắt đầu tôi ra với dòng đầu tiên của giả cho chức năng này? HỌC SINH 8: Kiểm tra để đảm bảo rằng bạn đã được đưa ra hai tập tin. JASON Hirschhorn: OK. Và nếu chúng tôi không? HỌC SINH 8: Tôi sẽ trở về 0. JASON Hirschhorn: Chúng ta có nên trở về 0? HỌC SINH 8: Quay trở lại một - tẩy trống. Xin lôi. JASON Hirschhorn: Vâng. Có lẽ không phải 0. Vì 0 có nghĩa là tất cả mọi thứ là tốt. OK. Vì vậy, đó là những dòng đầu tiên của giả. Những người có dòng thứ hai của mã giả? HỌC SINH 9: Mở cả các tập tin? JASON Hirschhorn: Mở cả hai tập tin. OK? HỌC SINH 10: Kiểm tra xem nếu tập tin là NULL? JASON Hirschhorn: Kiểm tra để chắc chắc chắn không phải là NULL. Như một sang một bên - giảm 0 - là NULL? HỌC SINH 11: Số JASON Hirschhorn: Đó không phải là NULL. Đó được gọi là terminator NULL. Nó thực sự viết chỉ với một l. Vì vậy, kiểm tra một cái gì đó so với - đó thực sự là một nhân vật - để kiểm tra một cái gì đó chống lại được không giống như kiểm tra xem nó bằng NULL. Và một số người - về câu đố của họ và vấn đề của họ bộ - đã nhận được hai trong số những nhầm lẫn. Nhưng hai trong số đó là trong thực tế khác nhau. Một kết thúc một chuỗi - một là một con trỏ đến 0. HỌC SINH 12: Tại sao bạn không kiểm tra đảm bảo rằng các tập tin không phải là NULL trước khi bạn mở chúng? JASON Hirschhorn: Vì vậy, mở tiết kiệm một cái gì đó trong tập tin đó. Và nếu bạn quay trở lại đây - để dòng này - fopen - sẽ cung cấp cho bạn một địa chỉ và lưu trữ địa chỉ trong tập tin nếu nó hoạt động. Nếu nó không hoạt động, nó sẽ lưu trữ NULL - HỌC SINH 12: Oh. OK. Có bạn. JASON Hirschhorn: Trong file. Vì vậy, bạn không thể kiểm tra NULL trước khi bạn mở chúng. NULL có nghĩa là một cái gì đó không hoạt động chính xác. OK. Vì vậy, hãy kiểm tra để chắc chắn không là? Hay là? Chúng ta nghĩ gì? Chúng tôi sẽ đi với điều đó. HỌC SINH 13: Liệu. JASON Hirschhorn: Liệu? Không là? HỌC SINH 13: Liệu. JASON Hirschhorn: OK. Chúng tôi dường như có một số sự đồng thuận về điều đó. Không là NULL. OK, dòng tiếp theo của mã giả. Người đã không cho tôi một dòng chưa? Chúng tôi sẽ chờ đợi cho bạn. Yeah. HỌC SINH 14: Bạn phải đọc từ các tập tin đầu tiên? JASON Hirschhorn: OK. HỌC SINH 14: Hoặc chúng ta sử dụng fscanf hay một cái gì đó như là các tập tin đầu tiên? JASON Hirschhorn: Vì vậy, chúng tôi muốn đọc từ tập tin đầu tiên và - chúng ta hãy đặt rằng ngay tại đây. Đọc từ tập tin nguồn. Và sau đó, chúng ta làm gì sau khi chúng tôi đọc từ tập tin nguồn? Người khác? HỌC SINH 15: Viết vào các tập tin đích? JASON Hirschhorn: Chúng tôi viết để các tập tin đích, và - OK. Những gì khác chúng ta đang mất tích? Người khác đã không cho tôi một dòng mã nào - của giả. Yeah. HỌC SINH 16: Có lẽ bạn luôn luôn có thể kiểm tra cho dù có điều gì đó để đọc cho, như dòng tiếp theo? Mà như dòng tiếp theo, xem nếu nó tồn tại. [Điện BEEP] JASON Hirschhorn: Rất tiếc. Đó là phần mềm nhật ký của tôi. Yeah? HỌC SINH 16: Vâng. JASON Hirschhorn: Vì vậy, cung cấp cho nó cho tôi một lần nữa. HỌC SINH 16: Kiểm tra xem có vẫn còn là một dòng tiếp theo từ tập tin mã nguồn để đọc. JASON Hirschhorn: OK. Vì vậy, chúng tôi không đọc dòng - được đọc byte ở đây - nhưng bạn đã đúng. Chúng tôi muốn đọc và viết cho đến khi không có nhiều byte. OK. Và do đó, những thực sự cần được thụt vào một chút, bởi vì họ đang ở dưới đó. Phải không? Cho đến khi chúng tôi ra khỏi byte, chúng ta sẽ đọc từ nguồn tập tin và viết để file đích. Và sau đó, là những gì cuối cùng dòng giả? Một ai đó không được tôi một cái gì đó được nêu ra. HỌC SINH 17: Đóng tập tin? JASON Hirschhorn: Chính xác. Đóng cửa các tập tin. Do đó, có giả của chúng tôi. Tôi sẽ đặt giả vào gedit, và trong một vài phút chúng tôi sẽ mã này lại với nhau. OK. Chúng ta hãy bắt đầu như là một nhóm. Nishant, tôi có tập tin mới của tôi. Tôi vừa mới mở này lên. Tài liệu tiêu đề 1. Điều đầu tiên tôi phải làm là gì? NISHANT: Bao gồm các thư viện? JASON Hirschhorn: OK. Những gì thư viện? NISHANT: stdio.h, stdlib.h, tôi tin rằng? JASON Hirschhorn: OK. Stdlib cho là gì? NISHANT: Tôi quên. JASON Hirschhorn: OK. Vì vậy, bao gồm stdio. Tôi nên làm gì ngay cả trước khi Tôi bắt đầu viết mã? NISHANT: Viết tiêu đề? JASON Hirschhorn: Làm thế nào Tôi làm cho nó màu? [Interposing TIẾNG NÓI] NISHANT: Làm thế nào để bạn nhận được nó màu? JASON Hirschhorn: Làm thế nào Tôi màu sắc mã hóa? NISHANT: Tôi không biết. Oh. Tiết kiệm. JASON Hirschhorn: Lưu. Vâng. Tôi nên lưu nó như là một c.. Vì vậy, lưu nó vào máy tính để bàn như cp.c. Ngọt ngào. Và nếu tôi muốn nhận được phong cách đầy đủ điểm, những gì nên tôi bao gồm ở đầu trang? NISHANT: Bạn có thể viết tên, tên của bạn của chương trình, và mục đích của chương trình không? JASON Hirschhorn: Hình tốt. Tuyệt vời. Vì vậy, bạn đã bắt đầu chúng tôi ra một cách hoàn hảo. # Bao gồm - chúng tôi cũng sẽ viết - OK. Vì vậy, tôi nghĩ rằng tôi tất cả các thiết lập để đi. Những người có dòng mã đầu tiên cho tôi - hoặc dòng đầu tiên của mã nó sẽ làm để đáp ứng đầu tiên của chúng tôi đăng giả? Bạn. HỌC SINH 18: không nên đó là int argc, và sau đó char * argv? JASON Hirschhorn: Tôi nghĩ rằng bạn nói đúng. Chúng ta hãy thay đổi nó để int main, dấu ngoặc mở, int argc, dấu phẩy, char * argv? Như thế? HỌC SINH 18: Chân đế. JASON Hirschhorn: Chân đế. Mở khung, khung gần, cha mẹ gần. Hoàn hảo. Bây giờ tôi có thể đối số dòng lệnh. OK. Đảm bảo chúng tôi đang đưa ra hai tập tin. Bạn có thể cho tôi đó là tốt. HỌC SINH 18: Nếu argc - này không bằng 3. JASON Hirschhorn: Nếu dấu ngoặc mở argc không bằng 3? HỌC SINH 18: Vâng, bạn quay trở lại 1 hoặc bất cứ điều gì. JASON Hirschhorn: Xin lỗi. HỌC SINH 18: Quay trở lại 1 hoặc bất cứ điều gì. JASON Hirschhorn: Trở về 1. OK? Tuyệt vời. Mở cả hai tập tin. Ai có thể giúp tôi mở cả hai tập tin? Người đã không cho tôi đang chưa? Kurt? Kurt: Vì vậy, tất cả các mũ F-I-L-E nguồn sao. JASON Hirschhorn: Tôi sẽ để đưa ra các nguyên âm. Đó là mát mẻ. Nó giống như Tumblr. HỌC SINH 18: Bình đẳng fopen - JASON Hirschhorn: Bình đẳng fopen? HỌC SINH 18: Mở dấu ngoặc, argv, khung mở. JASON Hirschhorn: Chờ. Xin lôi. Mở dấu ngoặc. OK. HỌC SINH 18: Vâng. Argv phụ 1. JASON Hirschhorn: Sub 1? HỌC SINH 18: Vâng. Argv khung mở 1 - Vâng. Và sau đó dấu phẩy, và sau đó mở đôi giá, r, giá gấp đôi, dấu ngoặc đóng, dấu chấm phẩy. JASON Hirschhorn: Sweet. Và những gì về một trong những khác? HỌC SINH 18: Rất tương tự, nhưng thay vì S-R-C, bạn muốn gọi nó là D-S-T. JASON Hirschhorn: Oo! Tôi thích điều đó. HỌC SINH 18: Chỉ cần D-S-T. Yeah. Và sau đó argv, mở khung, 2. Yeah. Và sau đó w thay vì r. Yeah. JASON Hirschhorn: Great. Vài dòng. Ngoài ra, nếu ai có điều để thêm vào đường mà chúng tôi đã thực hiện, cảm thấy tự do thêm những người là tốt. Kiểm tra để đảm bảo không là NULL. Ai có thể cho tôi mã tôi cần phải đáp ứng mà dòng giả? Archer. CUNG: Nếu src bằng bình đẳng NULL hoặc dst bằng bình đẳng NULL, sau đó bạn quay trở lại - JASON Hirschhorn: Cái gì? CUNG: Trở về 2? JASON Hirschhorn: Trở về 2. Vì vậy, nếu mở dấu ngoặc src bằng bằng NULL, hoặc - bất cứ điều gì mà thing's - ống? Ống? Chúng tôi sẽ gọi nó là đường ống. Đường ống, đường ống, dst bằng bình đẳng NULL, trả lại 2. OK? Cho đến khi chúng tôi ra khỏi byte - chúng tôi loại bỏ qua bước này từ phần giả để đi đến đây. Nhưng cho đến khi chúng tôi ra khỏi byte - những gì âm thanh mà không như thế nào? Loại cấu trúc C - nhưng tôi không sử dụng cấu trúc từ, bởi vì chúng ta sẽ bắt đầu sử dụng mà trong trường hợp khác - nhưng C công cụ không âm thanh như thế nào? HỌC SINH 19: Một vòng lặp. JASON Hirschhorn: Một vòng lặp. Nghe có vẻ như một vòng lặp. Vì vậy, những người có thể cung cấp cho tôi những dòng đầu tiên của mã vòng lặp ở đây? Bạn cũng có thể chọn những loại vòng lặp mà bạn muốn, nếu bạn cho tôi dòng mã này. Có ba loại. Bạn có thể chọn. Tôi sẽ đề nghị một trong những. Avi. Mà một trong những bạn muốn? AVI: CHO. JASON Hirschhorn: CHO. AVI: int i bằng số không. JASON Hirschhorn: OK. AVI: Phần này tôi không chắc chắn về. Nhưng tôi nhỏ hơn kích thước nguồn sao? Tôi không chắc chắn về điều đó. JASON Hirschhorn: OK. AVI: Bởi vì bạn muốn kích thước của một tập tin, phải không? JASON Hirschhorn: Vì vậy, đây có lẽ sẽ không cung cấp cho chúng tôi kích thước của thực tế tập tin trong byte. Vì vậy, những gì khác chúng ta có thể làm gì? Một dạng khác của vòng lặp là gì? Hoặc chúng ta nên dính với các vòng lặp FOR? HỌC SINH 20: Bạn có thể làm một vòng lặp while? Và sau đó, những gì bạn muốn làm là bạn mong - bởi vì chúng ta có một char * cho các tập tin. Vì vậy, nếu chúng ta chỉ cần giữ cách tăng mà cho đến khi chúng tôi tìm thấy những nhân vật NULL tại kết thúc của nó? Hoặc không có, đó là không phải là cách tập tin làm việc? JASON Hirschhorn: Vì vậy, chúng ta có thể giữ incrementing char * cho đến khi chúng ta tìm thấy NULL - HỌC SINH 20: Về cơ bản tiếp tục đi nhân vật của nhân vật cho đến khi chúng ta nhấn cuối của tập tin. JASON Hirschhorn: Có. Vì vậy, đó là những gì chúng tôi muốn làm. Chúng tôi muốn tiếp tục đọc, nhân vật của nhân vật, cho đến khi chúng tôi nhận được cuối của tập tin. HỌC SINH 20: Vâng. Tìm - kết thúc hoặc dấu hiệu dừng lại là những gì ở cuối của một tập tin văn bản. JASON Hirschhorn: OK. Vì vậy, khi chúng tôi nhận được vào cuối của tập tin - làm thế nào để chúng ta biết chúng ta đã đạt đến kết thúc của một tập tin? Nếu tôi gọi điện thoại - vì vậy hãy bước trở lại. Một chức năng là gì? Chúng ta hãy đi đến dòng này ngay tại đây. Đọc từ tập tin nguồn. Ai có thể cho tôi rằng dòng mã? HỌC SINH 21: fscanf? JASON Hirschhorn: fscanf. OK. Những gì nếu tôi muốn đọc, rất đặc biệt, một byte? HỌC SINH 21: Tôi không biết. JASON Hirschhorn: OK. Thậm chí đơn giản hơn fscanf - là những gì một - Tôi muốn đọc từ một tập tin nguồn? Đọc từ một tập tin nguồn. Một chức năng là những gì - yeah. HỌC SINH 22: Đó là fread? JASON Hirschhorn: fread. Tôi nghĩ rằng chúng ta hãy gắn bó với là một trong những cho bây giờ. Loại đối số không fread nào? HỌC SINH 22: Có thể là các loại tập tin, và sau đó vị trí trong tập tin? JASON Hirschhorn: tôi có thể loại gì đây để tìm ra loại của các đối số fread mất? SINH VIÊN NHIỀU: Man fread. JASON Hirschhorn: Man fread và fwrite. Hình như họ đi chơi với nhau. Vì vậy, fread có bao nhiêu đối số? HỌC SINH 23: Bốn. JASON Hirschhorn: Phải mất bốn đối số. Phải mất một con trỏ, kích thước, và điều, đó là kỳ lạ, và một số tập tin. OK? Hãy đọc về nó ở đây. "Chức năng fread đọc n memb các yếu tố dữ liệu, mỗi kích thước byte dài, từ dòng trỏ đến bởi dòng, lưu trữ chúng ở vị trí được đưa ra bởi con trỏ. " Vì vậy, bốn đối số. Tại sao tôi không chỉ cần sao chép này, và dán ngay tại đây. OK. Vì vậy, những người có thể bắt đầu điền những lập luận này cho tôi không? Avi. AVI: Đi ra khoảng trống. Đưa chỉ src. Đưa ra con trỏ và các ngôi sao. Đặt src. Sau đó - JASON Hirschhorn: Vì vậy, tôi sẽ dừng lại bạn có, bởi vì đó là không chính xác. Bạn nói đúng với src, nhưng nơi src nên đi đâu? [Interposing TIẾNG NÓI] JASON Hirschhorn: Nó sẽ đi qua đây. Đó là src - src của chúng tôi là một loại. Chúng ta hãy xem đây. Đây là yêu cầu cho một loại FILE *, chúng tôi thực sự thường nhìn thấy chúng như thế. Vì vậy, đây là yêu cầu cho một đối số gõ FILE * gọi là dòng đó là src. OK? Điều gì kích thước của những điều làm chúng tôi muốn đọc? Tôi đưa cho bạn này trong Mô tả vấn đề. HỌC SINH 24: Một byte tại một thời điểm. JASON Hirschhorn: Một byte. Làm thế nào lớn là một byte? Kích thước của nó là trong byte, do đó những gì Tôi có thể đặt ngay tại đó? HỌC SINH 25: Một. JASON Hirschhorn: Một. Đúng. Kích thước của nó là trong đơn vị byte, do đó, 1 là 1 byte. Bao nhiêu tôi muốn đọc tại một thời điểm. HỌC SINH 26: Một? JASON Hirschhorn: Một điều. Tôi muốn đọc một điều kích thước 1, một vết cắn tại một thời điểm. Và nơi nào tôi đặt nó, một khi tôi đọc nó? HỌC SINH 27: Điểm đến? JASON Hirschhorn: Vì vậy, tôi không thể đặt nó thẳng vào điểm đến. HỌC SINH 28: Bạn đang đặt sẽ vào một con trỏ thứ ba? HỌC SINH 27: Để đến đích. JASON Hirschhorn: OK. Yeah. HỌC SINH 29: Bạn có thể khai báo một cái gì đó để hoạt động như một lưu trữ tạm thời trước đó. JASON Hirschhorn: OK. Đưa cho tôi. HỌC SINH 29: tập tin khác con trỏ, có thể? JASON Hirschhorn: OK. Vì vậy, đây là khoảng trống sao - đó là một loại trống sao, do đó nó không phải là một con trỏ tập tin. Và nếu tôi đọc một byte, nơi sẽ là một nơi tốt để lưu trữ một byte? HỌC SINH 29: Một mảng? JASON Hirschhorn: Một mảng. OK. Và những gì khác là một cái gì đó chỉ kích thước một byte? HỌC SINH 30: Một char *? HỌC SINH 29: Vâng. JASON Hirschhorn: Một char * không phải là một byte. HỌC SINH 29: Một char. JASON Hirschhorn: Một char là một byte. Phải không? Vì vậy, chúng ta hãy gọi bộ đệm này là một chung tên sử dụng cho những việc này để lưu trữ một cái gì đó tạm thời. Vì vậy, tôi tạo ra một vùng đệm. Phải không? Nhưng nó không phải mất một void *. Như vậy có lẽ bạn là đúng, rằng nó phải là một bộ đệm kích thước 0. Vì vậy, nó lưu một - đúng. Vì quyền này đây - char đệm là một nhân vật, nhưng này có một khoảng trống * - một con trỏ. Vì vậy, tôi có thể làm điều này và bây giờ đệm là một con trỏ. Tôi có thể làm những gì khác? HỌC SINH 31: Đặt một ngôi sao bên cạnh char. JASON Hirschhorn: tôi có thể đã tạo ra nó char *. OK. Một điều tôi có thể làm gì? Hoặc chúng ta hãy đi với một này. Char * buffer, vì vậy những gì Tôi đặt ở đây? HỌC SINH 31: đệm. JASON Hirschhorn: đệm. Đệm là một con trỏ đến một char. Và tại địa điểm đó, chúng tôi đang đặt một byte của một cái gì đó chúng ta đã đọc. Yeah. Avi. AVI: Chỉ cần một câu hỏi nhanh chóng. Bạn có muốn malloc đệm? JASON Hirschhorn: Ai có thể trả lời câu hỏi đó? HỌC SINH 32: Vâng, nó không thực sự điểm để bất cứ điều gì ngay bây giờ, vì vậy - JASON Hirschhorn: Nhưng làm chúng tôi muốn malloc nó? HỌC SINH 32: Nếu bạn đã làm điều đó mà cách nào, tôi đoán, yeah, bởi vì bạn cần một số nơi cho nó để trỏ đến. JASON Hirschhorn: Chúng ta phải malloc nó? HỌC SINH 33: Nếu bạn đang đi để sử dụng nó bên ngoài vòng lặp. JASON Hirschhorn: Chúng ta sẽ sử dụng nó bên ngoài vòng lặp? HỌC SINH 34: Có. HỌC SINH 35: Chờ. Chúng ta muốn khai báo trong vòng lặp để ngoài? JASON Hirschhorn: Vì vậy, tôi đoán chúng tôi có một số giả KHI vòng lặp ở đây là chúng tôi cố gắng tìm ra, mà chúng tôi đã không nhận được nêu ra. Chúng tôi không cần phải malloc nó. Chúng tôi đang hoạt động trong chính, nó chỉ có được sử dụng trong vòng lặp này. Nó không cần phải tồn tại bên ngoài này. Vì vậy, nó có thể là một biến địa phương. Bạn có một con trỏ đến một biến địa phương. HỌC SINH 36: Nhưng nó không phải trỏ đến bất cứ điều gì. JASON Hirschhorn: Không, nó không phải khởi tạo bất cứ điều gì. Nhưng chúng tôi sẽ không sử dụng nó cũng có. Chúng ta sẽ đặt một cái gì đó trong nó lần đầu tiên chúng tôi sử dụng nó. Vì vậy, có vẻ OK. Vì vậy, chúng ta không cần malloc đây. Và tôi nghĩ rằng đó là OK như là. OK. Chúng tôi có dòng fread. Chúng ta hãy làm dòng tiếp theo. Nếu chúng ta muốn ghi vào một tập tin, là những gì một chức năng tốt để sử dụng để làm điều đó? HỌC SINH 37: fwrite? HỌC SINH 38: fprintf? JASON Hirschhorn: fprintf là một. Nhau là những gì? HỌC SINH 39: fwrite. JASON Hirschhorn: fwrite. Và cho các mục đích của chúng tôi, fwrite, mà chúng tôi thấy ở đây, là có lẽ là lựa chọn tốt hơn. Nó có bốn đối số là tốt. Nishant, bạn có thể cung cấp cho tôi lập luận? NISHANT: Người đầu tiên của đang diễn ra được chỉ đệm. JASON Hirschhorn: OK. NISHANT: Người thứ hai chỉ có được 1. Một phần ba sẽ là 1. Và một trong những thứ tư là có được dst. JASON Hirschhorn: Không ai có thắc mắc về dòng? Điều đó có vẻ tốt. OK. Vì vậy bây giờ nó trông giống như một điều chúng tôi mất tích - trên thực tế, chúng ta hãy viết dòng cuối cùng này. Đóng cửa các tập tin. Những người có thể kết thúc chúng tôi lên văn bản hai dòng cuối cùng này? Vâng. Xin lỗi, tên của bạn là gì? Lucy: Lucy. JASON Hirschhorn: Lucy. LUCY: src fclose và sau đó điểm đến fclose. JASON Hirschhorn: fclose, mở dấu ngoặc, src, dấu ngoặc đóng, dấu chấm phẩy. Và fclose - yeah? LUCY: Mở ngoặc đơn, dst và sau đó chấm phẩy. JASON Hirschhorn: Great. Và những gì tôi nên bao gồm ở cuối? LUCY: Trở về 0. JASON Hirschhorn: Trở về 0. Tôi có phải? Chỉ là một câu hỏi. Chúng ta phải bao gồm trở về 0? SINH VIÊN NHIỀU: số JASON Hirschhorn: số Chính không nó sẽ tự động nếu bạn nhận được đến cùng. Nhưng tôi nghĩ rằng nó tốt đẹp để bao gồm nó một cách rõ ràng. Đặc biệt là khi chúng tôi đang trở về khác việc trong suốt chương trình. OK. Đây là những gì chúng ta đang thiếu - KHI gì? Ai có thể nghĩ đến một số - có một số ý nghĩa của những điều có thể đi vào đó? Ngay cả khi nó chỉ là trong một số giả như ngôn ngữ? Chúng tôi là những gì thực sự - những gì Chúng ta muốn đi đến? Yeah, Lucy. LUCY: Sự kết thúc của tập tin. JASON Hirschhorn: Sự kết thúc của tập tin. Vì vậy, những gì bạn có nghĩa là vào cuối của tập tin? LUCY: Một khi bạn đạt đến cuối của tập tin, dừng lại. JASON Hirschhorn: OK. Vì vậy, một khi chúng ta đạt được kết thúc của tập tin. Làm thế nào để chúng ta biết khi nào chúng tôi đã đạt đến kết thúc của tập tin? HỌC SINH 40: Tôi nghĩ rằng bộ đệm sẽ được thiết lập để NULL. HỌC SINH 41: đệm được khai báo bên trong vòng lặp. JASON Hirschhorn: Vì vậy, bạn nghĩ bộ đệm sẽ được thiết lập để NULL. Tại sao đệm được thiết lập để NULL? HỌC SINH 40: Bởi vì khi bạn fread, bạn đang cố gắng để đưa không có gì vào bộ đệm. JASON Hirschhorn: OK. Vì vậy, bạn đang suy nghĩ fread - khi chúng tôi đã đạt đến kết thúc của tập tin, những gì đang fread sẽ làm gì? Tôi nghĩ rằng đó là câu hỏi chúng ta phải tìm ra. Không fread làm những gì? Nó đặt NULL trong bộ đệm, hoặc nó làm cái gì khác? Làm thế nào chúng ta có thể tìm ra những gì nó? HỌC SINH 42: Man. JASON Hirschhorn: Man. Vì vậy, chúng ta hãy nhìn qua đây. Trả lại giá trị. Thành công, fread và fwrite trả lại số hạng mục đọc hoặc bằng văn bản. Con số này tương đương với số byte chuyển khi kích thước là 1. Nếu lỗi xảy ra, hoặc kết thúc tập tin được đạt tới, giá trị trả về là một số mặt hàng ngắn hoặc 0. Vì vậy, mục đích của chúng tôi, nếu đạt fread cuối của tập tin, và đọc từ cuối tập tin, không có gì để lại là đọc, những gì nó sẽ trở lại? HỌC SINH 43: Zero? JASON Hirschhorn: Cái gì? HỌC SINH 43: Zero? JASON Hirschhorn: Zero. Nó sẽ trở lại bằng không. Vì vậy, chúng ta biết rằng fread, khi chúng tôi đã đạt đến kết thúc của tập tin, sẽ trở về số không. Làm thế nào chúng ta có thể sử dụng để lợi thế của chúng tôi? AVI: Bạn có thể khai báo một biến bên ngoài của vòng lặp được gọi là kiểm tra. Nếu kiểm tra bằng - bây giờ - một. JASON Hirschhorn: OK. AVI: Và sau đó bạn có thể đặt một IF tuyên bố ngay sau khi fread nói rằng nếu fread bằng không - không. JASON Hirschhorn: Ai có thể giúp Avi ra? AVI: giá trị là gì trả về bởi fread? JASON Hirschhorn: Chúng tôi chỉ đã đi qua đó. AVI: Làm thế nào để đại diện cho nó? JASON Hirschhorn: Vì vậy, nó sẽ trả về - hãy tìm ở đây - nó trả về một size_t, mà chủ yếu là một số nguyên. Vì vậy, nó sẽ trả về một số nguyên. Và trong trường hợp của chúng tôi, nó sẽ trở về 1 hoặc 0 - 1 nếu nó đọc một điều - một byte, và 0 nếu chúng ta đã đạt đến kết thúc. Vì vậy, nếu fread - yeah? HỌC SINH 45: Có thể bạn không chỉ cần đặt đầy đủ fread (buffer, 1, 1, src) vào trong khi vòng lặp? JASON Hirschhorn: Vì vậy, bạn đề nghị làm điều này vào đó? [Interposing TIẾNG NÓI] JASON Hirschhorn: Chờ chút. Vì vậy, chúng ta đang thoát khỏi điều đó. Vì vậy, bạn đang đề xuất đưa fread vào đó? Những gì chúng ta có nên di chuyển nếu bạn muốn làm điều đó? HỌC SINH 45: Các bộ đệm bên ngoài. JASON Hirschhorn: Chúng ta nên cũng di chuyển này ra đây. HỌC SINH 45: Nhưng liệu liên tục di chuyển nó về phía trước? [Interposing TIẾNG NÓI] JASON Hirschhorn: OK. Vì vậy, đây là những gì Okshar đề xuất. Chúng tôi tạo ra đệm của chúng tôi. Chúng tôi KHI fread, sau đó chúng tôi fwrite. Suy nghĩ về điều này? HỌC SINH 46: Câu hỏi duy nhất của tôi là, sẽ nó thực sự thực hiện lệnh fread? JASON Hirschhorn: Great câu hỏi. Khi bạn đang đặt một cuộc gọi chức năng bên trong một điều kiện, thực hiện điều đó chức năng gọi thực hiện? Chúng tôi đã nhìn thấy những ví dụ về điều này trước khi. Phải không? HỌC SINH 46: OK. Yeah. Vì vậy, nó thực thi. JASON Hirschhorn: Chúng tôi đã nhìn thấy những điều như trước đây, nơi chúng tôi có một chức năng cuộc gọi bên trong một điều kiện. Điều đó có chức năng gọi thực hiện? Vâng. Vì vậy, câu trả lời là có. Cuộc gọi chức năng này sẽ thực hiện. Nhưng một lần nữa, là nó những gì chúng ta muốn? Một trong những cách chúng ta có thể hình dung là những gì hiểu xem đó là những gì chúng ta muốn? SINH VIÊN NHIỀU: Chạy nó? JASON Hirschhorn: Chúng ta có thể chạy nó. Nhưng trước khi chúng tôi làm điều đó, chúng ta có thể cũng thông qua lý do này. Nếu - nói rằng chúng ta có một byte trong của chúng tôi tập tin, chúng tôi sẽ nhận được ở đây, chúng tôi sẽ nhận được mã này. Điều này sẽ chạy. fread sẽ trở lại một byte và lưu trữ nó trong bộ đệm. Và điều này sẽ đánh giá 1, bên phải, sau khi ông trả về 1. Vì vậy, TRONG KHI 1. Điều đó có nghĩa là các mã bên trong các vòng lặp while sẽ thực hiện? HỌC SINH 47: Vâng. Đó là sự thật. JASON Hirschhorn: Có. 1 là đúng. Nó không phải là 0. Vì vậy, các mã bên trong đây sẽ thực hiện. Vì vậy, chúng tôi sẽ viết đó. Chúng tôi sẽ quay trở lại này đường một lần nữa. Bây giờ chúng ta có - chúng ta đang ở cuối của tập tin của chúng tôi. Chúng ta đọc từ khi kết thúc tập tin của chúng tôi, bởi vì chúng tôi chỉ có một byte trong đó. Fread trả về 0, cửa hàng một cái gì đó trong bộ đệm. Thực sự tôi không biết những gì nó lưu trong bộ đệm. Có lẽ chúng ta có thể tìm để xem những gì nó làm. Mà tôi thật không biết. Chúng tôi không biết, những người quan tâm những gì nó lưu trong bộ đệm? Nhưng nó trở về 0. Và sẽ thực hiện trong khi 0? KHI 0 sẽ không thực hiện. Vì vậy, sau đó chúng tôi sẽ di chuyển xuống đây. Vì vậy, hãy giơ tay nếu điều này là mã chúng tôi phải chạy, hoặc nếu chúng tôi nên làm thay đổi đầu tiên. Vì vậy, nếu bạn nghĩ rằng - bạn phải bỏ phiếu. Nếu bạn nghĩ rằng chúng ta nên chạy mã này như là, xin vui lòng giơ tay lên. OK. Có một - Bạn có một câu hỏi, mối quan tâm? Yeah. HỌC SINH 48: Sau khi chúng tôi di chuyển đệm bên ngoài vòng lặp, chúng ta phải malloc nó? JASON Hirschhorn: Great câu hỏi. Sau khi chúng tôi di chuyển đệm bên ngoài vòng lặp, chúng ta phải malloc nó? Đây là một câu hỏi phạm vi. Nếu chúng ta khởi tạo bộ đệm bên ngoài của vòng lặp này, nó sẽ tồn tại bên trong vòng lặp? SINH VIÊN ĐA: Có. JASON Hirschhorn: Có. Phạm vi của nó bao gồm bên trong vòng lặp, và, thực sự, bất cứ điều gì dưới nó bên trong của mã này, bao gồm cả những thứ bên trong đây. Vì vậy, chúng ta không cần phải malloc nó. Đó là một biến địa phương, và phạm vi của nó vẫn còn bao gồm các vòng lặp. HỌC SINH 49: Chúng ta cần phải giải phóng nó? JASON Hirschhorn: Chúng ta cần đệm miễn phí? HỌC SINH 49: Vâng, nếu chúng ta không malloc. JASON Hirschhorn: Chúng ta cần đệm miễn phí? Chúng tôi không. Một lần nữa, nó là một biến địa phương, vì vậy chúng tôi không cần phải giải phóng nó. OK. Hãy xem những gì sẽ xảy ra. Vì vậy, nó là chưa được khởi tạo. Đó là những gì một cái gì đó Marcus đề xuất trước đó. Vì vậy, chúng ta có lỗi, biến đệm được uninitialized khi được sử dụng ở đây. Làm thế nào chúng ta có thể sửa lỗi này? HỌC SINH 50: malloc nó? HỌC SINH 51: Bình đẳng NULL? HỌC SINH 52: Nói đệm bằng NULL. JASON Hirschhorn: OK. Có vẻ tốt. Chúng tôi có nó ngay bây giờ. Hãy tạo ra một cái gì đó để cố gắng sao chép. Vì vậy, chúng tôi có tập tin văn bản của chúng tôi. Làm thế nào chúng ta có thể chạy chương trình này? Yeah. HỌC SINH 53: Bạn có thể làm chấm giảm cp, test.txt. Và sau đó bạn có thể đặt tên tập tin khác mà nó sẽ lưu trữ vào. JASON Hirschhorn: OK. Chúng tôi sẽ gọi nó out.txt. Mát mẻ? Seg lỗi. Suy nghĩ về lỗi seg? Điều này là rất tốt. Làm thế nào chúng ta có thể tìm ra nơi lỗi seg là? Những gì? HỌC SINH 54: Gdb. JASON Hirschhorn: Gdb. Chúng tôi chạy gdb bằng cách viết gdb dấu chấm dấu gạch chéo, tên của chương trình của chúng tôi. Không có đối số dòng lệnh đó. Chúng ta sẽ thiết lập một breakpoint ở chính. Nếu tôi muốn bắt đầu gdb, tôi phải làm gì? HỌC SINH 55: R. JASON Hirschhorn: R. Và sau đó những gì? HỌC SINH 55: Những lập luận? JASON Hirschhorn: Sau đó, đối số dòng lệnh. Chúng ta hãy đi bộ qua. N chỉ được tham gia tôi từng dòng. Tôi sẽ đi cho đến khi Tôi nhận được lỗi seg của tôi. Có lỗi seg của tôi. Có vẻ như gây ra fread lỗi seg của tôi. Tôi biết fread gây ra lỗi seg của tôi, bởi vì đó là dòng chúng tôi chỉ thực hiện. Và điều duy nhất đó là xảy ra trong dòng - hai điều đã xảy ra. Fread được đi, và sau đó chúng tôi đã làm một số kiểm tra KHI. Tôi sẵn sàng đặt cược rằng KHI kiểm tra không gây ra lỗi seg của tôi. Nhiều khả năng, fread là gây ra lỗi seg của tôi. Tôi cũng nhìn thấy một cái gì đó ở đây, memcopy. Bản sao bộ nhớ. Nghe có vẻ như di chuyển từ bộ nhớ một địa điểm đến khác. Âm thanh như một cái gì đó sẽ xảy ra trong fread, có thể một số bộ nhớ di chuyển từ đây đến đây. Hãy đi qua này một lần nữa. Làm thế nào để bắt đầu nó hơn và chạy nó một lần nữa? Yeah. HỌC SINH 56: Bạn cần phải đặt một ký hiệu trước khi đệm? JASON Hirschhorn: Vì vậy, trước khi ký hiệu đệm sẽ cung cấp cho tôi địa chỉ của đệm, mà là một char *. Chúng ta hãy chạy qua này một lần nữa. Làm thế nào để chạy qua nó một lần nữa? HỌC SINH 57: Có thể bạn chỉ cần gõ chạy một lần nữa? JASON Hirschhorn: Chỉ cần gõ chạy một lần nữa. Vì vậy chúng tôi sẽ không thực hiện dòng này. Vì vậy, bộ đệm là một con trỏ NULL. Đúng không? Nó đang trỏ đến - chúng ta hãy xem. Nếu chúng ta có của chúng tôi - vẽ một bức tranh nhanh chóng này. Tất cả mọi người có thể xem Tôi viết trên đây? Vì vậy, trong các ngăn xếp, chúng ta có một địa phương biến và nó được gọi là bộ đệm, và đó là một con trỏ đến một char. Địa chỉ những gì là char này? HỌC SINH 58: 0x0. JASON Hirschhorn: Đúng vậy. Đó là đây là những gì. Ở đây, bên trong bộ đệm, được lưu trữ 0x0. Đó là những gì chúng tôi có - các thiết lập chúng tôi có ngay bây giờ. Vì vậy, dòng này, fread, đặt một cái gì đó từ nguồn ở đâu? Vào ô này hoặc hộp này? Hộp đó? Hộp hoặc hộp ở cánh phải? Hộp quyền này. Nó sau con trỏ, và đặt nó ở đây. Khi chúng tôi cố gắng liên lạc và bộ nhớ tại vị trí 0, những gì chúng tôi nhận được? Một lỗi phân khúc. Đó là lỗi mà chúng tôi có ngay bây giờ. Yeah. HỌC SINH 59: Không có để đưa ngôi sao đệm? Hay không? Cho fread? JASON Hirschhorn: Vì vậy, fread có một con trỏ. Vì vậy, nó đi qua bộ đệm. Và sau đó nó sẽ de-tham khảo nó ở đâu đó bên trong fread. Nhưng một lần nữa, chúng ta đã thấy, phải mất một con trỏ. Chúng tôi không cần phải vượt qua nó đệm sao. Mà có thể đi qua nó bất cứ điều gì ở đây. Và đó có lẽ sẽ cho chúng ta một lỗi bởi vì chúng tôi đang de-tham khảo nó. Phải không? Khi chúng tôi de-tham khảo con trỏ này, khi chúng tôi cố gắng để truy cập vào vị trí này, chúng tôi nhận được một lỗi - lỗi phân khúc của chúng tôi. Vì vậy, - oops. Chúng ta sẽ bỏ ra khỏi gdb. Dòng của chúng tôi - vấn đề của chúng ta - là đúng ở đây trên dòng này. Và đó là một vấn đề bởi vì của dòng này. Làm thế nào chúng ta có thể tạo ra một hộp thoại mà có thể truy cập trong fread. Phải không? Chúng ta cần phải tạo ra một hộp đó là một byte lớn, kích thước của một char. Nhưng chúng ta cần hộp để có thể truy cập khi chức năng này được thực thi. Vì vậy, nơi - yeah. Bất kỳ ý tưởng? HỌC SINH 60: Chỉ cần đặt nó như bất kỳ ký tự ngẫu nhiên. Chỉ cần làm char bình đẳng đệm các nhân vật. Và sau đó, khi bạn đã có đệm - JASON Hirschhorn: Chờ. Char đệm? Vì vậy, không sao? HỌC SINH 60: Vâng. Đưa ra các ngôi sao. Bằng một ký tự ngẫu nhiên. JASON Hirschhorn: OK. Vì vậy, cho tôi một. HỌC SINH 60: Giống như một hoặc một cái gì đó. Và sau đó khi bạn có bộ đệm ở đó, bạn sử dụng một - HỌC SINH 61: sao? Ồ không, các ký hiệu. HỌC SINH 60: Sử dụng các ký hiệu. JASON Hirschhorn: OK. Và những gì về trong fwrite? HỌC SINH 60: Sử dụng các ký hiệu một lần nữa. JASON Hirschhorn: Được rồi. Vì vậy, ý tưởng của bạn, chúng tôi tạo ra một char và đặt một cái gì đó trong nó, và sau đó viết thư cho char. HỌC SINH 60: Vâng. JASON Hirschhorn: Điều gì Mọi người suy nghĩ? HỌC SINH 62: Nó phức tạp. JASON Hirschhorn: OK. Chúng ta hãy vẽ nó ra. Vì vậy, thời gian này, tôi sẽ vẽ này trong màu đỏ trên stack ở đây, và sau đó chúng tôi sẽ có - ooh! Xin lôi. Vì vậy, lần này chúng tôi có một cái gì đó gọi là đệm, và đó là trên stack. Đúng không? Và chúng tôi đang lưu trong nó một, ban đầu. Sau đó, chúng tôi có cuộc gọi của chúng tôi để fread. Fread gì, không có gì phải mất một byte từ tập tin và chúng tôi đặt nó ở đâu đó. Nó đặt nó trong bất cứ điều gì Điều trỏ đến. Vâng, trước khi chúng tôi đã có địa chỉ này - 0x0. Bây giờ những gì chúng ta có địa chỉ? HỌC SINH 63: Bất cứ điều gì địa chỉ đệm. JASON Hirschhorn: Bất cứ điều gì địa chỉ đệm. Nó có thể sẽ là một cái gì đó như thế. Có lẽ sẽ bắt đầu với một b và một e, và sau đó có sáu khác chữ số thập lục phân. Không quan trọng. Một số địa chỉ. Và chúng tôi đang đi qua địa chỉ in Và chúng ta sẽ đặt một của chúng tôi byte điều tại địa chỉ đó. Vì vậy, chúng ta sẽ đặt một của chúng tôi byte điều trong đây. Và sau đó chúng ta sẽ viết từ những gì bao giờ bên trong đây. Không ai có bất kỳ câu hỏi về điều đó? Người nghĩ rằng mã này sẽ làm việc? Nâng cao tay của bạn nếu bạn nghĩ mã này sẽ làm việc. Bạn phải có một lập trường. Và những người nghĩ rằng mã này sẽ không làm việc? Giơ tay lên. Tất cả mọi người khác nên được nâng cao tay của họ. OK. Michael, nơi anh đứng? MICHAEL: tôi không thể quyết định. Loại ở giữa. JASON Hirschhorn: Anh ở giữa. Chọn một. MICHAEL: tôi sẽ có niềm tin và nói rằng nó sẽ làm việc. JASON Hirschhorn: OK. Bạn sẽ có niềm tin và nói nó hoạt động? Những gì đã xảy ra? [Interposing TIẾNG NÓI] JASON Hirschhorn: Không có lỗi seg. Làm thế nào chúng ta có thể kiểm tra xem Hai điều này là bằng nhau? Hai tập tin đều bình đẳng. HỌC SINH 64: Diff. JASON Hirschhorn: Diff. Kiểm tra khác cho sự khác biệt giữa hai tập tin, và nếu nó trở về không có gì, họ giống hệt nhau. Và nếu chúng ta mở ra, chúng tôi nhận được tập tin của chúng tôi. Vì vậy, đó là giải pháp đúng. Chúng ta hãy nhìn lại nó một lần nữa. Chúng tôi thực sự thậm chí không cần phải khởi tạo nó. Nó có lẽ sẽ xem xét một chút sạch hơn nếu bạn không đặt một cái gì đó ngẫu nhiên trong đó. Điểm được, bạn cần thiết để tạo ra một số không gian để lưu trữ một cái gì đó từ fread và có một cái gì đó ra khỏi fwrite. Và điều đó có được, hoặc một địa phương biến trên stack - bạn có thể đã malloc'd một số không gian. Vì vậy, chúng tôi thực sự có thể có malloc viết ở đây, và mà có thể đã làm việc. Và sau đó chúng tôi đã được lưu trữ điều chúng tôi ở đâu đó trên đống. Nhưng điều này thực sự, có lẽ, các giải pháp thanh lịch nhất. Chỉ cần tạo ra một số không gian trên stack cho những việc này đi. Tôi sẽ có hai ý kiến ​​khác. Nếu bạn đã có lần lượt trong này, và sau đó có được ghi vào điều này, ý kiến ​​của tôi sẽ là như sau. Những 1 ở đây, với tôi, nhìn như con số ma thuật. 1 này, về fread, có ý nghĩa. Đó là số thứ đọc hay viết. Nhưng điều này ngay tại đây nên có thể là cái gì khác. Vì vậy, một giải pháp là gì? HỌC SINH 65: Kích thước của byte. JASON Hirschhorn: Giống như điều đó không? HỌC SINH 65: Kích thước của char. JASON Hirschhorn: Kích thước của char. Yeah, byte không phải là một loại. Vì vậy, quy mô công trình char. Chúng ta có thể có, ở đầu mã của chúng tôi, # định nghĩa đó. Được gọi là một cái gì đó và BYTE nó thực sự là một char. Trên thực tế, một cách tiếp cận tốt hơn có thể có được điều này - uint. Ai biết đó là những gì? Xin lôi. Tôi có nó về phía sau. Chờ đợi, không có. Cách mà nó đi đâu? Ai biết đó là những gì? Yeah. HỌC SINH 67: Nghĩa vụ phải giúp chuẩn hóa qua các hệ điều có - như số nguyên không dấu có 8 byte? JASON Hirschhorn: Đó là chính xác. Trên các máy khác nhau, kích thước của một char - không thường là một char. Ký tự thường một byte. Nhưng kích thước của các loại dữ liệu khác kích cỡ khác nhau trên một máy 32-bit so với một máy tính 64-bit. Một uint8_t luôn luôn là 8 bit - luôn luôn một byte. Và tôi cần phải bao gồm rằng tiêu chuẩn tập tin int tiêu đề. Vì vậy, bây giờ, điều này sẽ có thể được cách tốt nhất để viết mã này. Vì vậy, tôi thoát khỏi những con số kỳ diệu. Và tôi cũng có một hợp lý hơn gõ cho bộ đệm. Nó không chỉ đơn giản là một char, đó là một byte, đó là những gì chúng tôi mong đợi nó được. Và ở đây, chúng tôi đã thực sự được một chút mạnh mẽ hơn. Chúng tôi không gọi đó là một char, mà - có lẽ, ai biết được - có thể là một khác nhau kích thước trên các máy khác nhau. Chúng tôi đang thực sự nói điều này là chính xác một byte, luôn luôn, không có vấn đề gì. Và nếu chúng ta nhìn ở đây, chúng tôi làm cp. Uh-oh. Những gì đã xảy ra? HỌC SINH 68: Nó có thể được chuyển sang. JASON Hirschhorn: Cái gì? HỌC SINH 69: là nó? HỌC SINH 70: Bạn đã làm không định nghĩa nó như là một loại. HỌC SINH 71: Nhưng nó phải được xác định trong tiêu chuẩn. HỌC SINH 72: Điều gì đang xảy ra? HỌC SINH 73: nên xác định được tất cả các mũ? JASON Hirschhorn: Vì vậy, nó không # xác định. Trên thực tế, trong trường hợp này, tôi sẽ sử dụng typedef. Bởi vì chúng ta đang sử dụng nó như là một loại tại một địa điểm. Vì vậy, trong trường hợp này, chúng tôi thực sự muốn typedef như chúng tôi đang in một loại mới byte, và nó là, về cơ bản, điều này. Đó là một chút khác biệt so với # define. Và bây giờ, mã của chúng tôi hoạt động hoàn hảo. Vì vậy, một lần nữa, # xác định có một cái gì đó, thay thế nó ở khắp mọi nơi với những điều khác. Nó chỉ là một vĩ mô - viết tắt để thoát khỏi con số ma thuật. Nhưng trong trường hợp này, bởi vì chúng tôi sử dụng nó như là một loại - ngay tại đây - để cho rằng để làm việc, chúng ta cần để typedef bất cứ điều gì byte là. Và chúng tôi xác định nó phải ở đây. Nó không phải là một cấu trúc, nó thực sự chỉ là một số nguyên không dấu. Đó là một byte. Mã này sẽ có sẵn trực tuyến, và tất cả các bạn cần phải có nó ngay bây giờ. Vì vậy, chúng tôi có - hoàn hảo - 13 phút còn lại để đi vấn đề trên đặt 5. Tôi muốn đi bộ qua copy.c với nhau, và sau đó chúng tôi sẽ nói ngắn gọn về các bộ phận khác của vấn đề thiết lập. Vì vậy, hãy để tôi kéo lên copy.c. Và điều thú vị là, chúng tôi đã thực sự đã viết rất nhiều mã này. Mã chúng tôi đã viết theo nghĩa đen chỉ ra khỏi đây khi tôi còn văn bản này trên của riêng tôi. Nhưng đây là copy.c, tạo nền tảng cho hai phần đầu của vấn đề đặt ra cho whodunit.c, mà bạn cần phải viết, và resize.c. Recover.c, đó là thứ ba và cuối cùng một phần của bộ vấn đề, không phải là dựa tắt của tập tin này. Bạn sẽ cần phải viết tập tin đó, chúng tôi cung cấp cho bạn một khuôn mẫu cho rằng nộp, nhưng nó không có gì để làm với copy.c. Nhưng vì copy.c là nền tảng cho hai phần đầu, chúng ta sẽ đi bộ qua nó, vì vậy bạn có một cảm giác tốt về những gì nó làm. Và các ý kiến ​​đưa ra một số của nó đi. Chúng ta đã viết một số điều này. Đầu tiên, chúng tôi đảm bảo chúng tôi có được ba đối số. Tiếp theo, chúng ta ghi nhớ tên file. Vì vậy, chúng tôi bỏ qua bước này khi chúng tôi mã hóa điều chúng tôi - khi cp của chúng tôi. Nhưng ở đây, họ đang làm nó một chút bụi. Họ đang kiểm tra để đảm bảo cả hai tập tin là tốt, trong Ngoài mở chúng. Chúng tôi đã viết tất cả các mã này ngay bây giờ, vì vậy tôi sẽ không dừng lại ở mã này. Tiếp theo là một số công cụ đó là cụ thể để các loại tập tin, chúng tôi đang sử dụng, mà là các tập tin bitmap. Các tập tin bitmap có một số siêu dữ liệu liên kết với chúng. Vì vậy, các cặp vợ chồng đầu tiên của byte cho bạn biết về các tập tin. Họ không phải là màu sắc của các điểm ảnh trong hình ảnh đó. Họ cho bạn biết về các tập tin. Và nếu bạn đọc thông qua các bộ vấn đề, bạn sẽ có nhiều thông tin hơn về những loại cấu trúc siêu dữ liệu được bao gồm với bitmap. Nhưng đó là lý do tại sao chúng tôi có điều này đầu tiên bộ - mã này ngay tại đây. Chúng tôi đang đọc các siêu dữ liệu - hai phần của siêu dữ liệu - các tập tin tiêu đề và tiêu đề thông tin. Và chúng tôi đang kiểm tra một số bộ phận của nó chắc chắn rằng nó là một tập tin bitmap đúng trước khi tiếp tục. Và một lần nữa, đây là những chi tiết chúng tôi không cần phải đi vào ngay bây giờ. Nếu bạn đọc thông qua các thiết lập vấn đề, bạn sẽ hiểu này. Long câu chuyện ngắn, đây là những chỉ nói, đây là một tập tin bitmap, và xác nhận rằng. Tiếp theo, chúng tôi đang viết những đến tập tin ra. Chúng ta thấy rằng ở đây. Chúng tôi muốn gửi đến con trỏ ra. Tiếp theo, chúng tôi xác định padding. Vì vậy, một lần nữa, như là đặc thù với một tập tin bitmap, bao gồm một số dòng đệm ở cuối. Và nếu bạn đọc thông qua các bộ vấn đề, bạn sẽ tìm hiểu thêm về đệm. Đây là công thức để tìm padding. Quan trọng cần nhớ - khi bạn thay đổi kích thước của một bitmap tập tin, thay đổi padding. Khi bạn thay đổi kích thước của một tập tin, thay đổi padding. Nó không bao giờ có lớn hơn 3 - nó sẽ được 0 đến 3, bao gồm. Nhưng khi bạn thay đổi kích thước của một cái gì đó, những thay đổi padding. Nếu tôi chỉ có một điểm ảnh trong hàng đó, tôi cần ba byte của đệm, vì mỗi hàng có là bội số của bốn byte dài trong một tập tin bitmap. Nhưng nếu tôi tăng gấp đôi nó, để đi từ một điểm ảnh để hai pixel, mỗi trong số đó, hãy nói, là một byte, sau đó tôi cần hai byte của đệm để thực hiện mà bằng bốn. Vì vậy, khi tôi thay đổi kích thước của một cái gì đó, Tôi cần phải thay đổi số tiền đệm tôi có. Điều đó có ý nghĩa với tất cả mọi người? Tiếp theo, chúng ta lặp qua mỗi hàng, hoặc thông qua tất cả các hàng. Và sau đó chúng ta lặp qua mỗi cột trong mỗi hàng. Chúng tôi đang điều trị bitmap này như một mạng lưới, giống như chúng tôi đã xử lý hội đồng quản trị trong 15. Như chúng ta xử lý những viên gạch khi chúng tôi in chúng trên màn hình. Một mạng lưới các hàng và cột. Sau đó - chúng ta thấy điều này. Chúng tôi thực sự chỉ cần mã hóa này. Chúng tôi tạo ra một số lưu trữ tạm thời. Chúng ta đọc thấy trong đó, và sau đó chúng tôi viết nó ra. Đây là chính xác những gì chúng ta đã làm. Tiếp theo, bởi vì tôi đã nói mỗi dòng kết thúc trong một số đệm, chúng tôi bỏ qua đệm đó - padding cũ. Và sau đó chúng ta thêm nó trở lại. Trong trường hợp này, chúng tôi đang tạo các tập tin chính xác. Chúng ta chỉ cần sao chép nó. Vì vậy, dòng này là loại ngớ ngẩn. Chúng ta có thể theo nghĩa đen chỉ đặt đệm in Nhưng nếu bạn thay đổi kích thước của tập tin, bạn vẫn còn muốn dòng này? Vì vậy, nếu chúng ta thay đổi kích thước của một tập tin, chúng ta vẫn muốn bỏ qua trong đệm cũ? HỌC SINH 74: Có. JASON Hirschhorn: Vì vậy, chúng tôi làm. Bởi vì điều này, một lần nữa, giao dịch với tập tin nguồn. Chúng tôi không quan tâm đến các padding từ tập tin nguồn. Chúng tôi muốn đi đến dòng kế tiếp. Nhưng chúng tôi không chỉ đơn giản là đưa trở lại số lượng cũ của padding. Chúng ta cần phải đặt lại số tiền mới của padding. Vì vậy, khi chúng ta thay đổi kích thước của một tập tin, chúng tôi vẫn muốn bỏ qua đệm trong tập tin cũ - những gì chúng tôi đang đọc từ. Nhưng những gì chúng tôi muốn gửi đến, chúng ta sẽ cần phải đặt lại một số khác nhau số đệm mà chúng tôi đã xác định. Yeah. HỌC SINH 75: Trình tự của hai dòng không quan trọng, phải không? Bởi vì bạn đang xử lý tập tin khác nhau. JASON Hirschhorn: Chính xác. Thứ tự của hai dòng không quan trọng. Chúng tôi viết dòng này. Này là ở đây cho tập tin chúng tôi muốn gửi đến. Đó là quan trọng, vì vậy chúng tôi có được số tiền phải của padding. Này có để đối phó với các tập tin trong. Chúng tôi muốn bỏ qua ngay trong đệm. Chúng tôi không muốn đọc - nếu chúng ta đang đọc một byte tại một thời gian, chúng tôi không quan tâm đến những byte padding. Chúng tôi muốn chuyển đến dòng kế tiếp. Cuối cùng giống như Lucy đã cho chúng ta, chúng tôi đóng cửa các tập tin và trả về 0. Vì vậy, đây là copy.c. Và chúng tôi thực sự đã viết - chúng tôi đã dành hầu hết phần viết này, về cơ bản. Bạn thực hiện điều này. Vì vậy, hy vọng bạn có một cảm giác tốt về những gì đang xảy ra ở đây. Sự khác biệt lớn, trung thực, chỉ là phần đầu tiên này giao dịch với đặc thù của các tập tin bitmap. Vì vậy, tôi có như slide tiếp theo của tôi, những gì chúng ta cần phải làm gì? Vâng, chúng ta hãy suy nghĩ về whodunit. Và cho ai đó đọc qua vấn đề thiết lập, những gì chúng tôi cần làm trong whodunit? Đơn giản. Aleja. ALEJA: Bạn có thể đưa ra các phần của mỗi điểm ảnh biểu thị màu đỏ. Và sau đó - loại? JASON Hirschhorn: OK. Vì vậy, đưa ra các phần của mỗi điểm ảnh biểu thị màu đỏ. Đó là gần, nhưng không phải tất cả của nó. HỌC SINH 76: Vâng, có cách khác nhau để làm điều đó. JASON Hirschhorn: OK. Cho tôi một cách. HỌC SINH 76: Đi ra tất cả các màu đỏ, và sau đó nhấn mạnh màu xanh và màu xanh lá cây. JASON Hirschhorn: OK. Vì vậy, cho cả hai cách - có vẻ như chúng ta cung cấp cho nó một điểm ảnh, nó có một mức đỏ, xanh dương và xanh lá. Chúng tôi muốn thay đổi cấp độ tương đối của màu đỏ, xanh dương và xanh lá cây, tùy thuộc trên pixel. Nơi trong mã này, chúng ta nên thay đổi tương đối đỏ, xanh dương và xanh lá cây mức độ của một điểm ảnh nhất định. Sau khi chúng tôi đã đọc nó - trước khi chúng tôi viết nó? Cho tôi số dòng. SINH VIÊN NHIỀU: 83. JASON Hirschhorn: 83. Vì vậy, ngay tại đây. Cho whodunit, mã bạn cần ghi tất cả nên đi ngay. Và đó là mã duy nhất bạn cần phải viết. Bởi vì, như chúng ta đã nghe, tất cả bạn cần làm là thay đổi những màu xanh tương đối, mức màu đỏ, và màu xanh lá cây từ mỗi điểm ảnh. Bạn đã đọc nó vào, và bây giờ bạn đang sẽ viết nó ra. Làm thế nào để tôi nhận được - nếu tôi có điều này gọi là ba, ngay tại đây, và nó có gõ RGBTRIPLE - tốt, nếu chúng ta nhìn vào bmp.h, RGBTRIPLE là gì? HỌC SINH 77: Đó là một cấu trúc. JASON Hirschhorn: RGBTRIPLE là một cấu trúc. Chúng ta thấy rằng phải xuống đây. Và do đó, nếu tôi muốn truy cập, nói, mức độ màu đỏ của các cấu trúc, làm thế nào tôi truy cập mức độ màu đỏ của cấu trúc này? [CLASS thì thầm] HỌC SINH 78: RGBTRIPLE.rgbtred? JASON Hirschhorn: Là đúng? HỌC SINH 79: Nó sẽ được ba dấu chấm, thay vì chấm RGBTRIPLE? JASON Hirschhorn: Triple. Ba là biến địa phương, vì vậy ở đây, không có con trỏ ở đây. Vì vậy, chúng ta chỉ cần sử dụng các ký hiệu dấu chấm. Điều này sẽ cho tôi mức độ của màu đỏ. Nếu tôi muốn thay đổi nó, tôi chỉ cần đặt nó bằng một cái gì đó khác nhau. Vì vậy, một lần nữa, dòng mã này truy cập biến này bên trong cấu trúc này, và chúng ta có thể đặt nó vào một cái gì đó mới. Vì vậy, cho whodunit, một lần nữa, đây là, trong bản chất, những gì chúng ta cần làm. Rất đơn giản. Chỉ cần thay đổi một số mức độ tương đối, và đây là nơi mà mã đi. Thay đổi kích thước, mặt khác, là một chút phức tạp hơn. Trong thực tế, thay đổi kích cỡ có lẽ là một phần khó khăn nhất trong vấn đề này thiết lập. Chúng tôi có ba phút để đi qua nó. Nhưng một lần nữa, chúng tôi đã viết hầu hết các mã này, vì vậy chúng tôi nên được khá quen thuộc. Một số điều chúng tôi muốn làm trong là gì thay đổi kích thước, nếu bạn đã đọc qua các vấn đề thiết lập? Nếu bạn cung cấp cho họ với tôi, chúng tôi có thể nói chuyện về chúng. Một số điều chúng tôi muốn làm là gì? HỌC SINH 80: theo chiều dọc - vì vậy bạn phải theo chiều ngang thay đổi kích thước, nhưng theo chiều dọc thay đổi kích thước không? JASON Hirschhorn: Vì vậy, một khi chúng tôi đang đưa ra pixel, và chúng tôi muốn thay đổi kích thước của một yếu tố của hai, bây giờ nó cần phải được thay đổi kích thước theo chiều ngang và thay đổi kích cỡ theo chiều dọc. Điều đó có ý nghĩa? Yeah. Vì vậy, đó có thể là Thách thức lớn nhất. Và chúng ta sẽ nói về điều đó trong một giây. Yeah. HỌC SINH 81: Con đường tôi nghĩ về nó bạn là cần thiết in nó ra - JASON Hirschhorn: Chờ. Không cho chúng tôi biết những gì bạn đã làm. Chúng ta sẽ nói chuyện trong logic. HỌC SINH 81: OK. Câu hỏi là gì? JASON Hirschhorn: Bạn chỉ giơ tay của bạn. Không có câu hỏi. Hãy để tôi trình bày nó. Hãy để tôi chỉ thảo luận ngắn gọn này. Vì vậy, chúng tôi có một điểm ảnh, chúng tôi muốn tái tạo nó, cả hai chiều ngang và theo chiều dọc. Vì vậy, lý tưởng những gì chúng tôi làm ở đây là, chúng tôi đọc trong điểm ảnh của chúng tôi, chúng tôi viết nó Tuy nhiên rất nhiều lần. Nhưng sau đó chúng tôi có lừa của chúng tôi ở đây, bởi vì sau đó chúng tôi muốn bỏ qua dòng kế tiếp và viết nó ở bắt đầu của dòng tiếp theo. Vì vậy, nếu chúng ta muốn tái tạo cả theo chiều ngang và theo chiều dọc, là những gì một cách tốt để làm điều đó - một tốt mặc dù để làm điều đó? Vì vậy, chúng ta không cần phải liên tục tìm kiếm xung quanh tập tin của chúng tôi để đặt những điều. Câu hỏi đó có thể không có có ý nghĩa, nhưng tôi nghĩ rằng một câu trả lời cho nó sẽ giúp. HỌC SINH 82: Tạo một mảng? JASON Hirschhorn: Vì vậy, hãy suy nghĩ của mỗi tập tin như là một hàng. Chúng ta hãy suy nghĩ về hàng. Nếu chúng ta có hàng đầu tiên của chúng tôi từ nhỏ của chúng tôi hình ảnh, chúng ta có thể thực hiện liên tiếp vào một hàng lớn từ một bức tranh lớn, và sau đó nhân rộng liên tiếp tuy nhiên nhiều lần nó cần phải được nhân rộng, thay vì đi từng pixel, mà được khó hiểu khi đối phó với các tập tin. Bởi vì nếu chúng ta có - Tôi đang chạy ra khỏi không gian. Nếu đây là tập tin của chúng tôi, và chúng tôi có mà một điểm ảnh đó, và chúng tôi muốn đặt nó phải có, chúng tôi vẫn có một số điều mà cần phải đi qua có khi chúng ta văn bản và tạo ra tập tin mới của chúng tôi - tập tin của chúng tôi đó là lớn gấp đôi. Nhưng nó thực sự khó khăn với các chức năng tập tin để bỏ qua xung quanh đường dây mới như thế, và sau đó quay trở lại đây và đặt mọi thứ trong đó. Nó hầu như không thể làm điều gì đó như vậy, nếu có ý nghĩa. Vì vậy, nếu chúng ta suy nghĩ về hàng, chúng tôi có thể lấy hàng của chúng tôi, và sau đó đặt nó - tái tạo hàng theo chiều dọc. Và đó là cách chúng ta đối phó với thay đổi kích thước theo chiều dọc thay vì theo chiều ngang. Đó là loại nhanh chóng, và một chút bối rối. Thật không may thời gian của chúng tôi là lên. Tôi sẽ đứng bên ngoài cho những người bạn ở đây ai có thắc mắc về bộ vấn đề, bao gồm phục hồi. Vì vậy, hãy hoãn cho bây giờ. Và một lần nữa, nếu bạn có bất kỳ câu hỏi, chúng tôi có thể trò chuyện bên ngoài.