1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [BAHAGIAN 5: KURANG SELESA] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Universiti Harvard] 3 00:00:05,180 --> 00:00:08,260 [Ini adalah CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Begitu dialu-alukan kembali, guys. 5 00:00:11,690 --> 00:00:16,320 Selamat datang kepada seksyen 5. 6 00:00:16,320 --> 00:00:20,220 Pada ketika ini, setelah selesai kuiz 0 dan setelah melihat bagaimana anda lakukan, 7 00:00:20,220 --> 00:00:25,770 diharapkan anda berasa benar-benar baik kerana saya amat kagum dengan skor dalam seksyen ini. 8 00:00:25,770 --> 00:00:28,050 Bagi penonton talian kami, kami telah mempunyai beberapa soalan 9 00:00:28,050 --> 00:00:33,680 mengenai dua masalah terakhir pada set masalah - atau pada kuiz, sebaliknya. 10 00:00:33,680 --> 00:00:39,690 Jadi kita akan pergi ke atas mereka yang benar-benar cepat supaya semua orang melihat apa yang berlaku 11 00:00:39,690 --> 00:00:45,060 dan bagaimana untuk pergi melalui penyelesaian sebenar dan bukannya hanya melihat penyelesaian itu sendiri. 12 00:00:45,060 --> 00:00:50,330 Kami akan pergi sejak beberapa tahun lepas masalah benar-benar cepat, 32 dan 33. 13 00:00:50,330 --> 00:00:53,240 Adil, sekali lagi, supaya penonton dalam talian boleh melihat ini. 14 00:00:53,240 --> 00:00:59,080 >> Jika anda bertukar kepada 32 masalah anda, yang adalah pada halaman 13, 15 00:00:59,080 --> 00:01:02,730 13 daripada 16 tahun, masalah 32 adalah semua tentang swap. 16 00:01:02,730 --> 00:01:05,010 Ia adalah semua tentang bertukar-tukar dua integer. 17 00:01:05,010 --> 00:01:08,740 Ia adalah masalah yang kita akan pergi ke atas beberapa kali dalam kuliah. 18 00:01:08,740 --> 00:01:13,590 Dan di sini, apa yang kita telah meminta anda lakukan adalah trace memori cepat. 19 00:01:13,590 --> 00:01:17,000 Untuk mengisi nilai pembolehubah kerana mereka pada timbunan 20 00:01:17,000 --> 00:01:20,250 sebagai kod pergi melalui fungsi swap ini. 21 00:01:20,250 --> 00:01:24,500 Khususnya, apa yang kita melihat -: saya akan meletakkan iPad ini turun - 22 00:01:24,500 --> 00:01:29,650 khususnya, apa yang kita sedang melihat garis ini bernombor 6 hak di sini. 23 00:01:29,650 --> 00:01:36,740 Dan ia bernombor 6 untuk persentuhan hanya dengan masalah sebelumnya. 24 00:01:36,740 --> 00:01:41,720 Apa yang kami mahu lakukan adalah memaparkan atau label negeri memori 25 00:01:41,720 --> 00:01:46,090 kerana ia adalah pada masa itu apabila kita melaksanakan ini nombor talian 6, 26 00:01:46,090 --> 00:01:52,540 yang berkesan pulangan daripada fungsi swap kami di sini. 27 00:01:52,540 --> 00:01:59,450 Jika kita tatal ke bawah di sini, kita melihat bahawa alamat segala-galanya dalam ingatan telah disediakan untuk kita. 28 00:01:59,450 --> 00:02:02,540 Ini adalah sangat penting; kita akan kembali kepadanya dalam hanya seketika. 29 00:02:02,540 --> 00:02:09,240 Dan kemudian turun di sini di bawah, kami terpaksa gambarajah memori sedikit bahawa kita akan merujuk kepada. 30 00:02:09,240 --> 00:02:12,490 Saya sebenarnya telah dilakukan ini keluar pada iPad saya. 31 00:02:12,490 --> 00:02:20,720 Jadi saya akan berselang-seli dan berulang-alik antara iPad dan kod ini hanya untuk rujukan. 32 00:02:20,720 --> 00:02:26,540 >> Mari kita mulakan. Pertama, mari kita memberi tumpuan kepada pasangan yang pertama barisan utama di sini. 33 00:02:26,540 --> 00:02:30,220 Untuk memulakan, kita pergi untuk memulakan x 1 dan y ke 2. 34 00:02:30,220 --> 00:02:33,040 Jadi kita mempunyai dua pembolehubah integer, kedua-dua mereka akan diletakkan pada timbunan. 35 00:02:33,040 --> 00:02:36,050 Kami akan meletakkan 1 dan 2 di dalamnya. 36 00:02:36,050 --> 00:02:43,150 Jadi jika saya flip untuk iPad saya, mudah-mudahan, mari kita lihat - 37 00:02:43,150 --> 00:02:48,660 Mencerminkan Apple TV, dan di sana kita pergi. Okay. 38 00:02:48,660 --> 00:02:51,670 Jadi jika saya flip untuk iPad saya, 39 00:02:51,670 --> 00:02:56,220 Saya mahu untuk memulakan x 1 dan y ke 2. 40 00:02:56,220 --> 00:03:00,580 Kami melakukan yang cukup hanya dengan menulis 1 dalam kotak bertanda x 41 00:03:00,580 --> 00:03:07,730 dan 2 dalam kotak bertanda y. Agak mudah. 42 00:03:07,730 --> 00:03:11,620 Jadi sekarang mari kita kembali kepada laptop, lihat apa yang berlaku seterusnya. 43 00:03:11,620 --> 00:03:15,810 Jadi ini selaras seterusnya adalah di mana perkara mendapatkan rumit. 44 00:03:15,810 --> 00:03:28,110 Kami lulus alamat x dan alamat y sebagai parameter a dan b untuk fungsi swap. 45 00:03:28,110 --> 00:03:32,380 Alamat x dan alamat y adalah perkara-perkara yang kita tidak boleh mengira 46 00:03:32,380 --> 00:03:36,360 tanpa merujuk kepada peluru-mata sampai di sini. 47 00:03:36,360 --> 00:03:39,750 Dan mujurlah, dua mata peluru pertama memberitahu kita betul-betul apa jawapan. 48 00:03:39,750 --> 00:03:44,740 Alamat x dalam ingatan ialah 10, dan alamat y dalam ingatan ialah 14. 49 00:03:44,740 --> 00:03:51,870 Jadi mereka adalah nilai yang diluluskan pada sebagai a dan b top up dalam fungsi swap kami. 50 00:03:51,870 --> 00:04:00,760 Jadi sekali lagi, beralih kembali kepada gambarajah kami, saya boleh menulis 10 dalam 51 00:04:00,760 --> 00:04:07,400 dan 14 dalam b. 52 00:04:07,400 --> 00:04:11,610 Sekarang, ketika ini adalah di mana kita teruskan dengan swap. 53 00:04:11,610 --> 00:04:14,520 Jadi Melibas kembali ke laptop lagi, 54 00:04:14,520 --> 00:04:21,079 kita lihat bahawa cara kerja swap saya dereference pertama dan menyimpan hasil dalam tmp. 55 00:04:21,079 --> 00:04:27,650 Jadi pengendali dereference berkata, "Hei Merawat kandungan satu variable sebagai alamat. 56 00:04:27,650 --> 00:04:33,830 Pergi ke apa yang disimpan di alamat itu, dan beban. " 57 00:04:33,830 --> 00:04:41,720 Apa yang anda beban daripada pembolehubah akan disimpan ke dalam pembolehubah tmp kami. 58 00:04:41,720 --> 00:04:45,150 Melibas kembali ke iPad. 59 00:04:45,150 --> 00:04:51,690 Jika kita pergi untuk menangani 10, kita tahu bahawa alamat 10 x varible 60 00:04:51,690 --> 00:04:55,480 kerana kita diberitahu oleh titik peluru kami bahawa alamat x dalam ingatan adalah 10. 61 00:04:55,480 --> 00:05:00,180 Jadi kita boleh pergi ke sana, dapatkan nilai, iaitu 1, seperti yang kita lihat pada iPad kami, 62 00:05:00,180 --> 00:05:06,300 dan beban yang menjadi tmp. 63 00:05:06,300 --> 00:05:08,250 Sekali lagi, ini bukan kandungan akhir. 64 00:05:08,250 --> 00:05:14,350 Kami akan berjalan melalui dan kita akan sampai ke negeri terakhir kami program pada akhir. 65 00:05:14,350 --> 00:05:17,210 Tetapi sekarang, kita mempunyai nilai 1 disimpan di dalam tmp. 66 00:05:17,210 --> 00:05:19,210 >> Dan ada soalan yang lebih cepat sini. 67 00:05:19,210 --> 00:05:23,980 [Alexander] Adakah pengendali dereference - itu hanya hak bintang di hadapan pembolehubah? 68 00:05:23,980 --> 00:05:27,600 >> Ya. Jadi pengendali dereference, seperti yang kita flip kembali untuk komputer riba kami sekali lagi, 69 00:05:27,600 --> 00:05:33,780 adalah bintang ini betul-betul di hadapan. 70 00:05:33,780 --> 00:05:37,460 Dari segi ini, ia adalah - anda bezakan dengan operator pendaraban 71 00:05:37,460 --> 00:05:42,400 yang memerlukan dua perkara; pengendali dereference adalah pengendali unari. 72 00:05:42,400 --> 00:05:46,130 Hanya digunakan untuk satu nilai berbanding pengendali binari, 73 00:05:46,130 --> 00:05:48,810 di mana anda memohon kepada dua nilai yang berbeza. 74 00:05:48,810 --> 00:05:52,080 Jadi itulah apa yang berlaku di dalam bidang ini. 75 00:05:52,080 --> 00:05:58,390 Kami dimuatkan nilai 1 dan disimpan ke dalam pembolehubah integer sementara kami. 76 00:05:58,390 --> 00:06:05,800 Barisan seterusnya, kita menyimpan kandungan b ke - 77 00:06:05,800 --> 00:06:12,630 atau, sebaliknya, kita menyimpan kandungan yang b menunjuk ke ke tempat di mana menunjuk ke. 78 00:06:12,630 --> 00:06:17,690 Jika kita menganalisis ini dari kanan ke kiri, kita akan b dereference, 79 00:06:17,690 --> 00:06:23,580 kita akan untuk menangani 14, kita akan merebut integer yang ada, 80 00:06:23,580 --> 00:06:26,900 dan kemudian kita akan pergi ke alamat 10, 81 00:06:26,900 --> 00:06:34,240 dan kita akan membuang hasil dereference kami b ke dalam ruang itu. 82 00:06:34,240 --> 00:06:40,080 Melibas kembali ke iPad, kita di mana kita boleh membuat ini sedikit lebih konkrit, 83 00:06:40,080 --> 00:06:44,070 ia mungkin membantu jika saya menulis nombor pada semua alamat di sini. 84 00:06:44,070 --> 00:06:53,820 Jadi kita tahu bahawa pada y, kita adalah pada 14 alamat, x ialah pada 10 alamat. 85 00:06:53,820 --> 00:07:00,180 Apabila kita bermula di b, kita dereference b, kita akan merebut nilai 2. 86 00:07:00,180 --> 00:07:08,320 Kami akan merebut nilai ini kerana itu adalah nilai yang tinggal pada 14 alamat. 87 00:07:08,320 --> 00:07:15,700 Dan kita akan meletakkan ia ke dalam pembolehubah yang tinggal alamat pada 10, 88 00:07:15,700 --> 00:07:19,160 yang betul-betul ada, sepadan dengan pembolehubah x kita. 89 00:07:19,160 --> 00:07:21,810 Jadi kita boleh melakukan sedikit penggantian sini 90 00:07:21,810 --> 00:07:35,380 di mana kita menghilangkan daripada 1 kita dan sebaliknya kita menulis 2. 91 00:07:35,380 --> 00:07:39,560 Jadi semua baik dan baik di dunia, walaupun kita telah x ditimpa sekarang. 92 00:07:39,560 --> 00:07:44,890 Kami telah disimpan nilai lama x dalam pembolehubah tmp kami. 93 00:07:44,890 --> 00:07:50,210 Jadi kita boleh melengkapkan swap dengan baris berikutnya. 94 00:07:50,210 --> 00:07:53,030 Melibas kembali ke komputer riba kita. 95 00:07:53,030 --> 00:07:58,150 Sekarang semua yang tinggal adalah untuk mengambil keluar kandungan pembolehubah sementara integer kami 96 00:07:58,150 --> 00:08:05,630 dan menyimpan mereka ke dalam pembolehubah yang tinggal di alamat yang b memegang. 97 00:08:05,630 --> 00:08:10,230 Jadi kita pergi untuk b dereference berkesan untuk mendapatkan akses kepada pembolehubah 98 00:08:10,230 --> 00:08:14,340 yang berada di alamat yang b memegang di dalamnya, 99 00:08:14,340 --> 00:08:19,190 dan kita pergi untuk barangan nilai yang tmp memegang ke dalamnya. 100 00:08:19,190 --> 00:08:23,280 Melibas kembali untuk iPad sekali lagi. 101 00:08:23,280 --> 00:08:31,290 Saya boleh memadam nilai ini di sini, 2, 102 00:08:31,290 --> 00:08:41,010 dan sebaliknya kita akan menyalin hak 1 ke dalamnya. 103 00:08:41,010 --> 00:08:43,059 Kemudian baris seterusnya yang melaksanakan, sudah tentu - 104 00:08:43,059 --> 00:08:47,150 jika kita menyelak kembali ke laptop - adalah ini 6 titik, 105 00:08:47,150 --> 00:08:52,500 yang merupakan titik di mana kita mahu mempunyai gambarajah kami diisi dengan lengkap. 106 00:08:52,500 --> 00:08:58,940 Jadi Melibas kembali ke iPad sekali lagi, hanya jadi anda boleh lihat gambar rajah yang lengkap, 107 00:08:58,940 --> 00:09:06,610 anda dapat melihat bahawa kita mempunyai 10 di, 14 dalam b, 1 dalam tmp, 2 x, dan 1 dalam y. 108 00:09:06,610 --> 00:09:11,000 Adakah terdapat apa-apa soalan tentang perkara ini? 109 00:09:11,000 --> 00:09:14,640 Adakah ini masuk akal yang lebih, setelah berjalan melaluinya? 110 00:09:14,640 --> 00:09:24,850 Kurang akal? Harap-harap tidak. Okay. 111 00:09:24,850 --> 00:09:28,230 >> Petunjuk adalah satu perkara yang amat sukar. 112 00:09:28,230 --> 00:09:33,420 Salah satu lelaki kita bekerja dengan mempunyai satu pepatah yang sangat biasa: 113 00:09:33,420 --> 00:09:36,590 "Untuk memahami petunjuk, pertama anda mesti memahami petunjuk." 114 00:09:36,590 --> 00:09:40,530 Yang saya fikir adalah sangat benar. Ia tidak mengambil sedikit masa untuk mendapatkan digunakan untuk ia. 115 00:09:40,530 --> 00:09:45,360 Lukisan banyak gambar, lukisan banyak gambarajah memori seperti ini sangat membantu, 116 00:09:45,360 --> 00:09:49,480 dan selepas anda berjalan melalui contoh selepas contoh selepas contoh, 117 00:09:49,480 --> 00:09:54,450 ia akan mula masuk akal lebih sedikit dan rasa lebih sedikit dan rasa lebih sedikit. 118 00:09:54,450 --> 00:10:01,560 Akhirnya, satu hari, anda akan mempunyai semua sepenuhnya menguasai. 119 00:10:01,560 --> 00:10:13,800 Apa-apa soalan sebelum kita beralih ke masalah seterusnya? Semua hak. 120 00:10:13,800 --> 00:10:18,840 Jadi menyelak kembali ke laptop. 121 00:10:18,840 --> 00:10:23,300 Masalah seterusnya yang kita ada adalah masalah nombor 33 pada fail I / O. 122 00:10:23,300 --> 00:10:26,350 Zum masuk pada sedikit ini sedikit. 123 00:10:26,350 --> 00:10:28,710 Masalah 33 - Ya? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] Saya hanya mempunyai satu soalan yang cepat. Ini bintang, atau asterisk, 125 00:10:32,110 --> 00:10:35,590 ia dipanggil dereferencing apabila anda menggunakan asterisk sebelum. 126 00:10:35,590 --> 00:10:38,820 Apakah ia dipanggil apabila anda menggunakan #: glib sebelum? 127 00:10:38,820 --> 00:10:43,140 >> #: Glib sebelum ini alamat pengendali. 128 00:10:43,140 --> 00:10:45,880 Jadi mari kita tatal sandaran. 129 00:10:45,880 --> 00:10:49,310 Oops. Saya dalam mod zum jadi saya tidak boleh benar-benar tatal. 130 00:10:49,310 --> 00:10:52,780 Jika kita melihat kod ini benar-benar cepat di sini, 131 00:10:52,780 --> 00:10:54,980 sekali lagi, perkara yang sama berlaku. 132 00:10:54,980 --> 00:10:59,180 Jika kita melihat kod ini di sini, pada baris ini di mana kita membuat panggilan untuk menukar, 133 00:10:59,180 --> 00:11:10,460 #: glib hanya mengatakan "mendapatkan alamat di mana kehidupan pembolehubah x." 134 00:11:10,460 --> 00:11:14,460 Apabila pengkompil anda menyusun kod anda, 135 00:11:14,460 --> 00:11:20,590 ia sebenarnya mempunyai fizikal menandakan tempat dalam ingatan untuk semua pembolehubah anda untuk hidup. 136 00:11:20,590 --> 00:11:24,910 Dan jadi apa pengkompil maka boleh lakukan apabila ia disusun segala-galanya, 137 00:11:24,910 --> 00:11:31,110 ia tahu, "Oh, saya meletakkan x alamat pada 10 saya meletakkan y alamat pada 14." 138 00:11:31,110 --> 00:11:34,640 Ia kemudian boleh mengisi dalam nilai-nilai ini untuk anda. 139 00:11:34,640 --> 00:11:44,740 Jadi, anda boleh kemudian - ia kemudian boleh lulus ini dalam pas dan & y dalam juga. 140 00:11:44,740 --> 00:11:50,730 Ini lelaki mendapat alamat, tetapi mereka juga, apabila anda lulus mereka ke dalam fungsi swap, 141 00:11:50,730 --> 00:11:55,690 jenis maklumat ini, ini * int di sini, memberitahu pengkompil, 142 00:11:55,690 --> 00:12:01,350 "Baiklah, kita akan mentafsirkan alamat ini sebagai alamat pembolehubah integer." 143 00:12:01,350 --> 00:12:05,900 Sebagai alamat int, yang berbeza daripada alamat pembolehubah watak 144 00:12:05,900 --> 00:12:09,930 kerana int mengambil, pada mesin 32-bit, mengambil masa sehingga 4 bait ruang, 145 00:12:09,930 --> 00:12:13,310 manakala watak hanya mengambil masa sehingga 1 bait ruang. 146 00:12:13,310 --> 00:12:17,310 Jadi ia adalah penting untuk tahu juga apa yang - apa yang tinggal, apa jenis nilai 147 00:12:17,310 --> 00:12:20,340 tinggal di alamat yang mendapat diluluskan. 148 00:12:20,340 --> 00:12:22,020 Atau alamat yang anda berurusan dengan. 149 00:12:22,020 --> 00:12:29,020 Cara itu, anda tahu berapa banyak bait maklumat sebenarnya beban keluar RAM anda. 150 00:12:29,020 --> 00:12:31,780 Dan kemudian, ya, ini pengendali dereference, seperti anda telah bertanya, 151 00:12:31,780 --> 00:12:37,200 pergi dan mengakses maklumat di alamat tertentu. 152 00:12:37,200 --> 00:12:42,820 Jadi ia berkata, dengan pembolehubah ini di sini, merawat kandungan sebagai alamat, 153 00:12:42,820 --> 00:12:47,880 pergi ke alamat tersebut, dan tarik keluar, beban ke dalam pemproses, beban ke dalam daftar 154 00:12:47,880 --> 00:12:56,340 nilai sebenar atau kandungan yang tinggal di alamat itu. 155 00:12:56,340 --> 00:12:59,620 Apa-apa lagi soalan? Ini adalah soalan yang baik. 156 00:12:59,620 --> 00:13:01,650 Ia banyak istilah baru juga. 157 00:13:01,650 --> 00:13:09,800 Ia juga jenis funky, melihat dan * di tempat-tempat yang berbeza. 158 00:13:09,800 --> 00:13:13,180 >> Semua hak. 159 00:13:13,180 --> 00:13:18,530 Jadi kembali kepada 33 masalah, memfailkan I / O. 160 00:13:18,530 --> 00:13:22,540 Ini adalah salah satu masalah yang saya berfikir beberapa perkara yang berlaku. 161 00:13:22,540 --> 00:13:25,400 Satu, ia adalah satu topik yang agak baru. 162 00:13:25,400 --> 00:13:30,590 Ia telah dibentangkan cantik tidak lama lagi sebelum kuiz, 163 00:13:30,590 --> 00:13:33,400 dan kemudian saya fikir ia adalah jenis seperti salah seorang daripada mereka masalah perkataan dalam matematik 164 00:13:33,400 --> 00:13:39,720 di mana mereka memberikan anda banyak maklumat, tetapi anda sebenarnya tidak berakhir sehingga perlu menggunakan tan. 165 00:13:39,720 --> 00:13:44,060 Bahagian pertama masalah ini menggambarkan apa fail CSV. 166 00:13:44,060 --> 00:13:50,620 Kini, fail CSV, menurut keterangan, adalah fail nilai dipisahkan koma. 167 00:13:50,620 --> 00:13:55,300 Sebab ini adalah di semua menarik, dan sebab anda pernah menggunakan mereka, 168 00:13:55,300 --> 00:14:00,800 kerana, berapa ramai daripada anda pernah menggunakan barangan seperti Excel? 169 00:14:00,800 --> 00:14:03,240 Rajah kebanyakan kamu telah, mungkin, atau akan digunakan pada satu ketika dalam hidup anda. 170 00:14:03,240 --> 00:14:06,430 Anda akan menggunakan sesuatu seperti Excel. 171 00:14:06,430 --> 00:14:10,940 Dalam usaha untuk mendapatkan data spreadsheet Excel atau melakukan apa-apa jenis pemprosesan dengan itu, 172 00:14:10,940 --> 00:14:17,240 jika anda mahu untuk menulis program C atau program Python, program Jawa, 173 00:14:17,240 --> 00:14:20,070 untuk berurusan dengan data yang anda telah disimpan di sana, 174 00:14:20,070 --> 00:14:23,170 salah satu cara yang paling biasa untuk mendapatkan ia keluar adalah dalam fail CSV. 175 00:14:23,170 --> 00:14:26,850 Dan anda boleh membuka Excel dan apabila anda pergi ke 'Save As' dialog, 176 00:14:26,850 --> 00:14:32,840 anda boleh mendapatkan fail CSV sebenar. 177 00:14:32,840 --> 00:14:35,890 >> Berguna untuk tahu bagaimana untuk berurusan dengan perkara-perkara ini. 178 00:14:35,890 --> 00:14:42,010 Cara ia berfungsi ialah bahawa ia adalah serupa dengan - Maksud saya, ia dasarnya meniru spreadsheet, 179 00:14:42,010 --> 00:14:47,590 di mana, seperti yang kita lihat di sini, dalam sekeping sangat kiri yang paling, 180 00:14:47,590 --> 00:14:49,910 kita mempunyai semua nama-nama yang lalu. 181 00:14:49,910 --> 00:14:54,670 Jadi kita mempunyai Malan, maka Hardison, dan kemudian Bowden, MacWilliam, dan kemudian Chan. 182 00:14:54,670 --> 00:14:59,470 Semua nama-nama yang lalu. Dan kemudian koma memisahkan nama terakhir dari nama pertama. 183 00:14:59,470 --> 00:15:02,970 David, Nate, Rob, Tommy, dan Zamyla. 184 00:15:02,970 --> 00:15:06,850 Saya sentiasa adukkan Robby dan Tom. 185 00:15:06,850 --> 00:15:10,940 Dan kemudian, akhirnya, lajur ketiga adalah alamat e-mel. 186 00:15:10,940 --> 00:15:18,500 Setelah anda memahami bahawa, seluruh program ini adalah agak mudah untuk melaksanakan. 187 00:15:18,500 --> 00:15:23,850 Apa yang kita telah dilakukan dalam usaha untuk meniru struktur yang sama dalam program C kami 188 00:15:23,850 --> 00:15:27,510 kita telah digunakan struktur. 189 00:15:27,510 --> 00:15:30,520 Kami akan mula bermain dengan lebih sedikit serta. 190 00:15:30,520 --> 00:15:35,790 Kita melihat mereka untuk bit pertama sedikit masalah dalam set 3, apabila kita berurusan dengan kamus. 191 00:15:35,790 --> 00:15:40,290 Tetapi ini struct kakitangan menyimpan nama akhir, nama pertama, dan e-mel. 192 00:15:40,290 --> 00:15:44,500 Sama seperti fail CSV kami telah menyimpan. 193 00:15:44,500 --> 00:15:47,950 Jadi ini hanya menukar dari satu format yang lain. 194 00:15:47,950 --> 00:15:54,630 Kita perlu untuk menukar, dalam kes ini, struct kakitangan ke dalam barisan, 195 00:15:54,630 --> 00:15:59,060 garis dipisahkan dengan koma, seperti itu. 196 00:15:59,060 --> 00:16:01,500 Adakah yang masuk akal? Kalian semua telah mengambil kuiz, 197 00:16:01,500 --> 00:16:07,680 jadi saya bayangkan anda telah sekurang-kurangnya mempunyai sedikit masa untuk berfikir tentang perkara ini. 198 00:16:07,680 --> 00:16:16,410 >> Dalam fungsi sewa, masalah meminta kita untuk mengambil - zoom we'll di atas sedikit ini sedikit - 199 00:16:16,410 --> 00:16:22,480 mengambil struktur kakitangan, struct kakitangan, dengan nama s, 200 00:16:22,480 --> 00:16:30,900 dan melampirkan kandungannya ke fail staff.csv kami. 201 00:16:30,900 --> 00:16:34,230 Ia ternyata bahawa ini adalah agak mudah untuk digunakan. 202 00:16:34,230 --> 00:16:37,430 Kami jenis akan bermain-main dengan fungsi-fungsi lebih sedikit hari ini. 203 00:16:37,430 --> 00:16:44,510 Tetapi dalam kes ini, fungsi fprintf adalah benar-benar kunci. 204 00:16:44,510 --> 00:16:51,960 Jadi dengan fprintf, kita boleh mencetak, seperti anda semua telah printf menggunakan istilah ini keseluruhan. 205 00:16:51,960 --> 00:16:55,050 Anda boleh printf garis ke fail. 206 00:16:55,050 --> 00:16:59,030 Jadi bukan hanya membuat panggilan printf biasa di mana anda memberikan rentetan format 207 00:16:59,030 --> 00:17:05,380 dan kemudian anda menggantikan semua pembolehubah dengan hujah-hujah berikut, 208 00:17:05,380 --> 00:17:11,290 dengan fprintf, hujah anda yang pertama adalah sebaliknya fail yang anda mahu untuk menulis. 209 00:17:11,290 --> 00:17:21,170 Jika kita melihat ini dalam perkakas, sebagai contoh, manusia fprintf, 210 00:17:21,170 --> 00:17:25,980 kita boleh lihat perbezaan antara printf dan fprintf. 211 00:17:25,980 --> 00:17:28,960 Saya akan zum di sini sedikit. 212 00:17:28,960 --> 00:17:33,140 Jadi dengan printf, kita memberikan rentetan format, dan kemudian hujah berikutnya 213 00:17:33,140 --> 00:17:37,580 semua pembolehubah untuk penggantian atau penggantian ke dalam rentetan format kami. 214 00:17:37,580 --> 00:17:47,310 Manakala dengan fprintf, hujah pertama memang * Fail ini dipanggil sungai. 215 00:17:47,310 --> 00:17:51,800 >> Melangkah kembali di sini untuk sewa kami, 216 00:17:51,800 --> 00:17:54,550 kita sudah mendapat aliran fail * kami dibuka untuk kita. 217 00:17:54,550 --> 00:17:57,810 Itulah apa ini baris pertama tidak; ia membuka fail staff.csv, 218 00:17:57,810 --> 00:18:01,690 ia dibuka dalam mod lampiran, dan semua yang tinggal untuk kita lakukan adalah 219 00:18:01,690 --> 00:18:08,640 menulis struktur kakitangan ke fail. 220 00:18:08,640 --> 00:18:10,870 Dan, mari kita lihat, adakah saya mahu menggunakan iPad? 221 00:18:10,870 --> 00:18:17,900 Saya akan menggunakan iPad. Kami mempunyai terbatal - biarkan yang meletakkan ini di atas meja supaya saya boleh menulis sedikit lebih baik - 222 00:18:17,900 --> 00:18:33,680 membatalkan sewa dan ia mengambil masa dalam satu hujah, struktur kakitangan dipanggil s. 223 00:18:33,680 --> 00:18:44,120 Got pendakap kami, kami telah mendapat * fail kami dipanggil fail, 224 00:18:44,120 --> 00:18:48,380 kita mempunyai garis fopen kami yang diberikan kepada kita, 225 00:18:48,380 --> 00:18:51,890 dan saya hanya akan menulis ia sebagai titik kerana ia sudah di pedia. 226 00:18:51,890 --> 00:19:00,530 Dan kemudian pada baris seterusnya kita, kita pergi untuk membuat panggilan kepada fprintf 227 00:19:00,530 --> 00:19:03,700 dan kita akan lulus dalam fail yang kita ingin mencetak, 228 00:19:03,700 --> 00:19:10,290 dan kemudian rentetan format kami, yang - 229 00:19:10,290 --> 00:19:14,300 Saya akan biarkan anda semua beritahu saya apa yang kelihatan seperti. 230 00:19:14,300 --> 00:19:20,500 Bagaimana pula dengan anda, Stella? Adakah anda tahu apa bahagian pertama rentetan format kelihatan seperti? 231 00:19:20,500 --> 00:19:24,270 [Stella] Saya tidak pasti. >> Rasa bebas untuk bertanya Jimmy. 232 00:19:24,270 --> 00:19:27,690 Adakah anda tahu, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Adakah ia hanya akan bertahan? Saya tidak tahu. Saya tidak pasti sepenuhnya. 234 00:19:31,000 --> 00:19:39,020 >> Okay. Bagaimana pula, adakah sesiapa mendapatkan ini betul pada peperiksaan? 235 00:19:39,020 --> 00:19:41,770 No Baiklah. 236 00:19:41,770 --> 00:19:47,920 Ia ternyata bahawa di sini semua yang perlu kita lakukan ialah kita mahu setiap sebahagian daripada struktur kakitangan kami 237 00:19:47,920 --> 00:19:53,290 akan dicetak sebagai rentetan ke dalam fail kami. 238 00:19:53,290 --> 00:19:59,900 Kami hanya menggunakan watak tali penggantian tiga kali berbeza kerana kita mempunyai nama akhir 239 00:19:59,900 --> 00:20:07,160 diikuti dengan koma, maka nama pertama diikuti oleh koma, 240 00:20:07,160 --> 00:20:12,430 dan akhirnya alamat e-mel yang diikuti - yang tidak 241 00:20:12,430 --> 00:20:15,140 pemasangan pada skrin saya - tetapi ia diikuti oleh watak newline. 242 00:20:15,140 --> 00:20:20,060 Jadi saya akan menulis ia hanya di bawah sana. 243 00:20:20,060 --> 00:20:23,560 Dan kemudian berikutan rentetan format kami, 244 00:20:23,560 --> 00:20:27,880 kita hanya perlu penggantian, yang kita mengakses menggunakan tatatanda dot 245 00:20:27,880 --> 00:20:31,370 yang kita lihat masalah dalam set 3. 246 00:20:31,370 --> 00:20:48,820 Kita boleh menggunakan s.last, s.first, dan s.email 247 00:20:48,820 --> 00:20:58,990 untuk menggantikan dalam ketiga-tiga nilai ke dalam rentetan format kami. 248 00:20:58,990 --> 00:21:06,190 Jadi bagaimana itu pergi? Masuk akal? 249 00:21:06,190 --> 00:21:09,700 Ya? Tidak? Mungkin? Okay. 250 00:21:09,700 --> 00:21:14,180 >> Perkara terakhir yang kita lakukan selepas kita telah dicetak dan selepas kita telah membuka fail kami: 251 00:21:14,180 --> 00:21:17,370 apabila kita telah membuka fail, kita sentiasa perlu ingat untuk menutupnya. 252 00:21:17,370 --> 00:21:19,430 Kerana jika tidak, kita akan berakhir sehingga bocor memori, 253 00:21:19,430 --> 00:21:22,500 menggunakan perihalan fail. 254 00:21:22,500 --> 00:21:25,950 Jadi untuk menutup, fungsi yang tidak kita gunakan? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] fclose? >> Fclose, betul-betul. 256 00:21:30,120 --> 00:21:37,520 Jadi bahagian terakhir masalah ini adalah untuk menutup fail, menggunakan fungsi fclose, 257 00:21:37,520 --> 00:21:40,370 yang hanya kelihatan seperti itu. 258 00:21:40,370 --> 00:21:43,880 Tidak terlalu gila. 259 00:21:43,880 --> 00:21:46,990 Sejuk. 260 00:21:46,990 --> 00:21:49,520 Jadi itulah masalah 33 pada kuiz. 261 00:21:49,520 --> 00:21:52,480 Kami akan mempunyai fail pasti lebih I / O datang. 262 00:21:52,480 --> 00:21:55,130 Kami akan melakukan sedikit lebih dalam kuliah hari ini, atau dalam seksyen hari ini, 263 00:21:55,130 --> 00:22:01,710 kerana itulah apa yang akan membentuk sebahagian besar daripada pset ini akan datang. 264 00:22:01,710 --> 00:22:05,020 Mari kita bergerak dari kuiz pada ketika ini. Ya? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Mengapa fclose (fail) bukannya fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ah. Kerana ia ternyata bahawa - jadi soalan, yang adalah satu besar, 267 00:22:19,100 --> 00:22:27,800 sebabnya, apabila kita menulis fclose, kita menulis bintang pembolehubah fclose (file) 268 00:22:27,800 --> 00:22:33,680 berbanding kepada nama fail, staff.csv? Adakah itu betul? Yeah. 269 00:22:33,680 --> 00:22:39,570 Jadi mari kita lihat. Jika saya menukar kembali ke komputer riba saya, 270 00:22:39,570 --> 00:22:45,040 dan biarkan melihat fungsi fclose. 271 00:22:45,040 --> 00:22:51,460 Jadi fungsi fclose menutup sungai dan ia mengambil penunjuk aliran yang kita mahu untuk menutup, 272 00:22:51,460 --> 00:22:57,010 berbanding dengan nama fail sebenar yang kita mahu menutup. 273 00:22:57,010 --> 00:23:01,620 Dan ini adalah kerana di sebalik tabir, apabila anda membuat panggilan untuk fopen, 274 00:23:01,620 --> 00:23:12,020 apabila anda membuka fail, anda sebenarnya memperuntukkan memori untuk menyimpan maklumat mengenai fail. 275 00:23:12,020 --> 00:23:16,380 Jadi anda mempunyai penunjuk fail yang mempunyai maklumat tentang fail, 276 00:23:16,380 --> 00:23:23,080 seperti ia terbuka, saiznya, di mana anda berada kini dalam fail, 277 00:23:23,080 --> 00:23:29,100 supaya anda boleh membuat membaca dan menulis panggilan ke tempat yang tertentu dalam fail. 278 00:23:29,100 --> 00:23:38,060 Anda akhirnya menutup penunjuk bukannya menutup nama fail. 279 00:23:38,060 --> 00:23:48,990 >> Ya? [Daniel] Jadi untuk menggunakan sewa, anda akan berkata - bagaimana ia mendapatkan input pengguna? 280 00:23:48,990 --> 00:23:53,830 Adakah fprintf bertindak seperti GetString dalam erti kata bahawa ia hanya akan menunggu untuk input pengguna 281 00:23:53,830 --> 00:23:57,180 dan meminta anda untuk menaip ini - atau menunggu untuk anda menaip ketiga-tiga perkara di? 282 00:23:57,180 --> 00:24:00,480 Atau adakah anda perlu untuk menggunakan sesuatu untuk melaksanakan sewa? 283 00:24:00,480 --> 00:24:04,100 >> Yeah. Jadi kita tidak berada - soalan itu, bagaimana kita mendapatkan input pengguna 284 00:24:04,100 --> 00:24:09,220 untuk melaksanakan sewa? Dan apa yang kita ada di sini adalah pemanggil sewa, 285 00:24:09,220 --> 00:24:17,690 diluluskan dalam struct kakitangan ini dengan semua data yang disimpan dalam struct sudah. 286 00:24:17,690 --> 00:24:22,990 Jadi fprintf mampu untuk hanya menulis bahawa data secara langsung ke fail. 287 00:24:22,990 --> 00:24:25,690 Tiada menunggu input pengguna. 288 00:24:25,690 --> 00:24:32,110 Pengguna sudah diberi input dengan betul meletakkan dalam struct kakitangan ini. 289 00:24:32,110 --> 00:24:36,510 Dan perkara, sudah tentu, akan memecahkan jika mana-mana orang-orang penunjuk nol, 290 00:24:36,510 --> 00:24:40,370 jadi kita skrol kembali di sini dan kita melihat struct kami. 291 00:24:40,370 --> 00:24:43,640 Kami mempunyai rentetan lepas, rentetan pertama, tali e-mel. 292 00:24:43,640 --> 00:24:48,530 Kita kini tahu bahawa semua mereka yang benar-benar, di bawah hood, adalah pembolehubah * char. 293 00:24:48,530 --> 00:24:53,470 Yang mungkin atau tidak boleh menunjuk ke menyeimbangkan. 294 00:24:53,470 --> 00:24:55,800 Mereka boleh menunjuk ke memori pada timbunan itu, 295 00:24:55,800 --> 00:24:59,650 mungkin memori pada timbunan. 296 00:24:59,650 --> 00:25:04,580 Kami tidak benar-benar tahu, tetapi jika mana-mana petunjuk ini adalah batal, atau tidak sah, 297 00:25:04,580 --> 00:25:08,120 bahawa yang pasti akan kemalangan fungsi sewa kami. 298 00:25:08,120 --> 00:25:11,050 Itu adalah sesuatu yang adalah jenis di luar skop peperiksaan. 299 00:25:11,050 --> 00:25:16,440 Kami tidak bimbang tentang itu. 300 00:25:16,440 --> 00:25:22,170 Besar. Okay. Jadi bergerak dari kuiz. 301 00:25:22,170 --> 00:25:25,760 >> Mari kita menutup lelaki ini, dan kita akan melihat pada pset 4. 302 00:25:25,760 --> 00:25:34,700 Jadi jika anda semua melihat spec pset, sekali anda boleh mengaksesnya, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 kita akan pergi melalui beberapa masalah seksyen hari ini. 304 00:25:42,730 --> 00:25:52,240 Saya menatal ke bawah - seksyen soalan bermula pada halaman ketiga spec pset. 305 00:25:52,240 --> 00:25:57,800 Dan bahagian pertama meminta anda untuk pergi dan menonton pendek mengalihkan dan paip. 306 00:25:57,800 --> 00:26:02,820 Yang jenis yang singkat sejuk, menunjukkan anda beberapa baru, selaras helah arahan sejuk yang boleh anda gunakan. 307 00:26:02,820 --> 00:26:06,050 Dan kemudian kami telah mendapat beberapa soalan untuk anda juga. 308 00:26:06,050 --> 00:26:10,860 Ini soalan pertama tentang sungai, yang printf menulis secara lalai, 309 00:26:10,860 --> 00:26:15,920 kita jenis menyentuh hanya sedikit masa lalu. 310 00:26:15,920 --> 00:26:22,380 Ini fprintf bahawa kita hanya membincangkan mengambil dalam aliran * fail sebagai hujah. 311 00:26:22,380 --> 00:26:26,580 fclose mengambil dalam aliran fail * juga, 312 00:26:26,580 --> 00:26:32,660 dan nilai pulangan fopen memberikan anda aliran fail * juga. 313 00:26:32,660 --> 00:26:36,060 Sebab kita tidak melihat orang-orang sebelum apabila kita telah diuruskan dengan printf 314 00:26:36,060 --> 00:26:39,450 adalah kerana printf mempunyai aliran lalai. 315 00:26:39,450 --> 00:26:41,810 Dan aliran lalai yang ia menulis 316 00:26:41,810 --> 00:26:45,190 anda akan mengetahui di pendek. 317 00:26:45,190 --> 00:26:50,080 Jadi pasti mengambil melihat pada ia. 318 00:26:50,080 --> 00:26:53,010 >> Dalam seksyen hari ini, kita akan bercakap sedikit tentang GDB, 319 00:26:53,010 --> 00:26:57,720 sejak lebih mengenali anda dengan itu, amalan yang lebih anda mendapat dengan itu, 320 00:26:57,720 --> 00:27:01,390 lebih mampu anda akan sebenarnya memburu bug dalam kod anda sendiri. 321 00:27:01,390 --> 00:27:05,540 Ini mempercepatkan proses debugging dengan mendadak. 322 00:27:05,540 --> 00:27:09,230 Jadi dengan menggunakan printf, setiap kali anda berbuat demikian anda perlu susun semula kod anda, 323 00:27:09,230 --> 00:27:13,000 anda perlu untuk menjalankan ia lagi, kadang-kadang anda perlu untuk menggerakkan panggilan printf sekitar, 324 00:27:13,000 --> 00:27:17,100 mengulas kod, ia hanya mengambil masa. 325 00:27:17,100 --> 00:27:20,850 Matlamat kami adalah untuk cuba dan meyakinkan anda bahawa dengan GDB, anda boleh asasnya 326 00:27:20,850 --> 00:27:26,810 apa-apa printf pada mana-mana titik dalam kod anda dan anda tidak perlu susun semula ia. 327 00:27:26,810 --> 00:27:35,120 Anda tidak perlu untuk memulakan dan menyimpan meneka di mana untuk printf seterusnya. 328 00:27:35,120 --> 00:27:40,910 Perkara pertama untuk dilakukan ialah untuk menyalin baris ini dan mendapatkan kod seksyen off web. 329 00:27:40,910 --> 00:27:47,530 Saya menyalin ini baris kod yang mengatakan bahawa, "http://cdn.cs50.net wget". 330 00:27:47,530 --> 00:27:49,510 Saya akan menyalin ia. 331 00:27:49,510 --> 00:27:55,950 Saya akan pergi ke perkakas saya, zum keluar supaya anda boleh melihat apa yang saya lakukan, 332 00:27:55,950 --> 00:28:01,890 tampal di sana, dan apabila saya tekan Enter, ini arahan wget literal adalah web mendapatkan. 333 00:28:01,890 --> 00:28:06,210 Ia akan tarik turun fail ini di luar Internet, 334 00:28:06,210 --> 00:28:11,790 dan ia akan menyimpan direktori semasa. 335 00:28:11,790 --> 00:28:21,630 Sekarang, jika saya senarai direktori semasa saya anda boleh lihat bahawa saya telah mendapat fail ini section5.zip betul-betul di sana. 336 00:28:21,630 --> 00:28:25,260 Cara untuk berurusan dengan lelaki itu adalah untuk unzip ia, 337 00:28:25,260 --> 00:28:27,650 yang boleh anda lakukan dalam baris arahan, seperti ini. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Yang akan unzip, membuat folder untuk saya, 340 00:28:36,980 --> 00:28:40,410 mengembung semua kandungan, meletakkan mereka di sana. 341 00:28:40,410 --> 00:28:47,410 Jadi sekarang saya boleh pergi ke direktori seksyen saya 5 dengan menggunakan arahan cd. 342 00:28:47,410 --> 00:28:58,310 Kosongkan skrin menggunakan jelas. Jadi mengosongkan skrin. 343 00:28:58,310 --> 00:29:02,280 Sekarang saya telah mendapat terminal baik bersih untuk berurusan dengan. 344 00:29:02,280 --> 00:29:06,200 >> Sekarang, jika saya menyenaraikan semua fail yang saya lihat dalam direktori ini, 345 00:29:06,200 --> 00:29:12,270 anda melihat bahawa saya telah mendapat empat fail: buggy1, buggy2, buggy3, dan buggy4. 346 00:29:12,270 --> 00:29:16,180 Saya juga telah mendapat c fail yang sepadan. Mereka. 347 00:29:16,180 --> 00:29:20,400 Kami tidak akan melihat c fail sekarang. 348 00:29:20,400 --> 00:29:24,140 Sebaliknya, kita akan menggunakannya apabila kita membuka GDB. 349 00:29:24,140 --> 00:29:28,220 Kami telah disimpan mereka di sekitar supaya kita mempunyai akses kepada kod sumber sebenar apabila kita menggunakan GDB, 350 00:29:28,220 --> 00:29:32,740 tetapi matlamat bahagian ini seksyen itu adalah untuk menggerumit sekitar dengan GDB 351 00:29:32,740 --> 00:29:40,370 dan melihat bagaimana kita boleh menggunakan ia untuk mengetahui apa yang berlaku salah dengan setiap empat program buggy. 352 00:29:40,370 --> 00:29:43,380 Jadi kita hanya akan di sekitar bilik benar-benar cepat, 353 00:29:43,380 --> 00:29:47,000 dan saya akan meminta seseorang untuk menjalankan satu program kereta, 354 00:29:47,000 --> 00:29:54,730 dan kemudian kita akan pergi sebagai satu kumpulan melalui GDB, dan kita akan melihat apa yang boleh kita lakukan untuk menetapkan program-program ini, 355 00:29:54,730 --> 00:29:58,460 atau sekurang-kurangnya mengenal pasti apa yang berlaku salah dalam setiap daripada mereka. 356 00:29:58,460 --> 00:30:04,760 Mari kita mulakan di sini dengan Daniel. Anda akan berjalan buggy1? Mari kita lihat apa yang berlaku. 357 00:30:04,760 --> 00:30:09,470 [Daniel] Ia berkata terdapat satu kesalahan permohonan. >> Yeah. Tepat sekali. 358 00:30:09,470 --> 00:30:12,460 Jadi, jika saya menjalankan buggy1, saya mendapat suatu kesalahan seg. 359 00:30:12,460 --> 00:30:16,210 Pada ketika ini, saya boleh pergi dan membuka buggy1.c, 360 00:30:16,210 --> 00:30:19,450 mencuba dan mengetahui apa yang berlaku salah, 361 00:30:19,450 --> 00:30:22,000 tetapi satu perkara yang paling buruk tentang kesilapan kesilapan ini seg 362 00:30:22,000 --> 00:30:27,610 adalah bahawa ia tidak memberitahu anda apa garis perkara program sebenarnya silapnya dan patah. 363 00:30:27,610 --> 00:30:29,880 Anda jenis perlu melihat kod 364 00:30:29,880 --> 00:30:33,990 dan memikirkan menggunakan tekaan dan memeriksa atau printf untuk melihat apa yang berlaku salah. 365 00:30:33,990 --> 00:30:37,840 Salah satu perkara yang paling hebat tentang GDB adalah bahawa ia adalah benar-benar, benar-benar mudah 366 00:30:37,840 --> 00:30:42,170 untuk memikirkan baris di mana kemalangan program anda. 367 00:30:42,170 --> 00:30:46,160 Ia benar-benar berbaloi untuk menggunakannya, walaupun hanya untuk itu. 368 00:30:46,160 --> 00:30:56,190 Jadi untuk boot GDB, saya menaip GDB, dan kemudian saya memberi laluan untuk laksana bahawa saya mahu menjalankan. 369 00:30:56,190 --> 00:31:01,960 Di sini saya menaip Pra-Pemasangan ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Tekan Enter. Memberikan saya semua maklumat ini hak cipta, 371 00:31:06,600 --> 00:31:13,000 dan turun di sini anda akan melihat baris ini yang mengatakan, "Membaca simbol dari rumah / / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 Dan jika semua berjalan lancar, anda akan melihat ia mencetak mesej yang kelihatan seperti ini. 374 00:31:22,060 --> 00:31:25,500 Ia akan membaca simbol, ia akan berkata "Saya membaca simbol dari fail boleh laku anda," 375 00:31:25,500 --> 00:31:29,900 dan kemudian ia akan mempunyai ini "dilakukan" mesej di sini. 376 00:31:29,900 --> 00:31:35,410 Jika anda melihat beberapa perubahan lain ini, atau yang anda lihat, ia tidak dapat mencari simbol 377 00:31:35,410 --> 00:31:41,460 atau sesuatu seperti itu, apa yang bermakna adalah bahawa anda hanya tidak disusun laku anda dengan betul. 378 00:31:41,460 --> 00:31:49,980 Apabila kita menyusun program untuk digunakan dengan GDB, kita perlu untuk menggunakan bahawa bendera khas g, 379 00:31:49,980 --> 00:31:54,540 dan itulah yang dilakukan oleh lalai jika anda menyusun program anda, hanya dengan menaip membuat 380 00:31:54,540 --> 00:31:59,320 atau membuat kereta atau membuat pulih, mana-mana orang. 381 00:31:59,320 --> 00:32:07,800 Tetapi jika anda sedang menyusun secara manual dengan dilafaz, maka anda akan perlu pergi dalam dan termasuk bendera bahawa-g. 382 00:32:07,800 --> 00:32:10,310 >> Pada ketika ini, sekarang bahawa kita mempunyai prompt GDB kami, 383 00:32:10,310 --> 00:32:12,310 ia adalah agak mudah untuk menjalankan program ini. 384 00:32:12,310 --> 00:32:19,740 Sama ada kita boleh menaip jangka, atau kita hanya boleh menaip r. 385 00:32:19,740 --> 00:32:22,820 Kebanyakan arahan GDB boleh disingkatkan. 386 00:32:22,820 --> 00:32:25,940 Biasanya hanya satu atau surat pasangan, yang cukup baik. 387 00:32:25,940 --> 00:32:30,980 Saad Jadi, jika anda menaip r dan tekan Enter, apa yang berlaku? 388 00:32:30,980 --> 00:32:39,390 [Saad] Saya mendapat SIGSEGV, segmentasi kerosakan, dan maka semua gobbledygook ini. 389 00:32:39,390 --> 00:32:43,650 >> Yeah. 390 00:32:43,650 --> 00:32:47,990 Seperti yang kita lihat pada skrin sekarang, dan seperti Saad berkata, 391 00:32:47,990 --> 00:32:53,430 apabila kita menaip jangka atau r dan tekan Enter, kita masih mendapat kesalahan seg yang sama. 392 00:32:53,430 --> 00:32:55,830 Jadi menggunakan GDB tidak menyelesaikan masalah kita. 393 00:32:55,830 --> 00:32:59,120 Tetapi ia memberikan kita beberapa gobbledygook, dan ternyata bahawa gobbledygook ini 394 00:32:59,120 --> 00:33:03,080 sebenarnya memberitahu kita di mana ia berlaku. 395 00:33:03,080 --> 00:33:10,680 Untuk menghuraikan ini sedikit, ini sedikit pertama adalah fungsi di mana segala-galanya akan salah. 396 00:33:10,680 --> 00:33:20,270 Terdapat ini __ strcmp_sse4_2, dan ia memberitahu kita bahawa ia berlaku dalam fail ini 397 00:33:20,270 --> 00:33:29,450 dipanggil sysdeps/i386, semua ini, sekali lagi, jenis kacau-bilau - tetapi line 254. 398 00:33:29,450 --> 00:33:31,670 Itulah jenis sukar untuk menghurai. Biasanya apabila anda melihat hal-hal seperti ini, 399 00:33:31,670 --> 00:33:38,770 yang bermakna bahawa ia seg faulting dalam salah satu sistem perpustakaan. 400 00:33:38,770 --> 00:33:43,220 Jadi sesuatu kaitan dengan strcmp. Kalian telah dilihat strcmp sebelum ini. 401 00:33:43,220 --> 00:33:52,730 Tidak terlalu gila, tetapi adakah ini bermakna bahawa strcmp rosak atau bahawa terdapat masalah dengan strcmp? 402 00:33:52,730 --> 00:33:57,110 Apa yang anda fikir, Alexander? 403 00:33:57,110 --> 00:34:04,890 [Alexander] Adakah bahawa - 254 baris? Dan bukan binari, tetapi ia tidak siling mereka, 404 00:34:04,890 --> 00:34:10,590 dan kemudian ada satu lagi bahasa untuk setiap fungsi. Adalah bahawa 254 dalam fungsi itu, atau -? 405 00:34:10,590 --> 00:34:21,460 >> Ia line 254. Ia kelihatan seperti dalam fail ini s, jadi ia kod pemasangan mungkin. 406 00:34:21,460 --> 00:34:25,949 >> Tetapi, saya rasa perkara yang lebih mendesak, kerana kita telah mendapat bersalah seg, 407 00:34:25,949 --> 00:34:29,960 dan ia kelihatan seperti ia datang dari fungsi strcmp, 408 00:34:29,960 --> 00:34:38,030 adakah ini membayangkan, maka, strcmp yang rosak? 409 00:34:38,030 --> 00:34:42,290 Ia tidak sepatutnya, mudah-mudahan. Jadi hanya kerana anda mempunyai kesalahan segmentasi 410 00:34:42,290 --> 00:34:49,480 dalam salah satu fungsi sistem, biasanya bermakna bahawa anda hanya tidak dipanggil dengan betul. 411 00:34:49,480 --> 00:34:52,440 Perkara yang paling cepat untuk lakukan untuk mengetahui apa yang sebenarnya berlaku di 412 00:34:52,440 --> 00:34:55,500 apabila anda melihat sesuatu yang gila seperti ini, apabila anda melihat kesilapan seg, 413 00:34:55,500 --> 00:34:59,800 terutamanya jika anda mempunyai satu program yang menggunakan lebih daripada sekadar utama, 414 00:34:59,800 --> 00:35:03,570 adalah untuk menggunakan jejakundur. 415 00:35:03,570 --> 00:35:13,080 Saya menyingkatkan jejakundur dengan menulis bt, berbanding perkataan jejakundur penuh. 416 00:35:13,080 --> 00:35:16,510 Tetapi Charlotte, apa yang berlaku apabila anda menaip bt dan tekan Enter? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Ia menunjukkan saya dua baris, 0 line dan line 1. 418 00:35:23,200 --> 00:35:26,150 >> Yeah. Jadi line 0 dan baris 1. 419 00:35:26,150 --> 00:35:34,560 Ini adalah bingkai tindanan sebenar yang sedang dalam permainan apabila program anda terhempas. 420 00:35:34,560 --> 00:35:42,230 Bermula dari bingkai teratas, bingkai 0, dan pergi ke paling bawah, yang adalah bingkai 1. 421 00:35:42,230 --> 00:35:45,140 Bingkai teratas kami adalah bingkai strcmp. 422 00:35:45,140 --> 00:35:50,080 Anda boleh berfikir ini sebagai serupa dengan masalah yang kita hanya melakukan kuiz dengan petunjuk, 423 00:35:50,080 --> 00:35:54,890 di mana kita telah menukar bingkai tindanan di atas bingkai timbunan utama, 424 00:35:54,890 --> 00:35:59,700 dan kita mempunyai pembolehubah yang swap menggunakan di atas pembolehubah yang utama telah menggunakan. 425 00:35:59,700 --> 00:36:08,440 Berikut kemalangan kami berlaku dalam fungsi strcmp kami, yang telah dipanggil oleh fungsi utama kami, 426 00:36:08,440 --> 00:36:14,370 dan jejakundur memberi kami bukan sahaja fungsi di mana perkara gagal, 427 00:36:14,370 --> 00:36:16,440 tetapi ia juga memberitahu kita di mana segala-galanya telah dipanggil dari. 428 00:36:16,440 --> 00:36:18,830 Jadi jika saya menatal lebih lebih sedikit ke kanan, 429 00:36:18,830 --> 00:36:26,110 kita dapat melihat bahawa yeah, kita berada pada 254 baris fail ini strcmp-sse4.s. 430 00:36:26,110 --> 00:36:32,540 Tetapi panggilan itu dibuat di buggy1.c, baris 6. 431 00:36:32,540 --> 00:36:35,960 Jadi yang bermakna yang boleh kita lakukan - kita hanya boleh pergi menyemak dan melihat apa yang sedang berlaku 432 00:36:35,960 --> 00:36:39,930 di buggy1.c, baris 6. 433 00:36:39,930 --> 00:36:43,780 Sekali lagi, terdapat beberapa cara untuk melakukan ini. Salah satu adalah untuk keluar daripada GDB 434 00:36:43,780 --> 00:36:49,460 atau mempunyai kod anda terbuka dalam tetingkap lain dan rujukan silang. 435 00:36:49,460 --> 00:36:54,740 Itu, di dalam dan dengan sendirinya, adalah agak berguna kerana sekarang jika anda berada pada waktu pejabat 436 00:36:54,740 --> 00:36:57,220 dan anda telah mendapat suatu kesalahan seg dan TF anda tertanya-tanya di mana segala-galanya telah melanggar, 437 00:36:57,220 --> 00:36:59,710 anda hanya boleh mengatakan, "Oh, baris 6. Saya tidak tahu apa yang berlaku, 438 00:36:59,710 --> 00:37:03,670 tetapi sesuatu tentang line 6 menyebabkan program saya untuk memecahkan. " 439 00:37:03,670 --> 00:37:10,430 Cara lain untuk melakukannya ialah anda boleh menggunakan arahan ini dipanggil senarai dalam GDB. 440 00:37:10,430 --> 00:37:13,650 Anda juga boleh menyingkatkan dengan l. 441 00:37:13,650 --> 00:37:18,910 Jadi jika kita memukul l, apa yang kita sampai ke sini? 442 00:37:18,910 --> 00:37:21,160 Kita mendapat sekumpulan keseluruhan barangan pelik. 443 00:37:21,160 --> 00:37:26,030 Ini adalah kod pemasangan sebenar 444 00:37:26,030 --> 00:37:29,860 yang pada strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Ini kelihatan jenis funky, 446 00:37:32,440 --> 00:37:36,520 dan sebab kita mendapat ini adalah kerana sekarang, 447 00:37:36,520 --> 00:37:40,160 GDB telah kami dalam bingkai 0. 448 00:37:40,160 --> 00:37:43,070 >> Jadi bila-bila masa kita melihat pada pembolehubah, bila-bila masa kita melihat kod sumber, 449 00:37:43,070 --> 00:37:50,530 kita sedang melihat kod sumber yang berkaitan untuk bingkai tindanan kami kini masuk 450 00:37:50,530 --> 00:37:53,200 Jadi dalam usaha untuk mendapatkan apa-apa yang bermakna, kita perlu 451 00:37:53,200 --> 00:37:57,070 bergerak ke bingkai timbunan yang lebih masuk akal. 452 00:37:57,070 --> 00:38:00,180 Dalam kes ini, bingkai tindanan utama akan masuk akal lebih sedikit, 453 00:38:00,180 --> 00:38:02,680 kerana itu adalah sebenarnya kod yang kita menulis. 454 00:38:02,680 --> 00:38:05,330 Bukan kod strcmp. 455 00:38:05,330 --> 00:38:08,650 Cara anda boleh bergerak antara bingkai, dalam kes ini, kerana kita mempunyai dua, 456 00:38:08,650 --> 00:38:10,430 kita mempunyai 0 dan 1, 457 00:38:10,430 --> 00:38:13,650 anda boleh berbuat demikian dengan dan arahan down. 458 00:38:13,650 --> 00:38:18,480 Jika saya bergerak sehingga satu bingkai, 459 00:38:18,480 --> 00:38:21,770 sekarang saya dalam bingkai tindanan utama. 460 00:38:21,770 --> 00:38:24,330 Saya boleh bergerak ke bawah untuk kembali ke mana saya berada, 461 00:38:24,330 --> 00:38:32,830 naik lagi, pergi ke bawah lagi, dan pergi lagi. 462 00:38:32,830 --> 00:38:39,750 Jika anda pernah melakukan program anda dalam GDB, anda akan mendapat kemalangan, anda akan mendapat jejakundur, 463 00:38:39,750 --> 00:38:42,380 dan anda melihat bahawa ia adalah dalam fail beberapa bahawa anda tidak tahu apa yang berlaku. 464 00:38:42,380 --> 00:38:45,460 Anda cuba senarai, kod tidak kelihatan biasa kepada anda, 465 00:38:45,460 --> 00:38:48,150 mengambil melihat bingkai anda dan mengetahui di mana anda berada. 466 00:38:48,150 --> 00:38:51,010 Anda mungkin dalam bingkai tindanan salah. 467 00:38:51,010 --> 00:38:58,760 Atau sekurang-kurangnya anda berada dalam bingkai timbunan yang tidak adalah salah satu yang anda benar-benar boleh debug. 468 00:38:58,760 --> 00:39:03,110 Sekarang kita berada dalam bingkai tindanan sesuai, kita berada di utama, 469 00:39:03,110 --> 00:39:08,100 sekarang kita boleh menggunakan senarai arahan untuk memikirkan apa baris. 470 00:39:08,100 --> 00:39:13,590 Dan anda boleh melihat; ia dicetak untuk kita di sini. 471 00:39:13,590 --> 00:39:19,470 Tetapi kita boleh memukul menyenaraikan semua yang sama, dan senarai memberikan kita ini cetakan yang bagus 472 00:39:19,470 --> 00:39:23,920 kod sumber sebenar yang berlaku di sini. 473 00:39:23,920 --> 00:39:26,420 >> Khususnya, kita boleh melihat pada baris 6. 474 00:39:26,420 --> 00:39:29,330 Kita boleh lihat apa yang berlaku di sini. 475 00:39:29,330 --> 00:39:31,250 Dan ia kelihatan seperti kita membuat perbandingan rentetan 476 00:39:31,250 --> 00:39:41,050 antara rentetan "CS50 batu" dan argv [1]. 477 00:39:41,050 --> 00:39:45,700 Sesuatu tentang perkara ini telah terhempas. 478 00:39:45,700 --> 00:39:54,120 Jadi Missy, adakah anda mempunyai apa-apa pemikiran mengenai apa yang mungkin berlaku di sini? 479 00:39:54,120 --> 00:39:59,400 [Missy] Saya tidak tahu kenapa ia terhempas. >> Anda tidak tahu kenapa ia terhempas? 480 00:39:59,400 --> 00:40:02,700 Jimmy, mana-mana pemikiran? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Saya tak pasti sepenuhnya, tetapi kali terakhir kita digunakan rentetan istimewa, 482 00:40:06,240 --> 00:40:10,260 atau strcmp, kita mempunyai seperti tiga kes yang berbeza di bawahnya. 483 00:40:10,260 --> 00:40:12,800 Kami tidak mempunyai ==, saya tidak berfikir, betul-betul di garis yang pertama. 484 00:40:12,800 --> 00:40:16,700 Sebaliknya, ia telah dipisahkan kepada tiga, dan satu adalah == 0, 485 00:40:16,700 --> 00:40:19,910 satu <0, saya fikir, dan satu> 0. 486 00:40:19,910 --> 00:40:22,590 Jadi mungkin sesuatu seperti itu? >> Yeah. Jadi ada isu ini 487 00:40:22,590 --> 00:40:27,200 kita melakukan perbandingan dengan betul? 488 00:40:27,200 --> 00:40:31,660 Stella? Mana-mana pemikiran? 489 00:40:31,660 --> 00:40:38,110 [Stella] Saya tidak pasti. >> Tidak pasti. Daniel? Pemikiran? Okay. 490 00:40:38,110 --> 00:40:44,770 Ternyata apa yang berlaku di sini ialah apabila kita berlari program 491 00:40:44,770 --> 00:40:48,370 dan kita mendapat bersalah seg, apabila anda berlari program untuk kali pertama, Daniel, 492 00:40:48,370 --> 00:40:50,800 adakah anda memberikan apa-apa hujah baris arahan? 493 00:40:50,800 --> 00:40:58,420 [Daniel] No >> No. Dalam kes itu, apakah nilai argv [1]? 494 00:40:58,420 --> 00:41:00,920 >> Terdapat tiada nilai. >> Hak. 495 00:41:00,920 --> 00:41:06,120 Well, tidak ada nilai rentetan yang sesuai. 496 00:41:06,120 --> 00:41:10,780 Tetapi terdapat beberapa nilai. Apakah nilai yang mendapat disimpan di sana? 497 00:41:10,780 --> 00:41:15,130 >> Satu nilai sampah? >> Ia adalah sama ada nilai sampah atau, dalam kes ini, 498 00:41:15,130 --> 00:41:19,930 akhir array argv sentiasa ditamatkan dengan batal. 499 00:41:19,930 --> 00:41:26,050 Jadi apa sebenarnya yang mendapat disimpan di dalam terdapat null. 500 00:41:26,050 --> 00:41:30,810 Cara lain untuk menyelesaikan masalah ini, bukannya berfikir melalui, 501 00:41:30,810 --> 00:41:33,420 adalah untuk mencuba mencetak ia keluar. 502 00:41:33,420 --> 00:41:35,880 Ini adalah di mana saya telah mengatakan bahawa menggunakan GDB adalah besar, 503 00:41:35,880 --> 00:41:40,640 kerana anda boleh mencetak keluar semua pembolehubah, semua nilai-nilai yang anda mahu 504 00:41:40,640 --> 00:41:43,230 menggunakan perintah ini berguna bagus sekali p. 505 00:41:43,230 --> 00:41:48,520 Jadi jika saya menaip p dan kemudian saya menaip nilai pembolehubah atau nama pembolehubah, 506 00:41:48,520 --> 00:41:55,320 berkata, argc, saya melihat bahawa argc ialah 1. 507 00:41:55,320 --> 00:42:01,830 Jika saya ingin mencetak keluar argv [0], saya boleh berbuat demikian seperti itu. 508 00:42:01,830 --> 00:42:04,840 Dan seperti yang kita lihat, argv [0] sentiasa nama program anda, 509 00:42:04,840 --> 00:42:06,910 sentiasa nama executable. 510 00:42:06,910 --> 00:42:09,740 Di sini anda melihat ia mendapat nama path penuh. 511 00:42:09,740 --> 00:42:15,920 Saya juga boleh mencetak argv [1] dan lihat apa yang berlaku. 512 00:42:15,920 --> 00:42:20,890 >> Di sini kita mendapat jenis ini nilai mistik. 513 00:42:20,890 --> 00:42:23,890 Kami mendapat 0x0 ini. 514 00:42:23,890 --> 00:42:27,850 Ingat pada permulaan penggal apabila kita bercakap tentang nombor perenambelasan? 515 00:42:27,850 --> 00:42:34,680 Atau soalan itu sedikit di akhir-pset 0 tentang bagaimana untuk mewakili 50 dalam hex? 516 00:42:34,680 --> 00:42:39,410 Cara kita menulis nombor hex dalam CS, hanya untuk tidak mengelirukan diri 517 00:42:39,410 --> 00:42:46,080 dengan nombor perpuluhan, adalah kita sentiasa awalan mereka dengan 0x. 518 00:42:46,080 --> 00:42:51,420 Jadi ini awalan 0x sentiasa hanya bermakna mentafsir nombor berikut sebagai nombor perenambelasan, 519 00:42:51,420 --> 00:42:57,400 bukan sebagai rentetan, bukan sebagai nombor perpuluhan, bukan sebagai nombor perduaan. 520 00:42:57,400 --> 00:43:02,820 Sejak nombor 5-0 adalah nombor yang sah dalam perenambelasan. 521 00:43:02,820 --> 00:43:06,240 Dan ia adalah nombor dalam perpuluhan, 50. 522 00:43:06,240 --> 00:43:10,050 Jadi ini adalah hanya bagaimana kita disambiguate. 523 00:43:10,050 --> 00:43:14,860 Jadi 0x0 cara 0 perenambelasan, yang juga perpuluhan 0, binari 0. 524 00:43:14,860 --> 00:43:17,030 Ia hanya nilai 0. 525 00:43:17,030 --> 00:43:22,630 Ia ternyata bahawa ini adalah apa yang batal adalah, sebenarnya, dalam ingatan. 526 00:43:22,630 --> 00:43:25,940 Nol hanya 0. 527 00:43:25,940 --> 00:43:37,010 Di sini, elemen yang disimpan di argv [1] adalah batal. 528 00:43:37,010 --> 00:43:45,220 Jadi kita sedang berusaha untuk membandingkan "CS50 batu" tali untuk kami rentetan nol. 529 00:43:45,220 --> 00:43:48,130 Jadi dereferencing batal, cuba untuk mengakses perkara di null, 530 00:43:48,130 --> 00:43:55,050 mereka biasanya akan menyebabkan beberapa jenis kesalahan segmentasi atau lain-lain perkara-perkara buruk berlaku. 531 00:43:55,050 --> 00:43:59,350 Dan ternyata strcmp tidak memeriksa untuk melihat 532 00:43:59,350 --> 00:44:04,340 sama ada atau tidak anda telah diluluskan dalam nilai yang batal. 533 00:44:04,340 --> 00:44:06,370 Sebaliknya, ia hanya pergi ke hadapan, cuba untuk melakukan perkara, 534 00:44:06,370 --> 00:44:14,640 dan jika ia seg kesilapan, ia seg kesilapan, dan ia adalah masalah anda. Anda perlu pergi membaikinya. 535 00:44:14,640 --> 00:44:19,730 Benar-benar cepat, bagaimana kita boleh menyelesaikan masalah ini? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] Anda boleh menyemak menggunakan jika. 537 00:44:23,540 --> 00:44:32,240 Jadi jika argv [1] adalah batal, == 0, kemudian kembali 1, atau sesuatu [difahami]. 538 00:44:32,240 --> 00:44:34,590 >> Yeah. Jadi itulah salah satu cara terbaik untuk melakukannya, seperti yang kita boleh menyemak untuk melihat, 539 00:44:34,590 --> 00:44:39,230 nilai kita kira-kira untuk masuk ke dalam strcmp, argv [1], ia menyeimbangkan? 540 00:44:39,230 --> 00:44:45,830 Jika ia batal, maka kita boleh mengatakan okay, membatalkan. 541 00:44:45,830 --> 00:44:49,450 >> Satu cara yang lebih biasa untuk melakukan ini adalah untuk menggunakan nilai argc. 542 00:44:49,450 --> 00:44:52,040 Anda boleh lihat di sini pada awal utama, 543 00:44:52,040 --> 00:44:58,040 Kami tinggalkan bahawa ujian pertama yang kita biasanya lakukan apabila kita menggunakan hujah baris arahan, 544 00:44:58,040 --> 00:45:05,240 yang adalah untuk menguji sama ada atau tidak nilai argc kita adalah apa yang kita harapkan. 545 00:45:05,240 --> 00:45:10,290 Dalam kes ini, kita menjangkakan sekurang-kurangnya dua hujah, 546 00:45:10,290 --> 00:45:13,660 nama program ditambah satu lagi. 547 00:45:13,660 --> 00:45:17,140 Kerana kita berada kira-kira untuk menggunakan hujah kedua di sini. 548 00:45:17,140 --> 00:45:21,350 Jadi mempunyai beberapa jenis ujian terlebih dahulu, sebelum panggilan strcmp kita 549 00:45:21,350 --> 00:45:37,390 bahawa ujian sama ada atau tidak argv adalah sekurang-kurangnya 2, juga akan melakukan perkara yang sama perkara. 550 00:45:37,390 --> 00:45:40,620 Kita boleh melihat jika ia berfungsi dengan menjalankan program ini sekali lagi. 551 00:45:40,620 --> 00:45:45,610 Anda sentiasa boleh memulakan semula program anda dalam GDB, yang adalah benar-benar baik. 552 00:45:45,610 --> 00:45:49,310 Anda boleh menjalankan, dan apabila anda lulus dalam hujah untuk program anda, 553 00:45:49,310 --> 00:45:53,060 anda lulus mereka dalam apabila anda panggilan berjalan, bukan apabila anda boot GDB. 554 00:45:53,060 --> 00:45:57,120 Dengan cara itu anda boleh terus memohon program anda dengan hujah-hujah yang berbeza setiap kali. 555 00:45:57,120 --> 00:46:08,080 Jadi berlari, atau sekali lagi, saya boleh menaip r, dan mari kita lihat apa yang berlaku jika kita menaip "hello". 556 00:46:08,080 --> 00:46:11,140 Ia sentiasa akan meminta anda jika anda mahu untuk memulakan dari awal lagi. 557 00:46:11,140 --> 00:46:17,490 Biasanya, anda tidak mahu untuk memulakan dari awal lagi. 558 00:46:17,490 --> 00:46:25,010 Dan pada ketika ini, ia mula semula sekali lagi, ia mencetak keluar 559 00:46:25,010 --> 00:46:28,920 program bahawa kita sedang berjalan, buggy1, dengan hujah hello, 560 00:46:28,920 --> 00:46:32,720 dan ia mencetak ini keluar standard, ia berkata, "Anda mendapat D," wajah sedih. 561 00:46:32,720 --> 00:46:37,610 Tetapi kita tidak seg bersalah. Ia berkata proses itu keluar biasanya. 562 00:46:37,610 --> 00:46:39,900 Jadi yang kelihatan agak baik. 563 00:46:39,900 --> 00:46:43,050 Tiada kesalahan lebih seg, kita menjadikan ia lepas, 564 00:46:43,050 --> 00:46:48,190 jadi ia kelihatan seperti yang sememangnya seg pepijat kerosakan yang kita telah mendapat. 565 00:46:48,190 --> 00:46:51,540 Malangnya, ia memberitahu kita bahawa kita sedang mendapat D. 566 00:46:51,540 --> 00:46:54,090 >> Kita boleh kembali dan melihat kod dan lihat apa yang telah berlaku di sana 567 00:46:54,090 --> 00:46:57,980 untuk mengetahui apa - mengapa ia telah memberitahu kita bahawa kita mendapat D. 568 00:46:57,980 --> 00:47:03,690 Mari kita lihat, di sini ini printf mengatakan bahawa anda mendapat D. 569 00:47:03,690 --> 00:47:08,540 Jika kita menaip senarai, kerana anda menyimpan senarai menaip, ia terus iterating turun melalui program anda, 570 00:47:08,540 --> 00:47:10,940 jadi ia akan menunjukkan kepada anda beberapa baris pertama program anda. 571 00:47:10,940 --> 00:47:15,450 Kemudian ia akan menunjukkan kepada anda garis yang akan datang, dan sebahagian seterusnya dan sebahagian seterusnya. 572 00:47:15,450 --> 00:47:18,240 Dan ia akan terus mencuba untuk pergi ke. 573 00:47:18,240 --> 00:47:21,180 Dan sekarang kita akan mendapat "beratur nombor 16 adalah daripada pelbagai." 574 00:47:21,180 --> 00:47:23,940 Kerana ia hanya mempunyai 15 baris. 575 00:47:23,940 --> 00:47:30,310 Jika anda sampai ke tahap ini dan anda tertanya-tanya, "Apa yang saya lakukan?" anda boleh menggunakan arahan bantuan. 576 00:47:30,310 --> 00:47:34,340 Gunakan membantu dan kemudian memberikan ia nama arahan. 577 00:47:34,340 --> 00:47:36,460 Dan anda lihat GDB memberikan kita semua ini jenis barangan. 578 00:47:36,460 --> 00:47:43,870 Ia berkata, "Dengan hujah tiada, menyenaraikan sepuluh lagi baris selepas atau sekitar penyenaraian sebelumnya. 579 00:47:43,870 --> 00:47:47,920 Senarai - senarai sepuluh baris sebelum " 580 00:47:47,920 --> 00:47:52,960 Jadi mari kita cuba menggunakan tolak senarai. 581 00:47:52,960 --> 00:47:57,000 Dan yang menyenaraikan 10 baris sebelumnya; anda boleh bermain-main dengan senarai sedikit. 582 00:47:57,000 --> 00:48:02,330 Anda boleh melakukan senarai, senarai -, anda juga boleh memberi senarai nombor, seperti 8 senarai, 583 00:48:02,330 --> 00:48:07,500 dan ia akan menyenaraikan 10 baris sekitar 8 baris. 584 00:48:07,500 --> 00:48:10,290 Dan anda boleh melihat apa yang berlaku di sini anda telah mendapat mudah jika lain. 585 00:48:10,290 --> 00:48:13,980 Jika anda menaip di CS50 batu, ia mencetak keluar "Anda mendapat A." 586 00:48:13,980 --> 00:48:16,530 Jika tidak, ia mencetak keluar "Anda mendapat D." 587 00:48:16,530 --> 00:48:23,770 Bandar Bummer. Semua hak. Ya? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Jadi apabila saya cuba melakukan CS50 batu tanpa pengikat kata, 589 00:48:26,730 --> 00:48:29,290 ia mengatakan "Anda mendapat D." 590 00:48:29,290 --> 00:48:32,560 Saya memerlukan petikan untuk mendapatkannya untuk bekerja, mengapa? 591 00:48:32,560 --> 00:48:38,490 >> Yeah. Ia ternyata bahawa apabila - ini adalah satu lagi berita gembira sedikit menyeronokkan - 592 00:48:38,490 --> 00:48:47,900 apabila anda menjalankan program ini, jika kita menjalankan dan kita menaip CS50 batu, 593 00:48:47,900 --> 00:48:50,800 seperti Daniel mengatakan yang dia lakukan, dan anda menekan Enter, 594 00:48:50,800 --> 00:48:52,870 ia masih mengatakan kita mendapatkan D. 595 00:48:52,870 --> 00:48:55,580 Dan soalan itu, mengapa ini? 596 00:48:55,580 --> 00:49:02,120 Dan ternyata bahawa kedua-dua terminal kami dan GDB menghurai ini sebagai dua hujah yang berasingan. 597 00:49:02,120 --> 00:49:04,800 Kerana apabila ada ruang, itu tersirat sebagai 598 00:49:04,800 --> 00:49:08,730 hujah pertama berakhir pada tarikh tersebut; hujah seterusnya adalah kira-kira untuk memulakan. 599 00:49:08,730 --> 00:49:13,260 Cara untuk menggabungkan mereka kepada dua, atau maaf, ke dalam satu hujah, 600 00:49:13,260 --> 00:49:18,510 adalah dengan menggunakan petikan. 601 00:49:18,510 --> 00:49:29,560 Jadi sekarang, jika kita meletakkan ia dalam petikan dan berjalan sekali lagi, kita akan mendapat A. 602 00:49:29,560 --> 00:49:38,780 Jadi hanya untuk menggulung, tiada sebut, CS50 dan batu dihuraikan sebagai dua hujah berasingan. 603 00:49:38,780 --> 00:49:45,320 Dengan memetik, ia dihuraikan sebagai salah satu hujah sama sekali. 604 00:49:45,320 --> 00:49:53,070 >> Kita dapat lihat ini dengan titik putus. 605 00:49:53,070 --> 00:49:54,920 Setakat ini kita telah menjalankan program kami, dan ia telah berjalan 606 00:49:54,920 --> 00:49:58,230 sehingga sama ada ia seg kesilapan atau hits ralat 607 00:49:58,230 --> 00:50:05,930 atau sehingga ia telah keluar dan semua telah benar-benar halus. 608 00:50:05,930 --> 00:50:08,360 Ini tidak semestinya perkara yang paling berguna, kerana kadang-kadang 609 00:50:08,360 --> 00:50:11,840 anda mempunyai kesilapan dalam program anda, tetapi ia tidak menyebabkan kerosakan segmentasi. 610 00:50:11,840 --> 00:50:16,950 Ia tidak menyebabkan program anda untuk berhenti atau apa-apa seperti itu. 611 00:50:16,950 --> 00:50:20,730 Cara untuk mendapatkan GDB untuk menjedakan program anda pada satu titik tertentu 612 00:50:20,730 --> 00:50:23,260 adalah untuk menetapkan titik putus. 613 00:50:23,260 --> 00:50:26,520 Anda boleh melakukan ini dengan menetapkan titik putus pada nama fungsi 614 00:50:26,520 --> 00:50:30,770 atau anda boleh menetapkan titik putus on-line kod tertentu. 615 00:50:30,770 --> 00:50:34,450 Saya suka untuk menetapkan titik putus pada nama fungsi, kerana - mudah untuk diingati, 616 00:50:34,450 --> 00:50:37,700 dan jika anda benar-benar pergi dan mengubah kod sumber anda sehingga sedikit, 617 00:50:37,700 --> 00:50:42,020 maka titik putus anda sebenarnya akan tinggal di tempat yang sama dalam kod anda. 618 00:50:42,020 --> 00:50:44,760 Manakala jika anda menggunakan nombor baris, dan nombor talian menukar 619 00:50:44,760 --> 00:50:51,740 kerana anda menambah atau memadam beberapa kod, maka titik putus anda semua benar-benar diskrukan sehingga. 620 00:50:51,740 --> 00:50:58,590 Salah satu perkara yang paling biasa saya lakukan adalah menetapkan titik putus pada fungsi utama. 621 00:50:58,590 --> 00:51:05,300 Selalunya saya akan boot GDB, saya akan menaip b utama, tekan Enter, dan yang akan menetapkan titik putus 622 00:51:05,300 --> 00:51:10,630 kepada fungsi utama yang hanya berkata, "Berhenti Seketika program secepat anda mula berjalan," 623 00:51:10,630 --> 00:51:17,960 dan dengan cara itu, apabila saya menjalankan program saya dengan, katakan, CS50 batu sebagai dua hujah 624 00:51:17,960 --> 00:51:24,830 dan tekan Enter, ia mendapat ke fungsi utama dan ia berhenti betul-betul di baris pertama, 625 00:51:24,830 --> 00:51:30,620 betul sebelum ia menilai fungsi strcmp. 626 00:51:30,620 --> 00:51:34,940 >> Sejak saya dijeda, sekarang saya boleh mula mucking sekitar dan melihat apa yang berlaku di 627 00:51:34,940 --> 00:51:40,250 dengan semua pembolehubah yang berbeza yang diluluskan ke dalam program saya. 628 00:51:40,250 --> 00:51:43,670 Sini saya boleh mencetak argc dan lihat apa yang berlaku. 629 00:51:43,670 --> 00:51:50,030 Lihat bahawa argc ialah 3, kerana ia mendapat 3 nilai-nilai yang berbeza di dalamnya. 630 00:51:50,030 --> 00:51:54,060 Ia mendapat nama program, ia mendapat hujah pertama dan hujah kedua. 631 00:51:54,060 --> 00:52:09,330 Kita boleh mencetak mereka keluar dengan melihat argv [0], argv [1], dan argv [2]. 632 00:52:09,330 --> 00:52:12,030 Jadi sekarang anda juga boleh melihat mengapa ini panggilan strcmp akan gagal, 633 00:52:12,030 --> 00:52:21,650 kerana anda melihat bahawa ia tidak berpecah CS50 dan batu kepada dua hujah yang berasingan. 634 00:52:21,650 --> 00:52:27,250 Pada ketika ini, apabila anda telah melanda titik putus satu, anda boleh terus melangkah melalui program anda 635 00:52:27,250 --> 00:52:32,920 baris demi baris, berbanding untuk memulakan program anda sekali lagi. 636 00:52:32,920 --> 00:52:35,520 Jadi jika anda tidak mahu untuk memulakan program anda sekali lagi dan hanya terus dari sini, 637 00:52:35,520 --> 00:52:41,970 anda boleh menggunakan arahan terus dan terus akan menjalankan program hingga akhir. 638 00:52:41,970 --> 00:52:45,010 Sama seperti ia lakukan di sini. 639 00:52:45,010 --> 00:52:54,880 Walau bagaimanapun, jika saya memulakan semula program, CS50 batu, ia mencecah titik putus saya sekali lagi, 640 00:52:54,880 --> 00:52:59,670 dan kali ini, jika saya tidak mahu hanya pergi sepanjang jalan melalui sepanjang program, 641 00:52:59,670 --> 00:53:08,040 Saya boleh menggunakan arahan seterusnya, yang saya juga menyingkatkan dengan n. 642 00:53:08,040 --> 00:53:12,960 Dan ini akan melangkah melalui talian program demi baris. 643 00:53:12,960 --> 00:53:17,530 Jadi, anda boleh menonton sebagai perkara melaksanakan, sebagai perubahan pembolehubah, sebagai perkara mendapatkan dikemaskini. 644 00:53:17,530 --> 00:53:21,550 Yang cukup baik. 645 00:53:21,550 --> 00:53:26,570 Perkara yang sejuk lain adalah bukannya mengulangi arahan yang sama lebih dan lebih dan lebih lagi, 646 00:53:26,570 --> 00:53:30,670 jika anda hanya tekan Enter - jadi di sini anda lihat Saya tidak ditaip dalam apa-apa - 647 00:53:30,670 --> 00:53:33,780 jika saya hanya tekan Enter, ia akan mengulangi arahan sebelumnya, 648 00:53:33,780 --> 00:53:36,900 atau arahan GDB sebelumnya bahawa saya hanya meletakkan masuk 649 00:53:36,900 --> 00:53:56,000 Saya boleh menyimpan memukul Masukkan dan ia akan terus melangkah melalui talian kod saya demi baris. 650 00:53:56,000 --> 00:53:59,310 Saya akan menggalakkan anda semua untuk pergi menyemak program kereta lain juga. 651 00:53:59,310 --> 00:54:01,330 Kami tidak mempunyai masa untuk mendapatkan melalui semua daripada mereka hari ini dalam seksyen. 652 00:54:01,330 --> 00:54:05,890 Kod sumber yang ada, jadi anda boleh jenis lihat apa yang berlaku di 653 00:54:05,890 --> 00:54:07,730 di sebalik tabir jika anda mendapat benar-benar terperangkap, 654 00:54:07,730 --> 00:54:11,940 tetapi sekurang-kurangnya, hanya amalan boot sehingga GDB, 655 00:54:11,940 --> 00:54:13,940 menjalankan program ini sehingga ia pecah pada anda, 656 00:54:13,940 --> 00:54:18,260 mendapatkan jejakundur, memikirkan apa berfungsi kemalangan itu berada di, 657 00:54:18,260 --> 00:54:24,450 apa garis ia berada di atas, mencetak beberapa nilai pembolehubah, 658 00:54:24,450 --> 00:54:30,140 hanya supaya anda mendapatkan rasa untuk itu, kerana yang benar-benar akan membantu anda di masa hadapan. 659 00:54:30,140 --> 00:54:36,340 Pada ketika ini, kita akan berhenti keluar GDB, yang anda lakukan menggunakan berhenti atau hanya q. 660 00:54:36,340 --> 00:54:40,460 Jika program anda adalah di tengah-tengah berjalan masih, dan ia tidak keluar, 661 00:54:40,460 --> 00:54:43,510 ia sentiasa akan bertanya anda, "Adakah anda pasti anda benar-benar mahu berhenti?" 662 00:54:43,510 --> 00:54:48,770 Anda hanya boleh memukul ya. 663 00:54:48,770 --> 00:54:55,250 >> Sekarang kita akan melihat masalah seterusnya yang kita ada, yang merupakan program kucing. 664 00:54:55,250 --> 00:54:59,880 Jika anda menonton pendek mengalihkan dan paip, anda akan melihat bahawa Tommy menggunakan program ini 665 00:54:59,880 --> 00:55:07,540 yang pada asasnya mencetak semua output fail ke skrin. 666 00:55:07,540 --> 00:55:12,660 Jadi jika saya berjalan kucing, ini adalah sebenarnya satu program yang terbina dalam untuk perkakas, 667 00:55:12,660 --> 00:55:16,860 dan jika anda mempunyai Mac, anda boleh lakukan ini pada Mac anda juga, jika anda membuka terminal. 668 00:55:16,860 --> 00:55:25,630 Dan kita - kucing, katakan, cp.c, dan tekan Enter. 669 00:55:25,630 --> 00:55:29,640 Apakah ini lakukan, jika kita tatal ke atas sedikit dan melihat di mana kita berlari baris, 670 00:55:29,640 --> 00:55:40,440 atau di mana kita berlari arahan kucing, ia benar-benar hanya dicetak kandungan cp.c ke skrin kami. 671 00:55:40,440 --> 00:55:44,140 Kita boleh berjalan lagi dan anda boleh dimasukkan ke dalam beberapa fail bersama-sama. 672 00:55:44,140 --> 00:55:49,880 Jadi anda boleh melakukan cp.c kucing, dan kemudian kita juga boleh menyatukan fail cat.c, 673 00:55:49,880 --> 00:55:53,250 yang merupakan program yang kami kira-kira untuk menulis, 674 00:55:53,250 --> 00:55:58,140 dan ia akan mencetak kedua-dua fail kembali untuk kembali ke skrin kami. 675 00:55:58,140 --> 00:56:05,490 Jadi, jika kita tatal sedikit, kita lihat bahawa apabila kita berlari ini cp.c kucing, cat.c, 676 00:56:05,490 --> 00:56:17,110 pertama ia dicetak fail cp, dan kemudian di bawah, ia dicetak keluar fail cat.c sampai di sini. 677 00:56:17,110 --> 00:56:19,650 Kami akan menggunakan ini untuk hanya mendapat kaki kita basah. 678 00:56:19,650 --> 00:56:25,930 Bermain-main dengan percetakan mudah ke terminal, lihat bagaimana ia berfungsi. 679 00:56:25,930 --> 00:56:39,170 Jika anda semua membuka dengan gedit cat.c, tekan Enter, 680 00:56:39,170 --> 00:56:43,760 anda boleh lihat program yang kami kira-kira untuk menulis. 681 00:56:43,760 --> 00:56:48,980 Kami telah dimasukkan ini plat dandang bagus, jadi kita tidak perlu menghabiskan masa menaip semua itu. 682 00:56:48,980 --> 00:56:52,310 Kami juga memeriksa bilangan hujah berlalu masuk 683 00:56:52,310 --> 00:56:56,910 Kami mencetak mesej penggunaan bagus. 684 00:56:56,910 --> 00:57:00,950 >> Ini adalah jenis perkara itu, sekali lagi, seperti yang kita telah bercakap tentang, 685 00:57:00,950 --> 00:57:04,490 ia hampir seperti memori otot. 686 00:57:04,490 --> 00:57:07,190 Hanya ingat untuk terus melakukan perkara yang sama barangan 687 00:57:07,190 --> 00:57:11,310 dan sentiasa mencetak beberapa jenis mesej berguna 688 00:57:11,310 --> 00:57:17,670 supaya orang tahu bagaimana untuk menjalankan program anda. 689 00:57:17,670 --> 00:57:21,630 Dengan kucing, ia agak mudah, kita hanya akan pergi melalui semua hujah-hujah yang berbeza 690 00:57:21,630 --> 00:57:24,300 yang telah diluluskan untuk program kami, dan kita pergi untuk mencetak 691 00:57:24,300 --> 00:57:29,950 kandungannya keluar satu skrin pada satu masa. 692 00:57:29,950 --> 00:57:35,670 Untuk mencetak fail ke skrin, kita akan melakukan sesuatu yang sangat serupa 693 00:57:35,670 --> 00:57:38,120 kepada apa yang kita lakukan pada akhir kuiz. 694 00:57:38,120 --> 00:57:45,350 Pada akhir kuiz, yang mengupah program, kita terpaksa untuk membuka fail, 695 00:57:45,350 --> 00:57:48,490 dan kemudian kita terpaksa untuk mencetak ia. 696 00:57:48,490 --> 00:57:54,660 Dalam kes ini, kami akan membuka fail, dan kita akan membaca dari ia sebaliknya. 697 00:57:54,660 --> 00:58:00,630 Kemudian kita pergi untuk mencetak, bukannya ke fail, kita pergi untuk mencetak skrin. 698 00:58:00,630 --> 00:58:05,830 Jadi percetakan skrin anda semua telah dilakukan sebelum dengan printf. 699 00:58:05,830 --> 00:58:08,290 Supaya tidak terlalu gila. 700 00:58:08,290 --> 00:58:12,190 Tetapi membaca fail adalah jenis pelik. 701 00:58:12,190 --> 00:58:17,300 Kami akan pergi melalui yang sedikit pada satu masa. 702 00:58:17,300 --> 00:58:20,560 Jika anda semua kembali kepada masalah yang terakhir pada kuiz, anda masalah 33, 703 00:58:20,560 --> 00:58:27,280 baris pertama yang kita akan lakukan di sini, membuka fail, adalah amat serupa dengan apa yang kita lakukan di sana. 704 00:58:27,280 --> 00:58:36,370 Jadi Stella, apakah yang kelihatan selaras seperti, apabila kita membuka fail? 705 00:58:36,370 --> 00:58:47,510 [Stella] Modal FILE *, Fail - >> Okay. >> - Adalah sama dengan fopen. >> Yup. 706 00:58:47,510 --> 00:58:55,980 Yang dalam kes ini? Ia adalah dalam komen. 707 00:58:55,980 --> 00:59:06,930 >> Ia adalah dalam komen? argv [i] dan r? 708 00:59:06,930 --> 00:59:11,300 >> Tepat sekali. Right on. Jadi Stella adalah benar-benar betul. 709 00:59:11,300 --> 00:59:13,720 Ini adalah apa yang kelihatan seperti garis. 710 00:59:13,720 --> 00:59:19,670 Kami akan mendapatkan pemboleh ubah fail sungai, menyimpannya * FILE, jadi semua topi, 711 00:59:19,670 --> 00:59:25,720 FILE, *, dan nama pembolehubah ini akan fail. 712 00:59:25,720 --> 00:59:32,250 Kita boleh memanggilnya apa sahaja yang kita suka. Kita boleh memanggil ia first_file, atau file_i, apa sahaja yang kita ingin. 713 00:59:32,250 --> 00:59:37,590 Dan kemudian nama fail telah diluluskan di atas baris arahan untuk program ini. 714 00:59:37,590 --> 00:59:44,450 Jadi ia disimpan di dalam argv [i] dan kemudian kita pergi untuk membuka fail ini dalam mod membaca. 715 00:59:44,450 --> 00:59:48,100 Sekarang kita telah membuka fail, apakah perkara yang kita sentiasa perlu ingat untuk melakukan 716 00:59:48,100 --> 00:59:52,230 apabila kita telah membuka fail? Menutupnya. 717 00:59:52,230 --> 00:59:57,220 Jadi Missy, bagaimana kita menutup fail? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (fail) >> fclose (fail). Tepat sekali. 719 01:00:01,020 --> 01:00:05,340 Besar. Okay. Jika kita melihat ini untuk melakukan komen di sini, 720 01:00:05,340 --> 01:00:11,940 ia berkata, "Terbuka argv [i] dan mencetak kandungannya ke stdout." 721 01:00:11,940 --> 01:00:15,460 >> Keluar Standard adalah nama yang pelik. Stdout adalah hanya cara untuk kami mengucapkan 722 01:00:15,460 --> 01:00:22,880 kita ingin mencetak ke terminal; kita ingin mencetak kepada aliran output standard. 723 01:00:22,880 --> 01:00:26,450 Kita sebenarnya boleh menyingkirkan komen ini di sini. 724 01:00:26,450 --> 01:00:36,480 Saya akan salin dan tampalkannya kerana itulah apa yang kita lakukan. 725 01:00:36,480 --> 01:00:41,290 Pada ketika ini, sekarang kita perlu membaca sedikit fail demi sedikit. 726 01:00:41,290 --> 01:00:46,300 Kami telah membincangkan beberapa cara fail membaca. 727 01:00:46,300 --> 01:00:51,830 Yang mana adalah kegemaran anda setakat ini? 728 01:00:51,830 --> 01:00:57,960 Yang cara telah anda dilihat atau adakah anda ingat, untuk membaca fail? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? >> Fread? Jadi fread adalah salah. Jimmy, adakah anda tahu mana-mana orang lain? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] No >> Okay. Nope. Charlotte? Alexander? Mana-mana orang lain? Okay. 731 01:01:12,150 --> 01:01:20,740 Jadi yang lain adalah fgetc, salah satu yang kita akan menggunakan banyak. 732 01:01:20,740 --> 01:01:26,410 Terdapat juga fscanf; kalian melihat corak di sini? 733 01:01:26,410 --> 01:01:29,170 Mereka semua bermula dengan f. Apa-apa kaitan dengan fail. 734 01:01:29,170 --> 01:01:35,260 Ada fread, fgetc, fscanf. Ini semua adalah fungsi membaca. 735 01:01:35,260 --> 01:01:49,120 Untuk penulisan kita mempunyai fwrite, kita mempunyai fputc bukannya fgetc. 736 01:01:49,120 --> 01:01:58,250 Kami juga telah fprintf seperti yang kita lihat pada kuiz. 737 01:01:58,250 --> 01:02:01,680 Sejak ini adalah satu masalah yang melibatkan membaca dari fail, 738 01:02:01,680 --> 01:02:04,940 kita akan menggunakan salah satu daripada ketiga-tiga fungsi. 739 01:02:04,940 --> 01:02:10,890 Kami tidak akan menggunakan fungsi-fungsi ini ke sini. 740 01:02:10,890 --> 01:02:14,880 Fungsi-fungsi ini semua didapati di perpustakaan standard I / O. 741 01:02:14,880 --> 01:02:17,510 Jadi, jika anda melihat di atas program ini, 742 01:02:17,510 --> 01:02:24,110 anda boleh melihat bahawa kita sudah termasuk fail header for perpustakaan standard I / O. 743 01:02:24,110 --> 01:02:27,120 Jika kita mahu memikirkan yang mana satu yang kita mahu menggunakan, 744 01:02:27,120 --> 01:02:29,690 kita sentiasa boleh membuka halaman lelaki. 745 01:02:29,690 --> 01:02:34,350 Jadi, kita boleh menaip stdio lelaki 746 01:02:34,350 --> 01:02:43,180 dan membaca semua tentang input stdio dan fungsi output dalam C. 747 01:02:43,180 --> 01:02:49,870 Dan kita sudah boleh lihat oh, melihat. Ia menyebut fgetc, ia menyebut fputc. 748 01:02:49,870 --> 01:02:57,220 Jadi, anda boleh mengesan sedikit dan melihat, berkata, fgetc 749 01:02:57,220 --> 01:03:00,060 dan melihat halaman lelaki. 750 01:03:00,060 --> 01:03:03,430 Anda boleh melihat bahawa ia pergi bersama-sama dengan sekumpulan keseluruhan fungsi-fungsi lain: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, mendapat, ungetc, dan input aksara dan rentetan. 752 01:03:12,640 --> 01:03:19,180 Jadi ini adalah bagaimana kita membaca dalam aksara dan rentetan dari fail daripada input standard, 753 01:03:19,180 --> 01:03:21,990 yang asasnya adalah dari pengguna. 754 01:03:21,990 --> 01:03:24,780 Dan ini ialah bagaimana kita melakukannya dalam C. sebenar 755 01:03:24,780 --> 01:03:30,850 Jadi ini tidak menggunakan GetString dan fungsi GetChar 756 01:03:30,850 --> 01:03:36,840 bahawa kita digunakan dari perpustakaan CS50. 757 01:03:36,840 --> 01:03:39,710 Kami akan melakukan masalah ini dalam beberapa cara 758 01:03:39,710 --> 01:03:43,430 supaya anda boleh melihat dua cara yang berbeza untuk melakukannya. 759 01:03:43,430 --> 01:03:48,490 Kedua-dua fungsi fread bahawa Daniel disebut dan fgetc adalah cara yang baik untuk melakukannya. 760 01:03:48,490 --> 01:03:53,790 Saya fikir fgetc adalah sedikit lebih mudah, kerana ia hanya mempunyai, seperti yang anda lihat, 761 01:03:53,790 --> 01:03:59,660 satu hujah, * FAIL bahawa kita sedang cuba untuk membaca watak dari, 762 01:03:59,660 --> 01:04:02,740 dan nilai pulangan adalah int. 763 01:04:02,740 --> 01:04:05,610 Dan ini adalah sedikit mengelirukan, kanan? 764 01:04:05,610 --> 01:04:11,450 >> Kerana kita sedang mendapat watak, jadi mengapa tidak penyata ini char? 765 01:04:11,450 --> 01:04:18,700 Anda lelaki itu mempunyai apa-apa idea mengapa ini tidak mungkin kembali char? 766 01:04:18,700 --> 01:04:25,510 [Jawapan Missy, difahami] >> Yeah. Jadi Missy adalah benar-benar betul. 767 01:04:25,510 --> 01:04:31,570 Jika ia adalah ASCII, maka integer ini boleh dipetakan kepada char sebenar. 768 01:04:31,570 --> 01:04:33,520 Boleh menjadi aksara ASCII, dan yang betul. 769 01:04:33,520 --> 01:04:36,220 Itulah apa yang berlaku. 770 01:04:36,220 --> 01:04:39,190 Kami menggunakan int semata-mata kerana ia mempunyai lebih bit. 771 01:04:39,190 --> 01:04:44,750 Ia lebih besar daripada char; char kita hanya mempunyai 8 bit, yang 1 bait pada mesin 32-bit kami. 772 01:04:44,750 --> 01:04:48,520 Dan int mempunyai bernilai semua 4 bait ruang. 773 01:04:48,520 --> 01:04:50,940 Dan ternyata bahawa cara fgetc berfungsi, 774 01:04:50,940 --> 01:04:53,940 jika kita tatal ke bawah dalam sinopsis kami di halaman lelaki ini sedikit, 775 01:04:53,940 --> 01:05:05,000 tatal sepanjang jalan ke bawah. Ia ternyata bahawa mereka menggunakan nilai ini khas dipanggil EOF. 776 01:05:05,000 --> 01:05:09,640 Ia adalah satu pemalar istimewa kerana nilai pulangan fungsi fgetc 777 01:05:09,640 --> 01:05:14,570 apabila anda melanda akhir fail atau jika anda mendapat mesej ralat. 778 01:05:14,570 --> 01:05:18,170 Dan ternyata bahawa untuk melakukan perbandingan dengan EOF betul, 779 01:05:18,170 --> 01:05:24,060 anda mahu mempunyai bahawa jumlah tambahan maklumat yang anda ada dalam int 780 01:05:24,060 --> 01:05:28,420 berbanding untuk menggunakan pembolehubah char. 781 01:05:28,420 --> 01:05:32,130 Walaupun fgetc berkesan mendapat watak dari fail, 782 01:05:32,130 --> 01:05:38,450 anda mahu ingat bahawa ia mengembalikan sesuatu yang int jenis kepada anda. 783 01:05:38,450 --> 01:05:41,360 Yang berkata, ia adalah agak mudah untuk digunakan. 784 01:05:41,360 --> 01:05:44,960 Ia akan memberi kita watak, jadi semua yang perlu kita lakukan adalah terus bertanya fail, 785 01:05:44,960 --> 01:05:48,440 "Berikan saya watak seterusnya, memberikan saya watak seterusnya, memberikan saya watak seterusnya," 786 01:05:48,440 --> 01:05:51,400 sehingga kita sampai ke akhir fail. 787 01:05:51,400 --> 01:05:54,730 Dan yang akan menarik dalam satu aksara pada masa yang daripada fail kita, 788 01:05:54,730 --> 01:05:56,250 dan kemudian kita boleh melakukan apa sahaja yang kita suka dengan ia. 789 01:05:56,250 --> 01:06:00,160 Kami boleh menyimpan, kita boleh menambah kepada rentetan, kita boleh mencetak keluar. 790 01:06:00,160 --> 01:06:04,630 Melakukan apa-apa itu. 791 01:06:04,630 --> 01:06:09,600 >> Zoom kembali keluar dan akan kembali program cat.c kami, 792 01:06:09,600 --> 01:06:16,170 jika kita pergi menggunakan fgetc, 793 01:06:16,170 --> 01:06:21,710 bagaimana kita mungkin pendekatan ini selaras seterusnya kod? 794 01:06:21,710 --> 01:06:26,020 Kami akan menggunakan - fread akan melakukan sesuatu yang sedikit berbeza. 795 01:06:26,020 --> 01:06:32,600 Dan kali ini, kami hanya akan menggunakan fgetc untuk mendapatkan satu aksara pada satu masa. 796 01:06:32,600 --> 01:06:40,910 Untuk memproses fail keseluruhan, apa yang kita perlu lakukan? 797 01:06:40,910 --> 01:06:44,030 Berapa banyak watak-watak yang terdapat dalam satu fail? 798 01:06:44,030 --> 01:06:47,390 Terdapat banyak. Jadi, anda mungkin mahu untuk mendapatkan satu 799 01:06:47,390 --> 01:06:49,860 dan kemudian mendapatkan lain dan mendapat satu lagi dan mendapatkan yang lain. 800 01:06:49,860 --> 01:06:53,330 Apakah jenis algoritma adakah anda fikir kita mungkin perlu menggunakan di sini? 801 01:06:53,330 --> 01:06:55,470 Apakah jenis -? [Alexander] A untuk gelung? >> Tepat sekali. 802 01:06:55,470 --> 01:06:57,500 Beberapa jenis gelung. 803 01:06:57,500 --> 01:07:03,380 A bagi gelung adalah sebenarnya besar, dalam kes ini. 804 01:07:03,380 --> 01:07:08,620 Dan seperti anda berkata, ia kedengaran seperti anda mahu gelung seluruh fail, 805 01:07:08,620 --> 01:07:11,820 mendapatkan watak pada satu-satu masa. 806 01:07:11,820 --> 01:07:13,850 Mana-mana cadangan mengenai apa yang mungkin kelihatan seperti? 807 01:07:13,850 --> 01:07:22,090 [Alexander, difahami] 808 01:07:22,090 --> 01:07:30,050 >> Okay, hanya beritahu saya dalam Bahasa Inggeris apa yang anda cuba lakukan? [Alexander, difahami] 809 01:07:30,050 --> 01:07:36,270 Jadi dalam kes ini, ia kedengaran seperti kita hanya cuba untuk gelung seluruh fail. 810 01:07:36,270 --> 01:07:45,330 [Alexander] Jadi i > Saiz -? 811 01:07:45,330 --> 01:07:49,290 Saya rasa saiz fail, kan? Saiz - we'll hanya menulis seperti ini. 812 01:07:49,290 --> 01:07:57,470 Saiz fail pada masa itu, i + +. 813 01:07:57,470 --> 01:08:04,610 Jadi ia ternyata bahawa cara anda ini menggunakan fgetc, dan ini adalah baru, 814 01:08:04,610 --> 01:08:10,460 adalah bahawa tidak ada cara mudah untuk hanya mendapatkan saiz fail 815 01:08:10,460 --> 01:08:16,979 dengan jenis ini "sizeof" membina bahawa anda telah melihat sebelum ini. 816 01:08:16,979 --> 01:08:20,910 Apabila kita menggunakan bahawa fungsi fgetc, kita memperkenalkan beberapa jenis 817 01:08:20,910 --> 01:08:29,069 baru, sintaksis funky ini untuk gelung, di mana dan bukannya menggunakan hanya kaunter asas 818 01:08:29,069 --> 01:08:33,920 untuk pergi watak oleh watak, kita akan tarik satu aksara pada satu masa, 819 01:08:33,920 --> 01:08:37,120 satu aksara pada satu masa, dan cara kita tahu kita berada di akhir 820 01:08:37,120 --> 01:08:41,290 tidak apabila kita telah dikira bilangan tertentu aksara, 821 01:08:41,290 --> 01:08:49,939 tetapi apabila watak kita tarik keluar adalah bahawa akhir khas watak fail. 822 01:08:49,939 --> 01:08:58,689 Jadi kita boleh lakukan ini dengan - saya panggil ch ini, dan kita akan memulakan 823 01:08:58,689 --> 01:09:08,050 dengan panggilan pertama kami untuk mendapatkan watak pertama daripada fail. 824 01:09:08,050 --> 01:09:14,979 Jadi bahagian ini di sini, ini akan mendapatkan watak keluar fail 825 01:09:14,979 --> 01:09:20,840 dan menyimpannya ke ch pembolehubah. 826 01:09:20,840 --> 01:09:25,420 Kami akan terus berbuat demikian sehingga kita sampai ke akhir fail, 827 01:09:25,420 --> 01:09:41,170 yang kita lakukan dengan ujian untuk watak tidak sama dengan watak EOF yang istimewa. 828 01:09:41,170 --> 01:09:48,750 Dan kemudian bukannya melakukan ch + +, yang hanya akan kenaikan nilai, 829 01:09:48,750 --> 01:09:52,710 jadi jika kita membaca keluar fail, modal A berkata, 830 01:09:52,710 --> 01:09:56,810 ch + + akan memberikan kita b, dan kemudian kita akan mendapatkan c dan kemudian d. 831 01:09:56,810 --> 01:09:59,310 Itu jelas tidak apa yang kita mahu. Apa yang kita mahu di sini 832 01:09:59,310 --> 01:10:05,830 dalam sedikit terakhir ini kita mahu mendapatkan watak seterusnya dari fail. 833 01:10:05,830 --> 01:10:09,500 >> Jadi bagaimana kita boleh mendapatkan watak seterusnya dari fail? 834 01:10:09,500 --> 01:10:13,470 Bagaimana kita mendapatkan watak pertama dari fail? 835 01:10:13,470 --> 01:10:17,200 [Pelajar] fgetfile? Fgetc >>, atau, maaf, anda benar-benar betul. 836 01:10:17,200 --> 01:10:20,470 Saya silap eja betul di sana. Jadi yeah. 837 01:10:20,470 --> 01:10:26,240 Di sini bukannya melakukan ch + +, 838 01:10:26,240 --> 01:10:29,560 kita hanya akan memanggil fgetc (file) sekali lagi 839 01:10:29,560 --> 01:10:39,180 dan menyimpan hasil dalam pembolehubah ch sama kami. 840 01:10:39,180 --> 01:10:43,730 [Pelajar soalan, difahami] 841 01:10:43,730 --> 01:10:52,390 >> Ini adalah di mana lelaki ini * FILE yang istimewa. 842 01:10:52,390 --> 01:10:59,070 Cara mereka bekerja adalah mereka - apabila anda pertama kali membuka - apabila anda mula-mula membuat panggilan fopen, 843 01:10:59,070 --> 01:11:04,260 * FILE berkesan berfungsi sebagai penunjuk kepada permulaan fail. 844 01:11:04,260 --> 01:11:12,830 Dan kemudian setiap kali anda memanggil fgetc, ia bergerak satu watak melalui fail. 845 01:11:12,830 --> 01:11:23,280 Jadi apabila anda memanggil ini, anda incrementing penunjuk fail oleh satu watak. 846 01:11:23,280 --> 01:11:26,210 Dan apabila anda fgetc semula, anda bergerak watak lain 847 01:11:26,210 --> 01:11:28,910 dan satu lagi watak dan satu lagi watak dan watak lain. 848 01:11:28,910 --> 01:11:32,030 [Pelajar soalan, difahami] >> Dan that's - yeah. 849 01:11:32,030 --> 01:11:34,810 Ia adalah jenis sihir ini di bawah hood. 850 01:11:34,810 --> 01:11:37,930 Anda hanya menyimpan incrementing melalui. 851 01:11:37,930 --> 01:11:46,510 Pada ketika ini, anda mampu untuk benar-benar bekerja dengan watak. 852 01:11:46,510 --> 01:11:52,150 Jadi bagaimana kita boleh mencetak ini keluar ke skrin, sekarang? 853 01:11:52,150 --> 01:11:58,340 Kita boleh menggunakan perkara yang sama printf yang kita digunakan sebelum. 854 01:11:58,340 --> 01:12:00,330 Bahawa kita telah menggunakan semua semester. 855 01:12:00,330 --> 01:12:05,450 Kita boleh memanggil printf, 856 01:12:05,450 --> 01:12:21,300 dan kita boleh lulus dalam watak seperti itu. 857 01:12:21,300 --> 01:12:27,430 Satu lagi cara untuk melakukannya adalah bukannya menggunakan printf dan perlu melakukan ini rentetan format, 858 01:12:27,430 --> 01:12:29,490 kita juga boleh menggunakan salah satu daripada fungsi-fungsi lain. 859 01:12:29,490 --> 01:12:40,090 Kita boleh menggunakan fputc, yang mencetak watak skrin, 860 01:12:40,090 --> 01:12:52,580 kecuali jika kita melihat fputc - izinkan saya mengezum keluar sedikit. 861 01:12:52,580 --> 01:12:56,430 Kita lihat apa yang baik ialah ia mengambil watak yang kita baca dengan menggunakan fgetc, 862 01:12:56,430 --> 01:13:05,100 tetapi kemudian kita perlu memberikan aliran untuk mencetak. 863 01:13:05,100 --> 01:13:11,850 Kita juga boleh menggunakan fungsi putchar, yang akan meletakkan terus keluar standard. 864 01:13:11,850 --> 01:13:16,070 Jadi, terdapat sejumlah besar pilihan yang berbeza yang boleh kita gunakan untuk mencetak. 865 01:13:16,070 --> 01:13:19,580 Mereka semua di perpustakaan standard I / O. 866 01:13:19,580 --> 01:13:25,150 Apabila anda mahu mencetak - jadi printf, secara lalai, akan mencetak kepada standard khas keluar aliran, 867 01:13:25,150 --> 01:13:27,910 yang adalah bahawa stdout. 868 01:13:27,910 --> 01:13:41,300 Jadi kita hanya boleh merujuk kepada sebagai jenis nilai ini sihir, stdout di sini. 869 01:13:41,300 --> 01:13:48,410 Oops. Letakkan koma bernoktah di luar. 870 01:13:48,410 --> 01:13:52,790 >> Ini adalah banyak maklumat baru, 'funky' di sini. 871 01:13:52,790 --> 01:13:58,600 Banyak ini adalah sangat simpulan bahasa, dalam erti kata bahawa ini adalah kod 872 01:13:58,600 --> 01:14:05,700 yang ditulis cara ini hanya kerana ia adalah bersih membaca, mudah untuk dibaca. 873 01:14:05,700 --> 01:14:11,520 Terdapat banyak cara yang berbeza untuk melakukannya, banyak fungsi yang berbeza yang anda boleh gunakan, 874 01:14:11,520 --> 01:14:14,680 tetapi kita cenderung untuk hanya mengikuti pola-pola yang sama berulang-ulang. 875 01:14:14,680 --> 01:14:20,180 Jadi jangan terkejut jika anda melihat kod seperti ini datang lagi dan lagi. 876 01:14:20,180 --> 01:14:25,690 Semua hak. Pada ketika ini, kita perlu untuk memecahkan untuk hari tersebut. 877 01:14:25,690 --> 01:14:31,300 Terima kasih kerana datang. Terima kasih untuk menonton jika anda berada dalam talian. Dan kita akan melihat anda minggu depan. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]