1 00:00:00,000 --> 00:00:07,810 2 00:00:07,810 --> 00:00:09,840 >> JASON HIRSCHHORN: Bem-vindo, todos, a Semana 6. 3 00:00:09,840 --> 00:00:14,790 Estou feliz em vê-lo todos vivos e bem depois quiz 0, porque eu sei que 4 00:00:14,790 --> 00:00:15,810 foi um pouco difícil. 5 00:00:15,810 --> 00:00:18,370 Mas, felizmente, todos vocês fez muito bem. 6 00:00:18,370 --> 00:00:21,680 E assim que é maravilhoso. 7 00:00:21,680 --> 00:00:25,840 Se você está na minha seção, eu dei mais de você faça seus testes já. 8 00:00:25,840 --> 00:00:28,050 >> Um casal de você, vou me encontrar depois da aula. 9 00:00:28,050 --> 00:00:32,360 E se você é um estudante de extensão e você não tiver recebido o questionário de volta 10 00:00:32,360 --> 00:00:35,490 ainda, sua TF é provavelmente a trabalhar nele e graduando-o, e vai buscá-la de volta 11 00:00:35,490 --> 00:00:36,490 em breve. 12 00:00:36,490 --> 00:00:39,650 Então meus alunos de extensão que são assistindo agora - espero viver - 13 00:00:39,650 --> 00:00:42,880 Vou começar seus testes Em breve bem. 14 00:00:42,880 --> 00:00:45,670 >> Nossa agenda para hoje é o seguinte. 15 00:00:45,670 --> 00:00:50,170 Em primeiro lugar, vamos passar por cima de alguns recursos que CS50 oferece para você. 16 00:00:50,170 --> 00:00:54,590 Nós vamos passar por cima de Teste 0 seguinte, e Eu vou responder a quaisquer perguntas ninguém 17 00:00:54,590 --> 00:00:57,360 tem sobre problemas particulares. 18 00:00:57,360 --> 00:01:02,050 E então, nós estaremos passando por cima arquivo I / O e conjunto de problemas 5. 19 00:01:02,050 --> 00:01:07,360 Esses dois últimos tópicos levará se a maior parte da seção de hoje. 20 00:01:07,360 --> 00:01:11,680 >> Coloquei esta lista a cada semana como um lembrete para todos vocês, mas do núcleo 21 00:01:11,680 --> 00:01:14,650 seção, temos apenas 90 minutos - nós não são capazes de cobrir tudo o que eu 22 00:01:14,650 --> 00:01:16,280 adoraria cobrir para vocês. 23 00:01:16,280 --> 00:01:21,170 Mas nós temos uma tonelada de recursos para você desenhe sobre como você começa a conhecer 24 00:01:21,170 --> 00:01:24,000 o material e de trabalho através define o seu problema. 25 00:01:24,000 --> 00:01:30,810 >> Um lembrete de que eu tenho um texto on-line box, criado para que você preencha se você 26 00:01:30,810 --> 00:01:33,250 tem algum feedback para mim, tanto positivos como 27 00:01:33,250 --> 00:01:35,180 construtivo, cerca de seção. 28 00:01:35,180 --> 00:01:38,600 Essa URL está localizado aqui. 29 00:01:38,600 --> 00:01:43,250 Então, por favor, tome um momento se você tiver qualquer feedback, seja durante a seção, 30 00:01:43,250 --> 00:01:48,030 ou depois, ou depois de assistir ao vídeo online, para me dar o seu feedback. 31 00:01:48,030 --> 00:01:52,100 Eu realmente aprecio todo e tudo. 32 00:01:52,100 --> 00:01:55,730 >> Então, eu tenho tido pequenas conversas com um monte de minha 33 00:01:55,730 --> 00:01:59,350 os alunos durante toda a semana - como eu entrego quizzes atrás, falando sobre o 34 00:01:59,350 --> 00:02:01,480 claro, ver como você está fazendo. 35 00:02:01,480 --> 00:02:05,120 E um tema surgiu uma e mais em falar sobre - em 36 00:02:05,120 --> 00:02:05,660 em particular - 37 00:02:05,660 --> 00:02:07,710 conjuntos de problemas. 38 00:02:07,710 --> 00:02:13,090 E eu tenho que encapsulado tema na placa agora. 39 00:02:13,090 --> 00:02:16,630 >> Essencialmente, há uma diferença entre transformando em algo que é 40 00:02:16,630 --> 00:02:19,590 feito corretamente e algo que é bem feito. 41 00:02:19,590 --> 00:02:22,920 A maioria das pessoas têm feito fantástico em termos de correção - 42 00:02:22,920 --> 00:02:25,460 5 de ou 4 da Série de Exercícios em todos. 43 00:02:25,460 --> 00:02:27,930 A maioria das pessoas estão ficando os de todos os tempos. 44 00:02:27,930 --> 00:02:31,150 >> No entanto, só porque você fez algo certo, não significa que você tem 45 00:02:31,150 --> 00:02:34,450 feito algo tão elegante, ou de forma eficiente, ou tão limpa como você 46 00:02:34,450 --> 00:02:35,270 poderia ter feito isso. 47 00:02:35,270 --> 00:02:36,790 E é isso que o projeto - 48 00:02:36,790 --> 00:02:39,230 e até certo ponto, estilo menor - 49 00:02:39,230 --> 00:02:40,450 eixos são para. 50 00:02:40,450 --> 00:02:45,130 Então, eu estou empurrando todos vocês, e outros TFs estão empurrando vocês, não só por sua vez, 51 00:02:45,130 --> 00:02:48,320 em coisas que são corretas, mas acabam nas coisas que são codificadas também. 52 00:02:48,320 --> 00:02:53,060 >> Não fazer desnecessário para loops, não recalcular variáveis ​​se 53 00:02:53,060 --> 00:02:53,800 você não precisa. 54 00:02:53,800 --> 00:02:58,520 Por exemplo, olhando para trás para conjunto de problemas 4, quando a colocação dos tijolos no 55 00:02:58,520 --> 00:03:03,070 tela, cada linha - cada tijolo em uma determinada linha tem a mesma coordenada y - 56 00:03:03,070 --> 00:03:04,390 coordenar a mesma altura. 57 00:03:04,390 --> 00:03:07,930 >> Assim que coordenada y não precisava ser calculada no interior do interior 58 00:03:07,930 --> 00:03:11,070 nested loop que você provavelmente usado para colocar os tijolos na tela. 59 00:03:11,070 --> 00:03:14,030 Ele só precisa ser calculado a cada vez que você trocou uma linha, ou 60 00:03:14,030 --> 00:03:15,200 desceu uma fileira. 61 00:03:15,200 --> 00:03:19,760 Então diga se há 10 tijolos em um fileira, cada tijolo pode ter a mesma 62 00:03:19,760 --> 00:03:22,260 coordenada y, e que coordenada y só pode ser calculado 63 00:03:22,260 --> 00:03:23,550 uma vez por todas desses. 64 00:03:23,550 --> 00:03:27,810 >> Ele não precisa ser calculado 10 vezes, nem essa necessidade cálculo 65 00:03:27,810 --> 00:03:30,220 acontecer no real função de chamada - 66 00:03:30,220 --> 00:03:33,020 a nova função chamada gracked. 67 00:03:33,020 --> 00:03:37,820 Então, se isso foi um pouco confuso para você, mais genericamente, as coisas que 68 00:03:37,820 --> 00:03:40,730 não precisa acontecer a cada momento você passar por um loop FOR não deve ser 69 00:03:40,730 --> 00:03:42,900 colocar dentro do loop FOR, e não deve acontecer a cada vez que você vai 70 00:03:42,900 --> 00:03:44,080 através do laço FOR. 71 00:03:44,080 --> 00:03:49,270 >> Outro exemplo bom projeto, vimos na Semana 3 por 15, você poderia manter 72 00:03:49,270 --> 00:03:50,500 pista do zero. 73 00:03:50,500 --> 00:03:53,600 Então, quando você inicializar a placa, você salvar - em uma variável global, talvez - 74 00:03:53,600 --> 00:03:56,140 x e y-coordenar do zero. 75 00:03:56,140 --> 00:03:57,520 E, em seguida, sempre que você - 76 00:03:57,520 --> 00:04:00,310 na sua função de movimento, sempre que você fizer um movimento bem sucedido, você atualiza o 77 00:04:00,310 --> 00:04:02,040 localização do zero. 78 00:04:02,040 --> 00:04:06,240 >> Isso iria salvá-lo de ter que fazer nested loops para olhar através dos 79 00:04:06,240 --> 00:04:10,700 embarcar cada vez na sua função de movimento e encontrar a zero, ou encontrar o azulejo, 80 00:04:10,700 --> 00:04:12,460 e, em seguida, verificar o que está ao seu lado. 81 00:04:12,460 --> 00:04:16,329 Em vez disso, você tem a localização do zero, você pode apenas olhar acima, abaixo, 82 00:04:16,329 --> 00:04:21,160 e para a esquerda e direita da mesma, para encontrar a telha que você estava procurando. 83 00:04:21,160 --> 00:04:24,970 >> Portanto, em termos dos programas que estamos escrevendo, eles nunca são grandes o suficiente 84 00:04:24,970 --> 00:04:28,580 que algumas dessas decisões de projeto são realmente vai dificultar o seu 85 00:04:28,580 --> 00:04:31,670 programa, ou fazê-lo funcionar mais lentamente, ou talvez até mesmo ficar sem memória. 86 00:04:31,670 --> 00:04:35,030 Mas ainda estamos empurrando vocês para escrever tão elegante e 87 00:04:35,030 --> 00:04:36,450 código eficiente quanto possível. 88 00:04:36,450 --> 00:04:39,910 >> Então, se você acabar escrevendo coisas que tem uma significativamente maior 89 00:04:39,910 --> 00:04:44,660 escopo, que será escrito com boa projectar para além de ser correcta. 90 00:04:44,660 --> 00:04:46,300 Assim, um número de que você tem trouxe isso. 91 00:04:46,300 --> 00:04:48,560 Isso é algo que estamos procurando - algo que vamos continuar a 92 00:04:48,560 --> 00:04:49,840 empurrá-lo caras. 93 00:04:49,840 --> 00:04:52,460 >> Se você tiver alguma dúvida sobre o projeto de seu programa, fique à vontade 94 00:04:52,460 --> 00:04:56,870 para chegar a mim, e eu estou feliz percorrer o seu programa com você, 95 00:04:56,870 --> 00:05:01,320 e apontar algum do design decisões que você fez, e dar-lhe alguns 96 00:05:01,320 --> 00:05:06,240 sugestões sobre como fazer ainda melhores decisões de projeto. 97 00:05:06,240 --> 00:05:08,870 >> Então, vamos seguir em frente para falar sobre Quiz 0. 98 00:05:08,870 --> 00:05:11,300 Antes de fazer isso, alguém tem alguma dúvida sobre o que 99 00:05:11,300 --> 00:05:14,252 Eu cobri até agora? 100 00:05:14,252 --> 00:05:21,500 >> [Farfalhar] 101 00:05:21,500 --> 00:05:22,750 >> JASON HIRSCHHORN: Sete segundos. 102 00:05:22,750 --> 00:05:23,250 OK. 103 00:05:23,250 --> 00:05:24,970 Vamos falar sobre Quiz 0 para um bit. 104 00:05:24,970 --> 00:05:26,700 A maioria de vocês tem o seu quiz 0 costas. 105 00:05:26,700 --> 00:05:29,820 Se não o fizer, espero que Lembra-se um pouco. 106 00:05:29,820 --> 00:05:34,770 Mas se você tomou quiz 0, então você também tem acesso ao PDF on-line em 107 00:05:34,770 --> 00:05:35,890 as soluções de amostras. 108 00:05:35,890 --> 00:05:39,480 >> Alguém tem alguma dúvida antes saltar para o material da semana sobre 109 00:05:39,480 --> 00:05:41,520 um problema particular em Teste 0 - 110 00:05:41,520 --> 00:05:44,630 por que a resposta é o que é? 111 00:05:44,630 --> 00:05:47,255 Tem alguém confuso sobre alguma coisa? 112 00:05:47,255 --> 00:05:50,230 Mesmo se você tem o problema direito, mas apenas gostaria de me explicar isso um pouco 113 00:05:50,230 --> 00:05:52,640 mais, eu estou feliz em fazê-lo agora. 114 00:05:52,640 --> 00:05:57,800 >> Então eu pedi que vocês venha preparado com alguma 115 00:05:57,800 --> 00:05:59,440 pensamentos sobre Quiz 0. 116 00:05:59,440 --> 00:06:02,660 Então, quem gostaria de ter nos começou com uma pergunta ou 117 00:06:02,660 --> 00:06:04,655 comentar sobre Quiz 0? 118 00:06:04,655 --> 00:06:07,435 119 00:06:07,435 --> 00:06:10,410 >> [PAPER FURTOS] 120 00:06:10,410 --> 00:06:11,470 >> JASON HIRSCHHORN: Nem todo mundo fez perfeitamente. 121 00:06:11,470 --> 00:06:12,720 Então eu sei [risos] 122 00:06:12,720 --> 00:06:15,950 tem de haver algumas perguntas sobre Quiz 0. 123 00:06:15,950 --> 00:06:27,940 124 00:06:27,940 --> 00:06:28,590 OK. 125 00:06:28,590 --> 00:06:29,210 Sim. 126 00:06:29,210 --> 00:06:29,600 Ompica. 127 00:06:29,600 --> 00:06:30,520 >> OMPICA: Número 10. 128 00:06:30,520 --> 00:06:33,560 >> JASON HIRSCHHORN: Número 10. 129 00:06:33,560 --> 00:06:35,400 Qual era o número 10? 130 00:06:35,400 --> 00:06:35,840 >> OMPICA: A - 131 00:06:35,840 --> 00:06:36,420 >> JASON HIRSCHHORN: I haven't - 132 00:06:36,420 --> 00:06:37,670 >> OMPICA: The incluem - 133 00:06:37,670 --> 00:06:40,060 134 00:06:40,060 --> 00:06:42,180 >> JASON HIRSCHHORN: número 10 tinha oito anos I - a escrita de oito a i? 135 00:06:42,180 --> 00:06:42,980 >> OMPICA: Yeah. 136 00:06:42,980 --> 00:06:43,630 >> JASON HIRSCHHORN: OK. 137 00:06:43,630 --> 00:06:47,390 Assim, uma outra pergunta que você pode ter perguntou foi estou presciente? 138 00:06:47,390 --> 00:06:48,630 A resposta é sim. 139 00:06:48,630 --> 00:06:52,060 Na seção antes do teste, pedi vocês para codificar tanto Sterling e 140 00:06:52,060 --> 00:06:52,980 de oito a i. 141 00:06:52,980 --> 00:06:54,770 Ambos aconteceu aparecem no quiz. 142 00:06:54,770 --> 00:06:57,510 Portanto, esperamos, você paga atenção a isso. 143 00:06:57,510 --> 00:07:02,520 >> E se você tivesse, então você teria que provavelmente bem feito sobre aqueles dois. 144 00:07:02,520 --> 00:07:06,030 Mas oito para i, não o fizemos na verdade código lo em sala de aula, mas foi, mais uma vez, 145 00:07:06,030 --> 00:07:07,500 perguntado sobre o quiz. 146 00:07:07,500 --> 00:07:13,270 Assim, um par de coisas para levar notar quando a codificação de oito a i. 147 00:07:13,270 --> 00:07:17,320 A primeira coisa que, por questão, foi que você precisava para verificar se a cadeia 148 00:07:17,320 --> 00:07:20,300 foi igual a nulo. 149 00:07:20,300 --> 00:07:28,060 >> Algumas pessoas tentaram verificar mais tarde no programa se s suporte eu era - 150 00:07:28,060 --> 00:07:30,940 assim um caráter específico em que string - foi igual a nulo. 151 00:07:30,940 --> 00:07:35,600 Mas lembre-se, que é essencialmente nulo - é bom pensar 152 00:07:35,600 --> 00:07:39,100 nulo como um ponteiro de zero - um ponteiro para zero - 153 00:07:39,100 --> 00:07:40,920 em algum lugar na memória onde você nunca pode acessar. 154 00:07:40,920 --> 00:07:44,730 >> Então, se algo é igual a nulo, você sei que não foi inicializado, 155 00:07:44,730 --> 00:07:46,430 ou não há nada lá. 156 00:07:46,430 --> 00:07:50,950 Então s é uma estrela char, s suporte de i é um char. 157 00:07:50,950 --> 00:07:57,410 Por isso, faz sentido comparar s como nulo, mas o suporte não s i como nulo. 158 00:07:57,410 --> 00:07:59,390 Mas mais uma vez - de modo que foi a primeira coisa que você deveria fazer - 159 00:07:59,390 --> 00:08:03,510 certifique-se de que você realmente tenho uma corda real. 160 00:08:03,510 --> 00:08:08,020 >> Em seguida, você queria passar por cada caractere na string. 161 00:08:08,020 --> 00:08:12,500 E assim, isso seria como um suporte de s Eu, por exemplo, se i é o seu iterador. 162 00:08:12,500 --> 00:08:17,250 E tome esse caráter, e obter o seu valor real. 163 00:08:17,250 --> 00:08:21,800 Você tê-lo armazenado como um char, mas o valor ASCII para a zero - 164 00:08:21,800 --> 00:08:23,010 zero como um personagem - 165 00:08:23,010 --> 00:08:25,450 não é, na verdade, o inteiro zero. 166 00:08:25,450 --> 00:08:28,700 É algum outro número que você pode olhar para cima na tabela ASCII. 167 00:08:28,700 --> 00:08:30,790 >> Assim, uma maneira de corrigir isso - provavelmente, a melhor maneira de corrigir 168 00:08:30,790 --> 00:08:33,760 que - é subtrair o valor do caractere - 169 00:08:33,760 --> 00:08:35,140 zero como um personagem. 170 00:08:35,140 --> 00:08:38,490 Aspas simples Então negativo, zero, outra aspa simples. 171 00:08:38,490 --> 00:08:44,620 Isso vai levar o número que você tem como um char, e obtê-lo igual a 172 00:08:44,620 --> 00:08:46,720 o número como um número inteiro real. 173 00:08:46,720 --> 00:08:50,300 >> E isso é muito semelhante à abordagem um monte de gente teve no 174 00:08:50,300 --> 00:08:52,800 problema ajustaram 2, com César e Viginere - 175 00:08:52,800 --> 00:08:55,160 essas cifras, quando você foram girando-os. 176 00:08:55,160 --> 00:08:59,210 Então, depois de tê-lo como um número de de zero a nove, então - dependendo 177 00:08:59,210 --> 00:09:02,750 para onde vai o número final - é preciso multiplicá-lo 178 00:09:02,750 --> 00:09:04,120 por uma potência de 10. 179 00:09:04,120 --> 00:09:07,340 >> Algumas pessoas se mudaram de trás para a frente, e multiplicou o indivíduo 180 00:09:07,340 --> 00:09:08,940 número por uma potência de 10. 181 00:09:08,940 --> 00:09:11,160 Algumas pessoas passaram de a frente para trás - 182 00:09:11,160 --> 00:09:14,430 e assim teve a maior ordenar os números em primeiro lugar - 183 00:09:14,430 --> 00:09:18,190 e iria salvar aqueles em um variável do contador global. 184 00:09:18,190 --> 00:09:20,880 E, em seguida, cada vez através do PARA loop, multiplicar esse gigante global 185 00:09:20,880 --> 00:09:25,640 combater variável por 10, para fazer espaço para a próxima carvão. 186 00:09:25,640 --> 00:09:28,750 >> Então isso foi um pouco confuso, sem me escrevê-lo no tabuleiro. 187 00:09:28,750 --> 00:09:31,550 Mas a solução amostra está disponível para você. 188 00:09:31,550 --> 00:09:32,870 Mas essas eram as coisas grandes que estávamos procurando. 189 00:09:32,870 --> 00:09:36,400 Também uma verificação para certificar-se de que cada caráter individual era de fato um 190 00:09:36,400 --> 00:09:39,780 caráter entre zero e nove anos, e não algum outro personagem, como um A, 191 00:09:39,780 --> 00:09:41,160 por exemplo. 192 00:09:41,160 --> 00:09:43,150 >> Essas foram as coisas que estávamos procurando no essa pergunta. 193 00:09:43,150 --> 00:09:46,510 194 00:09:46,510 --> 00:09:47,980 Isso responde a sua pergunta? 195 00:09:47,980 --> 00:09:49,320 >> OMPICA: Yeah. 196 00:09:49,320 --> 00:09:50,240 >> JASON HIRSCHHORN: OK. 197 00:09:50,240 --> 00:09:53,940 Existem outras questões sobre Quiz 0? 198 00:09:53,940 --> 00:09:55,440 E sobre a compilação? 199 00:09:55,440 --> 00:09:56,740 Todo mundo compilando certo? 200 00:09:56,740 --> 00:09:58,370 Não. 201 00:09:58,370 --> 00:09:58,840 Havia um - 202 00:09:58,840 --> 00:10:01,010 [Risos] 203 00:10:01,010 --> 00:10:03,265 Qualquer dúvida sobre o processo de compilação? 204 00:10:03,265 --> 00:10:06,050 205 00:10:06,050 --> 00:10:06,966 Uau. 206 00:10:06,966 --> 00:10:11,090 >> [PAPER FURTOS] 207 00:10:11,090 --> 00:10:11,520 >> JASON HIRSCHHORN: sim. 208 00:10:11,520 --> 00:10:11,700 Michael. 209 00:10:11,700 --> 00:10:14,140 >> MICHAEL: É o número 7 - aleatório? 210 00:10:14,140 --> 00:10:16,500 >> JASON HIRSCHHORN: Número 7. 211 00:10:16,500 --> 00:10:20,670 Número 7 foi obter um número inteiro aleatório. 212 00:10:20,670 --> 00:10:21,110 Excelente. 213 00:10:21,110 --> 00:10:25,630 Então, você está dado um inteiro e um a b inteiro, e você quer um aleatório 214 00:10:25,630 --> 00:10:28,710 inteiro entre a e b. 215 00:10:28,710 --> 00:10:31,740 Nós podemos realmente escrever este em da placa, porque este 216 00:10:31,740 --> 00:10:33,320 era uma linha de código - 217 00:10:33,320 --> 00:10:34,390 uma maneira de fazê-lo. 218 00:10:34,390 --> 00:10:37,810 >> Então, nós estamos dada drand como função que poderíamos usar. 219 00:10:37,810 --> 00:10:38,820 E o que drand - 220 00:10:38,820 --> 00:10:40,290 assumindo que foi semeado - 221 00:10:40,290 --> 00:10:42,316 o que drand voltar? 222 00:10:42,316 --> 00:10:44,840 >> MICHAEL: A flutuação entre 0,0 e 1,0. 223 00:10:44,840 --> 00:10:45,530 >> JASON HIRSCHHORN: Um número - sim. 224 00:10:45,530 --> 00:10:47,910 Um número entre 0 e 1. 225 00:10:47,910 --> 00:10:51,760 E assim temos b e a. 226 00:10:51,760 --> 00:10:55,480 E então temos o nosso número aleatório entre 0 e 1 dado a nós por drand. 227 00:10:55,480 --> 00:11:01,480 228 00:11:01,480 --> 00:11:06,630 Algumas pessoas tentaram colocar b, ou b menos um, ou algo dentro aqueles 229 00:11:06,630 --> 00:11:07,960 parênteses. 230 00:11:07,960 --> 00:11:11,210 Isso significa que eles são argumentos para esta função. 231 00:11:11,210 --> 00:11:13,450 >> drand não leva nenhum argumento - como getString faz 232 00:11:13,450 --> 00:11:14,330 Não tome nenhum argumento. 233 00:11:14,330 --> 00:11:16,600 Então é só parêntese aberto, perto paren - e que, em si, é 234 00:11:16,600 --> 00:11:17,330 a chamada de função. 235 00:11:17,330 --> 00:11:19,770 E isso dá-lhe um número entre 0 e 1. 236 00:11:19,770 --> 00:11:22,820 Claro, temos uma gama inteira que números podem ser pol 237 00:11:22,820 --> 00:11:28,470 >> Digamos que, se b é 10 e um é de 5, nós realmente quer um número com um intervalo de 5. 238 00:11:28,470 --> 00:11:36,940 Portanto, a próxima coisa que precisamos fazer é multiplique isso pelo menos uma faixa de b. 239 00:11:36,940 --> 00:11:40,380 Assim, supondo que é multiplicado. 240 00:11:40,380 --> 00:11:42,590 E isso vai nos dar um número dentro de um determinado intervalo. 241 00:11:42,590 --> 00:11:46,610 E essa faixa específica sendo o diferença entre b menos um. 242 00:11:46,610 --> 00:11:50,030 >> E, finalmente, que só vai dar-lhe a partir de - dizem que a faixa entre b menos um 243 00:11:50,030 --> 00:11:52,520 é 5, que vai nos dar uma número de 0 a 5. 244 00:11:52,520 --> 00:11:56,000 Mas se um é de fato 5, precisamos aumentar esta faixa de até onde é 245 00:11:56,000 --> 00:12:01,380 na verdade, deveria ser, adicionando um. 246 00:12:01,380 --> 00:12:02,580 Assim que recebe o direito de lógica. 247 00:12:02,580 --> 00:12:03,745 E então, você teria outra pergunta? 248 00:12:03,745 --> 00:12:04,547 >> MICHAEL: Não. 249 00:12:04,547 --> 00:12:06,010 Eu me sinto muito idiota agora. 250 00:12:06,010 --> 00:12:06,405 [Risos] 251 00:12:06,405 --> 00:12:06,730 >> JASON HIRSCHHORN: Não. 252 00:12:06,730 --> 00:12:08,640 Não se sinta realmente estúpido. 253 00:12:08,640 --> 00:12:10,560 Um número de pessoas que lutaram com essa questão. 254 00:12:10,560 --> 00:12:13,920 E, em seguida, a outra questão é, drand, você disse, dá-lhe um float - 255 00:12:13,920 --> 00:12:14,940 retorna um float. 256 00:12:14,940 --> 00:12:18,020 Mas essa função realmente pediu para um inteiro para ser devolvido. 257 00:12:18,020 --> 00:12:23,700 >> Você não precisa de lançar isso explicitamente para um número inteiro, porque estes 258 00:12:23,700 --> 00:12:29,090 operações irão tratá-lo como um todo float - como um número de ponto flutuante. 259 00:12:29,090 --> 00:12:31,570 Gosta dessa vontade - mesmo que isso é um número inteiro, esta vontade 260 00:12:31,570 --> 00:12:32,890 ser multiplicado corretamente. 261 00:12:32,890 --> 00:12:34,000 Toda a multiplicação funcionará. 262 00:12:34,000 --> 00:12:35,060 Você não precisa lançá-lo aqui. 263 00:12:35,060 --> 00:12:36,480 Na verdade, você não deve lançá-lo. 264 00:12:36,480 --> 00:12:37,310 >> Isso seria - 265 00:12:37,310 --> 00:12:40,750 se você lançar um número que está entre 0 e 1 - 266 00:12:40,750 --> 00:12:42,680 um número aleatório, um ponto flutuante - 267 00:12:42,680 --> 00:12:47,850 em seguida, ele será ou só 0 ou 1, de modo você vai perder tudo isso de precisão. 268 00:12:47,850 --> 00:12:50,120 Mas no final, quando você voltar, fica automaticamente 269 00:12:50,120 --> 00:12:51,620 enviado de volta como um inteiro. 270 00:12:51,620 --> 00:12:56,870 Assim você não precisa fazer que lançando-se. 271 00:12:56,870 --> 00:13:00,810 >> Portanto, esta foi a resposta a a essa pergunta, o número 7. 272 00:13:00,810 --> 00:13:02,190 Quaisquer outras perguntas sobre quiz 0? 273 00:13:02,190 --> 00:13:03,300 Sim, Annie. 274 00:13:03,300 --> 00:13:05,050 >> ANNIE: Quando usamos recursiva - 275 00:13:05,050 --> 00:13:07,850 quando é que vamos usar loops iterativos? 276 00:13:07,850 --> 00:13:10,210 >> JASON HIRSCHHORN: Quando você usa recursiva - assim mais geral, a 277 00:13:10,210 --> 00:13:14,110 prós e contras de recursão contra uma abordagem iterativa. 278 00:13:14,110 --> 00:13:17,110 Alguém pode oferecer um profissional ou um engodo? 279 00:13:17,110 --> 00:13:19,460 Por favor? 280 00:13:19,460 --> 00:13:20,140 Não pode ninguém. 281 00:13:20,140 --> 00:13:22,526 Quem pode oferecer um profissional ou um engodo? 282 00:13:22,526 --> 00:13:26,963 >> [PAPER FURTOS] 283 00:13:26,963 --> 00:13:29,730 >> ALUNO 1: recursiva é menor codificação - menos de digitação? 284 00:13:29,730 --> 00:13:33,170 >> JASON HIRSCHHORN: Então, geralmente, recursão principalmente, uma função - 285 00:13:33,170 --> 00:13:35,750 ou um algoritmo como merge tipo - que se presta 286 00:13:35,750 --> 00:13:37,300 para uma abordagem recursiva - 287 00:13:37,300 --> 00:13:40,710 pode ser mais simples para codificar de forma recursiva. 288 00:13:40,710 --> 00:13:43,940 E só fazer mais sentido para fazê-lo de forma recursiva. 289 00:13:43,940 --> 00:13:46,230 Então isso seria um profissional para a recursividade. 290 00:13:46,230 --> 00:13:46,610 Outros? 291 00:13:46,610 --> 00:13:47,467 Sim? 292 00:13:47,467 --> 00:13:49,240 >> ALUNO 2: Con de recursão - 293 00:13:49,240 --> 00:13:50,940 Ele usa mais memória. 294 00:13:50,940 --> 00:13:52,200 >> JASON HIRSCHHORN: Então exatamente correto. 295 00:13:52,200 --> 00:13:55,720 Uma função recursiva vai continuar a adicionar pilha de quadros para a pilha. 296 00:13:55,720 --> 00:13:59,690 Então, se você estiver operando em um monte de números, e tem que chamar esta 297 00:13:59,690 --> 00:14:02,560 funcionar muito, então você certamente vai ocupam mais memória, enquanto 298 00:14:02,560 --> 00:14:05,810 uma abordagem iterativa só vai colocar um empilhar quadro na pilha, porque 299 00:14:05,810 --> 00:14:08,420 tudo acontece dentro de uma função. 300 00:14:08,420 --> 00:14:11,010 >> Quaisquer outros prós e contras? 301 00:14:11,010 --> 00:14:11,500 É. 302 00:14:11,500 --> 00:14:12,550 >> ALUNO 3: Prós para recursão. 303 00:14:12,550 --> 00:14:15,950 Você não tem que determinar em avançar quantas vezes o 304 00:14:15,950 --> 00:14:17,660 código teve que ser repetido. 305 00:14:17,660 --> 00:14:22,810 Pode ter um número predeterminado de vezes que você tem que interagir, então 306 00:14:22,810 --> 00:14:26,420 recursão é melhor, porque é preciso que o resultado. 307 00:14:26,420 --> 00:14:27,780 >> JASON HIRSCHHORN: Eu acho que isso é verdade. 308 00:14:27,780 --> 00:14:30,770 Mas eu acho que em ambos os casos você nunca faria isso - 309 00:14:30,770 --> 00:14:33,290 você provavelmente obter algum entrada do usuário. 310 00:14:33,290 --> 00:14:35,990 Ou essa função teria alguma entrada que iria determinar quantas vezes ele 311 00:14:35,990 --> 00:14:36,730 deve ser executado. 312 00:14:36,730 --> 00:14:39,520 Então, geralmente, você não faria código rígido - mesmo em uma abordagem iterativa - como 313 00:14:39,520 --> 00:14:40,940 muitas vezes esse ciclo deve ser executado. 314 00:14:40,940 --> 00:14:46,100 315 00:14:46,100 --> 00:14:48,670 >> Será que você tem um outro que estava pensando, Annie? 316 00:14:48,670 --> 00:14:49,330 OK. 317 00:14:49,330 --> 00:14:51,650 Portanto, estas são provavelmente os dois - 318 00:14:51,650 --> 00:14:54,370 o maior pró eo maior con a um recursiva contra 319 00:14:54,370 --> 00:14:57,080 uma abordagem iterativa. 320 00:14:57,080 --> 00:14:57,690 OK. 321 00:14:57,690 --> 00:14:59,465 Qualquer outra coisa em quiz 0? 322 00:14:59,465 --> 00:15:08,940 323 00:15:08,940 --> 00:15:09,920 >> Vamos seguir em frente. 324 00:15:09,920 --> 00:15:15,260 File I / O. Há um maravilhoso curta esta semana em arquivo I / O que esperamos 325 00:15:15,260 --> 00:15:19,270 você assistiu múltipla vezes, e admirado. 326 00:15:19,270 --> 00:15:22,910 Muito trabalho foi para isso, e eu tenho ouvido é insanamente útil. 327 00:15:22,910 --> 00:15:25,740 Eu também incluiu o link neste slide, no caso de você não ter tido uma 328 00:15:25,740 --> 00:15:29,160 chance de vê-lo 10 vezes. 329 00:15:29,160 --> 00:15:35,280 >> Então, nós estamos indo para ir brevemente sobre o principais passos para abrir e trabalhar 330 00:15:35,280 --> 00:15:38,400 com os arquivos, e depois nós vamos mergulhar em um problema de codificação antes 331 00:15:38,400 --> 00:15:40,400 examinar o conjunto de problemas. 332 00:15:40,400 --> 00:15:44,330 Então, novamente, eu vou colocar isso em a tela, mas eu vou falar para 333 00:15:44,330 --> 00:15:47,630 apenas um minuto sobre o que estamos fazendo aqui com o arquivo I/O-- 334 00:15:47,630 --> 00:15:49,090 O que isso significa? 335 00:15:49,090 --> 00:15:55,280 >> Isso significa que podemos criar nosso programas e, em seguida, temos nossos programas 336 00:15:55,280 --> 00:16:00,370 saída, e não fizeram qualquer impacto sobre o mundo fora do nosso programa. 337 00:16:00,370 --> 00:16:04,630 Mas quando começamos a trabalhar com arquivos - tanto lê-los e criar 338 00:16:04,630 --> 00:16:10,460 eles - que pode ter algum efeito sobre a mundo fora do nosso programa. 339 00:16:10,460 --> 00:16:15,440 >> Assim como se o Microsoft Word não foi capaz fazer quaisquer documentos do Word, em seguida, 340 00:16:15,440 --> 00:16:18,710 uma vez que o Microsoft Word parar, todo o seu trabalho teria ido, e que seria 341 00:16:18,710 --> 00:16:19,740 realmente ser inútil. 342 00:16:19,740 --> 00:16:23,620 Nós queremos finalmente ser capaz de escrever programas que podem afetar o 343 00:16:23,620 --> 00:16:31,350 mundo ao seu redor, tanto pela ingestão de entradas complexas - em termos de arquivos e 344 00:16:31,350 --> 00:16:37,080 através de arquivos, e também criar interessantes e saídas convincentes - 345 00:16:37,080 --> 00:16:39,520 em termos de diferentes tipos de arquivos. 346 00:16:39,520 --> 00:16:43,730 >> É por isso que estamos começando a aprender a trabalhar com arquivos. 347 00:16:43,730 --> 00:16:47,080 Mais especificamente, o o que fazemos é a seguinte. 348 00:16:47,080 --> 00:16:47,680 É muito simples. 349 00:16:47,680 --> 00:16:51,530 Há apenas um par de passos, e eles são listados aqui neste código. 350 00:16:51,530 --> 00:16:55,130 Então vamos passar por este código linha por linha. 351 00:16:55,130 --> 00:16:57,630 >> Primeiro, você vê destaque - 352 00:16:57,630 --> 00:17:01,330 quando você está trabalhando com um arquivo, independentemente do tipo de arquivo que é, 353 00:17:01,330 --> 00:17:02,670 você precisa abri-lo. 354 00:17:02,670 --> 00:17:05,130 E é com uma chamada para fopen - 355 00:17:05,130 --> 00:17:05,950 bem aqui. 356 00:17:05,950 --> 00:17:07,980 Você incluir o nome do arquivo. 357 00:17:07,980 --> 00:17:11,930 Se o arquivo não está em seu diretório, ou a pasta onde este programa 358 00:17:11,930 --> 00:17:15,910 vidas, então você também precisa incluir um caminho para onde o arquivo está. 359 00:17:15,910 --> 00:17:19,099 >> Vamos supor que esta arquivo chamado "text.txt" - 360 00:17:19,099 --> 00:17:24,220 um documento de texto simples - está no mesma pasta que este programa é. 361 00:17:24,220 --> 00:17:26,859 Então, isso é outra coisa a ter em mente - que, se você deseja abrir um arquivo 362 00:17:26,859 --> 00:17:30,050 em outro lugar, você realmente precisa para incluir a sua localização. 363 00:17:30,050 --> 00:17:33,520 >> Segundo, você pode passar um argumento para fopen, e é isso que você quer fazer 364 00:17:33,520 --> 00:17:34,620 com o arquivo. 365 00:17:34,620 --> 00:17:38,450 Existem três principais argumentos que você vai passar para fopen. 366 00:17:38,450 --> 00:17:40,060 Quem pode me dar os três? 367 00:17:40,060 --> 00:17:44,960 368 00:17:44,960 --> 00:17:47,130 Quem pode me dar um deles? 369 00:17:47,130 --> 00:17:48,130 Sim. 370 00:17:48,130 --> 00:17:50,010 >> ESTUDANTE 4: O nome do arquivo? 371 00:17:50,010 --> 00:17:50,440 >> JASON HIRSCHHORN: Desculpe. 372 00:17:50,440 --> 00:17:55,490 Três principais argumentos você pode passar como o segundo argumento para fopen. 373 00:17:55,490 --> 00:17:57,060 Você está certo - o nome do arquivo é o primeiro argumento. 374 00:17:57,060 --> 00:18:01,620 Mas o segundo argumento para fopen são geralmente três cordas, e - sim. 375 00:18:01,620 --> 00:18:02,210 Aleja. 376 00:18:02,210 --> 00:18:03,490 >> ALEJA: A para acréscimo. 377 00:18:03,490 --> 00:18:06,840 >> JASON HIRSCHHORN: A, se você quiser anexar um arquivo que já existe. 378 00:18:06,840 --> 00:18:07,810 >> ESTUDANTE 5: R para ler. 379 00:18:07,810 --> 00:18:09,930 >> JASON HIRSCHHORN: R, se quer ler um arquivo. 380 00:18:09,930 --> 00:18:10,670 >> ESTUDANTE 6: W para gravação. 381 00:18:10,670 --> 00:18:12,840 >> JASON HIRSCHHORN: E w, se você quero escrever para um arquivo. 382 00:18:12,840 --> 00:18:17,570 Portanto, neste caso, estamos escrevendo para o arquivo, por isso temos w. 383 00:18:17,570 --> 00:18:22,360 Você abri-lo, você também tem que salvar o arquivo em algum lugar, e isso é com o 384 00:18:22,360 --> 00:18:26,000 codificar para o lado esquerdo da o operador de atribuição - 385 00:18:26,000 --> 00:18:31,220 Estou criando um ponteiro para um arquivo chamado, neste caso, de arquivo. 386 00:18:31,220 --> 00:18:36,070 >> Não vamos nos preocupar que essa coisa IMAGEM todas as tampas é. 387 00:18:36,070 --> 00:18:40,600 Basta dizer, é um longo fluxo de zeros e uns. 388 00:18:40,600 --> 00:18:44,970 E é assim que vamos operá-lo e compreendê-lo. 389 00:18:44,970 --> 00:18:47,300 >> A próxima coisa que precisamos fazer - e Isso é extremamente importante - 390 00:18:47,300 --> 00:18:49,070 sempre que você abrir um arquivo - 391 00:18:49,070 --> 00:18:54,250 na verdade, sempre que você chamar malloc, por exemplo, e obter alguma memória e tente 392 00:18:54,250 --> 00:18:57,980 e salve-o em um ponteiro, você sempre querer verificar para se certificar de que esse 393 00:18:57,980 --> 00:19:00,230 função não retornar nulo. 394 00:19:00,230 --> 00:19:05,230 >> Portanto, neste caso, estamos verificando para fazer Certifique-se que realmente abriu a 395 00:19:05,230 --> 00:19:10,230 arquivar corretamente, e não havia nenhum erro em nosso programa. 396 00:19:10,230 --> 00:19:15,160 Em seguida, uma vez que temos verificado para se certificar que temos um arquivo de trabalho, podemos 397 00:19:15,160 --> 00:19:18,520 gravar ou ler a partir de, ou anexar o arquivo. 398 00:19:18,520 --> 00:19:24,270 Neste caso, estou simplesmente imprimir uma linha a este arquivo. 399 00:19:24,270 --> 00:19:25,450 >> Como eu sei disso? 400 00:19:25,450 --> 00:19:27,990 Bem, eu estou usando esta função chamado fprintf. 401 00:19:27,990 --> 00:19:30,970 Todas as funções que você irá utilizar ao gravar ou ler a partir de, ou 402 00:19:30,970 --> 00:19:34,950 manipulação de arquivos será semelhante ao funções que você já viu antes, mas 403 00:19:34,950 --> 00:19:38,420 começam com a letra F, pé para o arquivo. 404 00:19:38,420 --> 00:19:43,440 E fprintf, ao contrário de nossa impressão normal aplicativo, tem um argumento adicional, 405 00:19:43,440 --> 00:19:47,800 e que é o arquivo no qual você deseja imprimir esta linha. 406 00:19:47,800 --> 00:19:50,640 >> Eu não tenho nada a o direito de ohai. 407 00:19:50,640 --> 00:19:52,860 Eu não tenho o terceiro argumento para printf - 408 00:19:52,860 --> 00:19:57,030 ou o segundo argumento para printf, o terceiro argumento para fprintf, porque eu 409 00:19:57,030 --> 00:19:59,480 não tem espaços reservados aqui. 410 00:19:59,480 --> 00:20:01,070 Eu não estou incluindo quaisquer variáveis. 411 00:20:01,070 --> 00:20:06,070 Mas, novamente, fprintf e todos estes arquivos funções que operam com arquivos 412 00:20:06,070 --> 00:20:09,820 são geralmente vai precisar do arquivo em que está operando. 413 00:20:09,820 --> 00:20:15,960 >> Finalmente, a última coisa importante a fazer é fechar o arquivo, assim como 414 00:20:15,960 --> 00:20:19,530 com - sempre que malloc alguma coisa, queremos libertar alguma coisa, para que não 415 00:20:19,530 --> 00:20:22,730 ter um vazamento de memória - queremos para fechar o nosso arquivo. 416 00:20:22,730 --> 00:20:28,180 Se este programa saiu sem fechar o arquivo, as probabilidades são nada iria 417 00:20:28,180 --> 00:20:30,050 errado, especialmente se era um arquivo pequeno. 418 00:20:30,050 --> 00:20:35,020 >> Mas é certamente um bom código e prática para sempre fechar o arquivo 419 00:20:35,020 --> 00:20:38,050 quando você terminar de usá-lo. 420 00:20:38,050 --> 00:20:43,630 Então isso é o básico do arquivo I / O. Você provavelmente já viu isso antes, ou 421 00:20:43,630 --> 00:20:45,710 assisti-lo nesse fantástico curta. 422 00:20:45,710 --> 00:20:48,410 Alguém tem alguma dúvida, antes de nós entramos em alguma codificação prática 423 00:20:48,410 --> 00:20:51,800 problemas, cerca de arquivo I / O ou a passos que eu só fui de novo? 424 00:20:51,800 --> 00:21:00,198 425 00:21:00,198 --> 00:21:03,162 >> [DATILOGRAFAM SONS] 426 00:21:03,162 --> 00:21:04,150 >> JASON HIRSCHHORN: Você tenho uma pergunta, Avi? 427 00:21:04,150 --> 00:21:04,660 >> AVI: Não. 428 00:21:04,660 --> 00:21:04,740 >> JASON HIRSCHHORN: OK. 429 00:21:04,740 --> 00:21:06,746 Vou esperar mais um sete segundo. 430 00:21:06,746 --> 00:21:07,590 [Risos] 431 00:21:07,590 --> 00:21:08,620 Essa é uma dica muito boa. 432 00:21:08,620 --> 00:21:10,750 Vocês só não gosto fazer perguntas. 433 00:21:10,750 --> 00:21:11,660 Isso é bom. 434 00:21:11,660 --> 00:21:12,330 OK. 435 00:21:12,330 --> 00:21:17,620 Assim, o nosso primeiro problema é prática, estamos vai duplicar a função de 436 00:21:17,620 --> 00:21:22,330 uma ferramenta de linha de comando que você, provavelmente, usado antes - cópia - 437 00:21:22,330 --> 00:21:23,500 a ferramenta de cópia. 438 00:21:23,500 --> 00:21:28,050 Se você digitar cp e, em seguida, passá-lo duas argumentos em seu terminal, você pode 439 00:21:28,050 --> 00:21:28,980 copiar um arquivo. 440 00:21:28,980 --> 00:21:31,220 E é isso que nós estamos indo para escrever agora. 441 00:21:31,220 --> 00:21:35,830 >> Então, novamente, a leitura fora deste slide, eu que você escreva um programa que tira 442 00:21:35,830 --> 00:21:38,130 dois e apenas dois de linha de comando argumentos - 443 00:21:38,130 --> 00:21:40,750 um arquivo de origem e um arquivo de destino - 444 00:21:40,750 --> 00:21:44,590 e copia o conteúdo da fonte arquivo para o arquivo de destino 445 00:21:44,590 --> 00:21:46,960 um byte de cada vez. 446 00:21:46,960 --> 00:21:48,510 Então, isso é muito a pedir. 447 00:21:48,510 --> 00:21:52,200 >> Mais uma vez, uma boa abordagem para isso é não ir direto para o código C, mas 448 00:21:52,200 --> 00:21:54,280 decompô-lo em um par de passos. 449 00:21:54,280 --> 00:21:58,400 Primeiro, pense sobre a lógica - exatamente o que eu estou pedindo para você fazer - 450 00:21:58,400 --> 00:22:00,620 e compreender toda a passos para este problema. 451 00:22:00,620 --> 00:22:04,410 Não em C, apenas em um pseudocódigo, ou até mesmo um modelo mental de 452 00:22:04,410 --> 00:22:06,030 o que está acontecendo. 453 00:22:06,030 --> 00:22:10,050 >> Em seguida, depois de ter o pseudocódigo para baixo, descobrir como o pseudocódigo 454 00:22:10,050 --> 00:22:14,600 mapas no ferramentas e coisas que temos aprendeu em uso em C. 455 00:22:14,600 --> 00:22:19,070 >> E, finalmente, uma vez que você tem tudo o que juntos, você pode codificar o problema. 456 00:22:19,070 --> 00:22:23,370 Take 5 a 10 minutos para trabalhar sobre este problema. 457 00:22:23,370 --> 00:22:25,800 Vou colocar as instruções back-up em um segundo. 458 00:22:25,800 --> 00:22:27,990 E então nós vamos passar por cima de o pseudocódigo eo código 459 00:22:27,990 --> 00:22:29,230 ele vive como um grupo. 460 00:22:29,230 --> 00:22:31,640 >> Se você tiver alguma dúvida, enquanto você está trabalhando sobre isso, fique à vontade para levantar 461 00:22:31,640 --> 00:22:34,260 sua mão, e eu virei volta e respondê-las. 462 00:22:34,260 --> 00:22:37,020 463 00:22:37,020 --> 00:22:39,330 >> ESTUDANTE 7: Posso roubar um pedaço de papel? 464 00:22:39,330 --> 00:22:41,537 >> JASON HIRSCHHORN: O que foi? 465 00:22:41,537 --> 00:26:46,047 466 00:26:46,047 --> 00:26:48,043 >> [DATILOGRAFAM SONS] 467 00:26:48,043 --> 00:26:48,730 >> JASON HIRSCHHORN: OK. 468 00:26:48,730 --> 00:26:51,710 Vamos rever o pseudocódigo em primeiro lugar, e então eu vou dar-lhe mais um par 469 00:26:51,710 --> 00:26:52,960 minutos para terminar a codificação. 470 00:26:52,960 --> 00:26:55,540 471 00:26:55,540 --> 00:26:58,650 >> Quem gostaria de me começar com a primeira linha de 472 00:26:58,650 --> 00:27:00,030 pseudocódigo para esta função? 473 00:27:00,030 --> 00:27:03,330 474 00:27:03,330 --> 00:27:05,740 >> ALUNO 8: Certifique-se de que que lhe foi dada dois arquivos. 475 00:27:05,740 --> 00:27:06,990 >> JASON HIRSCHHORN: OK. 476 00:27:06,990 --> 00:27:21,270 477 00:27:21,270 --> 00:27:22,990 E se nós não somos? 478 00:27:22,990 --> 00:27:25,974 >> ALUNO 8: eu iria retornar 0. 479 00:27:25,974 --> 00:27:27,872 >> JASON HIRSCHHORN: Devemos retornar 0? 480 00:27:27,872 --> 00:27:30,182 >> ALUNO 8: Voltar a - 481 00:27:30,182 --> 00:27:30,650 supressão. 482 00:27:30,650 --> 00:27:30,850 Desculpe. 483 00:27:30,850 --> 00:27:31,210 >> JASON HIRSCHHORN: Yeah. 484 00:27:31,210 --> 00:27:32,710 Provavelmente não 0. 485 00:27:32,710 --> 00:27:34,680 Porque 0 significa que tudo era bom. 486 00:27:34,680 --> 00:27:35,030 OK. 487 00:27:35,030 --> 00:27:36,730 Então essa é a primeira linha de pseudocódigo. 488 00:27:36,730 --> 00:27:38,715 Quem tem a segunda linha do pseudocódigo? 489 00:27:38,715 --> 00:27:40,630 >> ESTUDANTE 9: Abra os dois arquivos? 490 00:27:40,630 --> 00:27:41,880 >> JASON HIRSCHHORN: Abra os dois arquivos. 491 00:27:41,880 --> 00:27:49,970 492 00:27:49,970 --> 00:27:50,920 OK? 493 00:27:50,920 --> 00:27:52,850 >> ALUNO 10: Verifique se o arquivo é NULL? 494 00:27:52,850 --> 00:28:10,906 495 00:28:10,906 --> 00:28:12,580 >> JASON HIRSCHHORN: Verifique certeza não são NULL. 496 00:28:12,580 --> 00:28:15,800 Como um aparte - 497 00:28:15,800 --> 00:28:17,540 cortar 0 - 498 00:28:17,540 --> 00:28:18,887 é que NULL? 499 00:28:18,887 --> 00:28:20,080 >> ALUNO 11: Não. 500 00:28:20,080 --> 00:28:21,190 >> JASON HIRSCHHORN: Isso não é NULL. 501 00:28:21,190 --> 00:28:23,400 Isto é chamado o terminador NULL. 502 00:28:23,400 --> 00:28:25,580 É realmente escrito com apenas um l. 503 00:28:25,580 --> 00:28:28,580 Assim, verificando alguma coisa contra isso - que na verdade é um personagem - 504 00:28:28,580 --> 00:28:31,710 assim verificando algo que é contra não o mesmo que a verificação para ver se ele 505 00:28:31,710 --> 00:28:32,690 é igual a NULL. 506 00:28:32,690 --> 00:28:34,100 >> E algumas pessoas - 507 00:28:34,100 --> 00:28:36,040 em seus testes e seu problema conjuntos - tem o 508 00:28:36,040 --> 00:28:36,890 dois deles confuso. 509 00:28:36,890 --> 00:28:38,830 Mas os dois desses são de facto diferente. 510 00:28:38,830 --> 00:28:40,220 Um termina uma string - 511 00:28:40,220 --> 00:28:43,210 é um ponteiro para 0. 512 00:28:43,210 --> 00:28:46,490 >> ALUNO 12: Por que você não verificar para certificar-se de que os arquivos não são NULL 513 00:28:46,490 --> 00:28:48,670 antes de abri-los? 514 00:28:48,670 --> 00:28:54,772 >> JASON HIRSCHHORN: Então aberto salva algo nesse arquivo. 515 00:28:54,772 --> 00:28:57,780 E se você voltar aqui - 516 00:28:57,780 --> 00:28:59,520 assim que esta linha - fopen - 517 00:28:59,520 --> 00:29:05,300 vai lhe dar um endereço e loja esse endereço no arquivo se ele funciona. 518 00:29:05,300 --> 00:29:07,650 Se isso não funcionar, irá armazenar NULL - 519 00:29:07,650 --> 00:29:08,020 >> ALUNO 12: Oh. 520 00:29:08,020 --> 00:29:08,180 OK. 521 00:29:08,180 --> 00:29:08,500 Apanhei-te. 522 00:29:08,500 --> 00:29:09,050 >> JASON HIRSCHHORN: No arquivo. 523 00:29:09,050 --> 00:29:11,990 Então você não pode verificar a existência de NULL antes de você abri-los. 524 00:29:11,990 --> 00:29:13,520 NULL significa algo que não fez funcionar correctamente. 525 00:29:13,520 --> 00:29:18,030 526 00:29:18,030 --> 00:29:18,740 OK. 527 00:29:18,740 --> 00:29:22,590 Então, certifique-se de não é? 528 00:29:22,590 --> 00:29:23,200 Ou são? 529 00:29:23,200 --> 00:29:23,770 O que acha? 530 00:29:23,770 --> 00:29:24,310 Vamos com isso. 531 00:29:24,310 --> 00:29:24,520 >> ALUNO 13: É. 532 00:29:24,520 --> 00:29:25,020 >> JASON HIRSCHHORN: É? 533 00:29:25,020 --> 00:29:25,930 Também não é? 534 00:29:25,930 --> 00:29:26,350 >> ALUNO 13: É. 535 00:29:26,350 --> 00:29:26,390 >> JASON HIRSCHHORN: OK. 536 00:29:26,390 --> 00:29:28,510 Parece que temos alguns consenso sobre isso. 537 00:29:28,510 --> 00:29:30,520 Nem é NULL. 538 00:29:30,520 --> 00:29:32,250 OK, próxima linha de pseudocódigo. 539 00:29:32,250 --> 00:29:33,600 Quem não me deu uma linha ainda? 540 00:29:33,600 --> 00:29:37,350 541 00:29:37,350 --> 00:29:38,295 Vamos esperar por você. 542 00:29:38,295 --> 00:29:39,020 É. 543 00:29:39,020 --> 00:29:40,895 >> ALUNO 14: Você tem que ler desde o primeiro arquivo? 544 00:29:40,895 --> 00:29:42,290 >> JASON HIRSCHHORN: OK. 545 00:29:42,290 --> 00:29:46,240 >> ALUNO 14: Ou nós usamos fscanf ou algo como que o primeiro arquivo? 546 00:29:46,240 --> 00:29:50,650 >> JASON HIRSCHHORN: Então, nós queremos lido a partir do primeiro arquivo e - 547 00:29:50,650 --> 00:29:51,900 vamos deixar isso bem aqui. 548 00:29:51,900 --> 00:30:00,600 549 00:30:00,600 --> 00:30:01,880 Leia a partir do arquivo de origem. 550 00:30:01,880 --> 00:30:05,370 E então, o que vamos fazer depois que lido a partir do arquivo de origem? 551 00:30:05,370 --> 00:30:06,620 Alguém mais? 552 00:30:06,620 --> 00:30:09,150 553 00:30:09,150 --> 00:30:12,190 >> ALUNO 15: Escrever em o arquivo de destino? 554 00:30:12,190 --> 00:30:22,080 555 00:30:22,080 --> 00:30:25,620 >> JASON HIRSCHHORN: Nós escrevemos para o arquivo de destino, e - 556 00:30:25,620 --> 00:30:26,210 OK. 557 00:30:26,210 --> 00:30:30,030 O que mais estamos perdendo? 558 00:30:30,030 --> 00:30:32,460 Alguém que não tenha me dado um linha de código ainda - de pseudocódigo. 559 00:30:32,460 --> 00:30:33,510 É. 560 00:30:33,510 --> 00:30:36,540 >> ALUNO 16: Talvez você sempre pode verificar se há algo para ler para, 561 00:30:36,540 --> 00:30:37,970 como a próxima linha? 562 00:30:37,970 --> 00:30:39,550 Isso é como a próxima linha, ver se ele existir. 563 00:30:39,550 --> 00:30:40,660 >> [ELETRÔNICO BEEP] 564 00:30:40,660 --> 00:30:41,095 >> JASON HIRSCHHORN: Oops. 565 00:30:41,095 --> 00:30:43,120 Esse é o meu software journaling. 566 00:30:43,120 --> 00:30:43,580 Sim? 567 00:30:43,580 --> 00:30:44,960 >> ALUNO 16: Yeah. 568 00:30:44,960 --> 00:30:48,940 >> JASON HIRSCHHORN: Então dê isto para mim mais uma vez. 569 00:30:48,940 --> 00:30:51,640 >> ALUNO 16: Verifique se há ainda a próxima linha do 570 00:30:51,640 --> 00:30:52,920 arquivo de origem para ler. 571 00:30:52,920 --> 00:30:53,500 >> JASON HIRSCHHORN: OK. 572 00:30:53,500 --> 00:30:56,060 Portanto, não estamos lendo linhas - estavam lendo bytes por aqui - 573 00:30:56,060 --> 00:30:57,590 mas você está correto. 574 00:30:57,590 --> 00:31:00,040 Queremos ler e escrever até não há mais bytes. 575 00:31:00,040 --> 00:31:11,430 576 00:31:11,430 --> 00:31:11,735 OK. 577 00:31:11,735 --> 00:31:16,940 E assim, estes devem realmente ser recuado um pouco, porque eles estão lá embaixo. 578 00:31:16,940 --> 00:31:17,470 Certo? 579 00:31:17,470 --> 00:31:20,620 Até que nós estamos fora de bytes, vamos lido a partir do arquivo de origem e escrever 580 00:31:20,620 --> 00:31:22,160 para o arquivo de destino. 581 00:31:22,160 --> 00:31:24,510 >> E então, o que é a última linha de pseudocódigo? 582 00:31:24,510 --> 00:31:26,380 Alguém que não é dado me alguma coisa ainda. 583 00:31:26,380 --> 00:31:29,270 584 00:31:29,270 --> 00:31:30,260 >> ALUNO 17: Feche os arquivos? 585 00:31:30,260 --> 00:31:31,510 >> JASON HIRSCHHORN: Exatamente. 586 00:31:31,510 --> 00:31:36,370 587 00:31:36,370 --> 00:31:37,450 Feche os arquivos. 588 00:31:37,450 --> 00:31:38,400 Portanto, não é o nosso pseudocódigo. 589 00:31:38,400 --> 00:31:41,870 Eu vou colocar o pseudocódigo em gedit, e em um par de minutos, 590 00:31:41,870 --> 00:31:44,626 codificará isso juntos. 591 00:31:44,626 --> 00:33:55,280 592 00:33:55,280 --> 00:33:56,000 >> OK. 593 00:33:56,000 --> 00:33:58,290 Vamos começar como um grupo. 594 00:33:58,290 --> 00:33:59,940 Nishant, eu tenho meu novo arquivo. 595 00:33:59,940 --> 00:34:01,130 Acabei de abrir isso. 596 00:34:01,130 --> 00:34:01,880 Documento Untitled 1. 597 00:34:01,880 --> 00:34:05,490 Qual é a primeira coisa que devo fazer? 598 00:34:05,490 --> 00:34:07,040 >> Nishant: Incluir bibliotecas? 599 00:34:07,040 --> 00:34:08,219 >> JASON HIRSCHHORN: OK. 600 00:34:08,219 --> 00:34:11,070 O que as bibliotecas? 601 00:34:11,070 --> 00:34:17,570 >> Nishant: Stdio.h, stdlib.h, eu acredito? 602 00:34:17,570 --> 00:34:18,000 >> JASON HIRSCHHORN: OK. 603 00:34:18,000 --> 00:34:21,592 O que é stdlib para? 604 00:34:21,592 --> 00:34:23,010 >> Nishant: eu esqueci. 605 00:34:23,010 --> 00:34:23,219 >> JASON HIRSCHHORN: OK. 606 00:34:23,219 --> 00:34:24,179 Portanto, incluir stdio. 607 00:34:24,179 --> 00:34:28,630 O que devo fazer antes mesmo de Eu começar a programar? 608 00:34:28,630 --> 00:34:29,710 >> Nishant: Escreva um cabeçalho? 609 00:34:29,710 --> 00:34:31,830 >> JASON HIRSCHHORN: Como faço para obtê-lo colorido? 610 00:34:31,830 --> 00:34:34,060 >> [VOZES interpondo] 611 00:34:34,060 --> 00:34:35,040 >> Nishant: Como você conseguiu isso de cor? 612 00:34:35,040 --> 00:34:38,060 >> JASON HIRSCHHORN: Como posso colorir codificação? 613 00:34:38,060 --> 00:34:38,570 >> Nishant: Eu não sei. 614 00:34:38,570 --> 00:34:38,830 Oh. 615 00:34:38,830 --> 00:34:39,389 Salve. 616 00:34:39,389 --> 00:34:39,929 >> JASON HIRSCHHORN: Salvar. 617 00:34:39,929 --> 00:34:40,270 Sim. 618 00:34:40,270 --> 00:34:41,760 Eu deveria salvá-lo como um arquivo. C. 619 00:34:41,760 --> 00:34:46,239 Então salve-o na área de trabalho como cp.c. 620 00:34:46,239 --> 00:34:47,280 Doce. 621 00:34:47,280 --> 00:34:51,199 E se eu quiser obter estilo completo pontos, o que devo 622 00:34:51,199 --> 00:34:53,085 incluir no topo? 623 00:34:53,085 --> 00:34:58,390 >> Nishant: Você poderia escrever seu nome, nome do programa, eo objetivo 624 00:34:58,390 --> 00:34:59,640 do programa também? 625 00:34:59,640 --> 00:35:08,400 626 00:35:08,400 --> 00:35:10,040 >> JASON HIRSCHHORN: Parece bom. 627 00:35:10,040 --> 00:35:10,470 Excelente. 628 00:35:10,470 --> 00:35:12,940 Então você começou-nos perfeitamente. 629 00:35:12,940 --> 00:35:13,720 # Include - 630 00:35:13,720 --> 00:35:15,365 nós também vamos escrever - 631 00:35:15,365 --> 00:35:30,050 632 00:35:30,050 --> 00:35:30,870 OK. 633 00:35:30,870 --> 00:35:33,520 Então, eu acho que estou pronto para ir. 634 00:35:33,520 --> 00:35:38,003 Quem tem a primeira linha de código para mim - ou as primeiras linhas de código que 635 00:35:38,003 --> 00:35:41,280 que será necessário para satisfazer o nosso primeiro comentar em pseudocódigo? 636 00:35:41,280 --> 00:35:41,985 Você. 637 00:35:41,985 --> 00:35:48,780 >> ALUNO 18: Não deveria ser int argc e char * argv? 638 00:35:48,780 --> 00:35:49,490 >> JASON HIRSCHHORN: Eu acho que você está certo. 639 00:35:49,490 --> 00:35:56,270 Vamos mudá-lo para int principais, parêntese aberto, int argc, vírgula, char * argv? 640 00:35:56,270 --> 00:35:57,150 Assim? 641 00:35:57,150 --> 00:35:57,410 >> ALUNO 18: Suportes. 642 00:35:57,410 --> 00:35:58,260 >> JASON HIRSCHHORN: Suportes. 643 00:35:58,260 --> 00:35:59,860 Abrir suporte, perto do suporte, perto do pai. 644 00:35:59,860 --> 00:36:00,240 Perfeito. 645 00:36:00,240 --> 00:36:02,160 Agora eu posso ter argumentos de linha de comando. 646 00:36:02,160 --> 00:36:02,430 OK. 647 00:36:02,430 --> 00:36:04,250 Certifique-se de que está dado dois arquivos. 648 00:36:04,250 --> 00:36:07,905 Você pode me dar isso também. 649 00:36:07,905 --> 00:36:09,180 >> ALUNO 18: Se argc - 650 00:36:09,180 --> 00:36:11,060 este não é igual 3. 651 00:36:11,060 --> 00:36:14,360 >> JASON HIRSCHHORN: Se parêntese aberto O argc não igual a 3? 652 00:36:14,360 --> 00:36:16,970 >> ALUNO 18: Sim, você retornar 1 ou nada. 653 00:36:16,970 --> 00:36:17,460 >> JASON HIRSCHHORN: Desculpe. 654 00:36:17,460 --> 00:36:19,120 >> ALUNO 18: Return 1 ou nada. 655 00:36:19,120 --> 00:36:20,270 >> JASON HIRSCHHORN: Return 1. 656 00:36:20,270 --> 00:36:22,230 OK? 657 00:36:22,230 --> 00:36:22,970 Grande. 658 00:36:22,970 --> 00:36:24,290 Abra os dois arquivos. 659 00:36:24,290 --> 00:36:26,160 Quem pode me ajudar a abrir os arquivos? 660 00:36:26,160 --> 00:36:28,125 Quem não me deu código ainda? 661 00:36:28,125 --> 00:36:31,510 662 00:36:31,510 --> 00:36:32,320 Kurt? 663 00:36:32,320 --> 00:36:36,145 >> KURT: Então, todas as tampas F-I-L-E Fonte estrela. 664 00:36:36,145 --> 00:36:39,390 665 00:36:39,390 --> 00:36:40,920 >> JASON HIRSCHHORN: Eu vou para tirar as vogais. 666 00:36:40,920 --> 00:36:41,570 Aqueles são legais. 667 00:36:41,570 --> 00:36:42,716 É como Tumblr. 668 00:36:42,716 --> 00:36:44,610 >> ALUNO 18: Igual fopen - 669 00:36:44,610 --> 00:36:46,612 >> JASON HIRSCHHORN: Igual fopen? 670 00:36:46,612 --> 00:36:49,870 >> ALUNO 18: parêntese aberto, argv, suporte aberto. 671 00:36:49,870 --> 00:36:50,055 >> JASON HIRSCHHORN: Espere. 672 00:36:50,055 --> 00:36:50,240 Desculpe. 673 00:36:50,240 --> 00:36:51,050 Abrir parêntese. 674 00:36:51,050 --> 00:36:51,456 OK. 675 00:36:51,456 --> 00:36:53,080 >> ALUNO 18: Yeah. 676 00:36:53,080 --> 00:36:55,110 Argv sub 1. 677 00:36:55,110 --> 00:36:55,860 >> JASON HIRSCHHORN: Sub 1? 678 00:36:55,860 --> 00:36:56,140 >> ALUNO 18: Yeah. 679 00:36:56,140 --> 00:36:58,540 Argv suporte aberto 1 - 680 00:36:58,540 --> 00:36:59,730 Sim. 681 00:36:59,730 --> 00:37:06,470 E, em seguida vírgula, e em seguida, abra o dobro citação, r, aspas duplas, 682 00:37:06,470 --> 00:37:08,250 paren próximos, ponto e vírgula. 683 00:37:08,250 --> 00:37:09,450 >> JASON HIRSCHHORN: Sweet. 684 00:37:09,450 --> 00:37:10,950 E sobre o outro? 685 00:37:10,950 --> 00:37:16,030 >> ALUNO 18: Muito semelhante, mas em vez de S-R-C, você diria que é D-S-T. 686 00:37:16,030 --> 00:37:17,060 >> JASON HIRSCHHORN: Oo! 687 00:37:17,060 --> 00:37:17,772 Eu gosto disso. 688 00:37:17,772 --> 00:37:20,010 >> ALUNO 18: Apenas D-S-T. É. 689 00:37:20,010 --> 00:37:23,057 E, em seguida, argv, suporte aberto, 2. 690 00:37:23,057 --> 00:37:23,200 É. 691 00:37:23,200 --> 00:37:26,720 E, em seguida, em vez de w r. 692 00:37:26,720 --> 00:37:27,620 É. 693 00:37:27,620 --> 00:37:29,630 >> JASON HIRSCHHORN: Ótimo. 694 00:37:29,630 --> 00:37:31,360 Próxima par de linhas. 695 00:37:31,360 --> 00:37:34,040 Além disso, se alguém tem coisas a acrescentar ao linhas que fizemos, não hesite em 696 00:37:34,040 --> 00:37:35,690 adicione-as também. 697 00:37:35,690 --> 00:37:37,520 Verifique se não é NULL. 698 00:37:37,520 --> 00:37:41,450 Quem pode me dar o código que eu preciso satisfazer essa linha de pseudocódigo? 699 00:37:41,450 --> 00:37:44,430 700 00:37:44,430 --> 00:37:45,870 Archer. 701 00:37:45,870 --> 00:37:58,645 >> ARCHER: Se src igual iguais NULL ou dst iguais iguais 702 00:37:58,645 --> 00:38:04,590 NULL, então você voltar - 703 00:38:04,590 --> 00:38:07,130 704 00:38:07,130 --> 00:38:07,976 >> JASON HIRSCHHORN: O quê? 705 00:38:07,976 --> 00:38:08,890 >> ARCHER: Return 2? 706 00:38:08,890 --> 00:38:09,760 >> JASON HIRSCHHORN: Return 2. 707 00:38:09,760 --> 00:38:14,400 Então, se parêntese aberto src igual é igual a NULL, ou - 708 00:38:14,400 --> 00:38:15,590 seja lá o que thing's - cachimbo? 709 00:38:15,590 --> 00:38:16,346 Cachimbo? 710 00:38:16,346 --> 00:38:17,140 Vamos chamá-lo de tubulação. 711 00:38:17,140 --> 00:38:22,340 Pipe, cachimbo, dst iguais iguais NULL, o retorno 2. 712 00:38:22,340 --> 00:38:23,900 OK? 713 00:38:23,900 --> 00:38:26,060 Até que nós estamos fora de bytes - 714 00:38:26,060 --> 00:38:29,820 nós meio que pulou essa etapa de a parte pseudocódigo para ir para aqui. 715 00:38:29,820 --> 00:38:31,970 >> Mas até que estamos fora de bytes - o que isso parece? 716 00:38:31,970 --> 00:38:34,680 Que tipo de estrutura C - 717 00:38:34,680 --> 00:38:36,160 mas eu não usar a estrutura da palavra, porque nós vamos começar a usar 718 00:38:36,160 --> 00:38:37,350 que em outros casos - 719 00:38:37,350 --> 00:38:39,495 mas ferramenta C é que o som como? 720 00:38:39,495 --> 00:38:39,970 >> ALUNO 19: Um laço. 721 00:38:39,970 --> 00:38:40,980 >> JASON HIRSCHHORN: Um loop. 722 00:38:40,980 --> 00:38:43,060 Soa como um loop. 723 00:38:43,060 --> 00:38:49,670 Então, quem pode me dar a primeira linha do código de loop aqui? 724 00:38:49,670 --> 00:38:56,320 725 00:38:56,320 --> 00:39:01,980 Você também pode escolher o tipo de loop que você quer, se você me der 726 00:39:01,980 --> 00:39:03,215 esta linha de código. 727 00:39:03,215 --> 00:39:04,150 Existem três tipos. 728 00:39:04,150 --> 00:39:06,530 Você começa a escolher. 729 00:39:06,530 --> 00:39:08,080 Gostaria de sugerir um desses. 730 00:39:08,080 --> 00:39:08,410 Avi. 731 00:39:08,410 --> 00:39:09,230 Qual deles você quer? 732 00:39:09,230 --> 00:39:09,960 >> AVI: FOR. 733 00:39:09,960 --> 00:39:11,460 >> JASON HIRSCHHORN: FOR. 734 00:39:11,460 --> 00:39:15,180 >> AVI: int i é igual a zero. 735 00:39:15,180 --> 00:39:17,360 >> JASON HIRSCHHORN: OK. 736 00:39:17,360 --> 00:39:18,570 >> AVI: Esta parte eu não tenho certeza. 737 00:39:18,570 --> 00:39:29,080 Mas i é menos do que o tamanho de fonte de estrela? 738 00:39:29,080 --> 00:39:31,128 Eu não tenho certeza disso. 739 00:39:31,128 --> 00:39:32,580 >> JASON HIRSCHHORN: OK. 740 00:39:32,580 --> 00:39:35,870 >> AVI: Porque você quer a tamanho de um arquivo, certo? 741 00:39:35,870 --> 00:39:41,090 >> JASON HIRSCHHORN: Então, isso provavelmente não vai dá-nos o tamanho do real 742 00:39:41,090 --> 00:39:43,010 arquivo em bytes. 743 00:39:43,010 --> 00:39:47,680 Então o que mais poderíamos fazer? 744 00:39:47,680 --> 00:39:48,810 O que é um outro tipo de loop? 745 00:39:48,810 --> 00:39:50,180 Ou devemos ficar com o loop FOR? 746 00:39:50,180 --> 00:39:55,350 747 00:39:55,350 --> 00:39:57,900 >> ALUNO 20: Você poderia fazer um loop WHILE? 748 00:39:57,900 --> 00:40:01,350 E então, o que você faria se you'd - 749 00:40:01,350 --> 00:40:03,930 porque temos um char * para o arquivo. 750 00:40:03,930 --> 00:40:07,950 Então, se nós apenas continuar incrementando que até que gostaria de encontrar o caractere NULL em 751 00:40:07,950 --> 00:40:08,500 o fim de tudo? 752 00:40:08,500 --> 00:40:11,130 Ou não, é que não como os arquivos de trabalho? 753 00:40:11,130 --> 00:40:14,300 >> JASON HIRSCHHORN: Então podemos manter incrementando o char * 754 00:40:14,300 --> 00:40:16,340 até encontrarmos o NULL - 755 00:40:16,340 --> 00:40:18,580 >> ALUNO 20: Essencialmente continuar caractere por caractere até chegarmos 756 00:40:18,580 --> 00:40:21,250 o fim do ficheiro. 757 00:40:21,250 --> 00:40:21,600 >> JASON HIRSCHHORN: sim. 758 00:40:21,600 --> 00:40:22,560 Então é isso que nós queremos fazer. 759 00:40:22,560 --> 00:40:24,545 Queremos manter a leitura, caráter pela personagem, até chegarmos ao 760 00:40:24,545 --> 00:40:25,080 o fim do ficheiro. 761 00:40:25,080 --> 00:40:25,375 >> ALUNO 20: Yeah. 762 00:40:25,375 --> 00:40:25,860 Encontre - 763 00:40:25,860 --> 00:40:28,540 o que é o fim ou sinal de parada no final de um ficheiro de texto. 764 00:40:28,540 --> 00:40:28,620 >> JASON HIRSCHHORN: OK. 765 00:40:28,620 --> 00:40:30,140 Assim, quando chegar ao fim do arquivo - como sabemos que chegamos 766 00:40:30,140 --> 00:40:33,200 o fim de um arquivo? 767 00:40:33,200 --> 00:40:34,710 Se eu estou chamando - 768 00:40:34,710 --> 00:40:35,910 então vamos dar um passo atrás. 769 00:40:35,910 --> 00:40:37,550 O que é uma função? 770 00:40:37,550 --> 00:40:39,360 Vamos para essa linha aqui. 771 00:40:39,360 --> 00:40:40,630 Leia a partir do arquivo de origem. 772 00:40:40,630 --> 00:40:41,880 Quem pode me dar essa linha de código? 773 00:40:41,880 --> 00:40:45,592 774 00:40:45,592 --> 00:40:47,590 >> ALUNO 21: fscanf? 775 00:40:47,590 --> 00:40:49,110 >> JASON HIRSCHHORN: fscanf. 776 00:40:49,110 --> 00:40:49,510 OK. 777 00:40:49,510 --> 00:40:52,240 E se eu quiser ler, muito especificamente, um byte? 778 00:40:52,240 --> 00:40:55,012 779 00:40:55,012 --> 00:40:56,860 >> ALUNO 21: Eu não sei. 780 00:40:56,860 --> 00:40:57,110 >> JASON HIRSCHHORN: OK. 781 00:40:57,110 --> 00:40:59,380 Mesmo mais simples do que fscanf - o que é um - 782 00:40:59,380 --> 00:41:01,890 Eu quero ler a partir de um arquivo de origem? 783 00:41:01,890 --> 00:41:03,720 Ler de um arquivo de origem. 784 00:41:03,720 --> 00:41:04,850 O que é uma função - sim. 785 00:41:04,850 --> 00:41:05,380 >> ALUNO 22: É fread? 786 00:41:05,380 --> 00:41:06,070 >> JASON HIRSCHHORN: Fread. 787 00:41:06,070 --> 00:41:07,550 Eu acho que vamos ficar com que um por agora. 788 00:41:07,550 --> 00:41:10,380 789 00:41:10,380 --> 00:41:13,650 Que tipo de argumentos fread não tomar? 790 00:41:13,650 --> 00:41:17,410 >> ALUNO 22: Provavelmente o tipo de arquivo, e localização no arquivo? 791 00:41:17,410 --> 00:41:19,550 >> JASON HIRSCHHORN: O que posso escrever aqui para descobrir qual o tipo de argumentos 792 00:41:19,550 --> 00:41:20,950 fread leva? 793 00:41:20,950 --> 00:41:23,710 >> ESTUDANTES múltiplos: Homem fread. 794 00:41:23,710 --> 00:41:24,740 >> JASON HIRSCHHORN: Homem fread e fwrite. 795 00:41:24,740 --> 00:41:25,980 Parece que eles saem juntos. 796 00:41:25,980 --> 00:41:29,589 Então fread leva quantos argumentos? 797 00:41:29,589 --> 00:41:30,920 >> ALUNO 23: Quatro. 798 00:41:30,920 --> 00:41:32,690 >> JASON HIRSCHHORN: Demora quatro argumentos. 799 00:41:32,690 --> 00:41:41,100 É preciso um ponteiro, um tamanho, e que coisa, o que é estranho, e alguns arquivos. 800 00:41:41,100 --> 00:41:42,000 OK? 801 00:41:42,000 --> 00:41:43,990 Vamos ler sobre isso aqui. 802 00:41:43,990 --> 00:41:49,370 "A função fread lê n memb elementos de dados, cada um de tamanho bytes 803 00:41:49,370 --> 00:41:53,840 de comprimento, a partir do fluxo apontado por transmitir, armazenando-os no local 804 00:41:53,840 --> 00:41:56,170 dada pelo ponteiro ". 805 00:41:56,170 --> 00:41:57,960 >> Então, quatro argumentos. 806 00:41:57,960 --> 00:42:04,510 Por que não posso simplesmente copiar isso, e colá-lo aqui. 807 00:42:04,510 --> 00:42:10,060 808 00:42:10,060 --> 00:42:10,770 OK. 809 00:42:10,770 --> 00:42:13,673 Então, quem pode começar a preencher estes argumentos para mim? 810 00:42:13,673 --> 00:42:15,840 Avi. 811 00:42:15,840 --> 00:42:17,720 >> AVI: Retire o vazio. 812 00:42:17,720 --> 00:42:20,530 Coloque apenas src. 813 00:42:20,530 --> 00:42:23,142 Retire do ponteiro e da estrela. 814 00:42:23,142 --> 00:42:26,102 Coloque src. 815 00:42:26,102 --> 00:42:27,050 Então - 816 00:42:27,050 --> 00:42:28,500 >> JASON HIRSCHHORN: Então eu vou parar você lá, porque isso é incorreto. 817 00:42:28,500 --> 00:42:32,590 818 00:42:32,590 --> 00:42:34,710 Você está certo com o src, mas onde deve src ir? 819 00:42:34,710 --> 00:42:35,960 >> [VOZES interpondo] 820 00:42:35,960 --> 00:42:38,976 821 00:42:38,976 --> 00:42:41,610 >> JASON HIRSCHHORN: deve passar por cima aqui. 822 00:42:41,610 --> 00:42:43,790 Esse é o src - nosso src é um tipo. 823 00:42:43,790 --> 00:42:44,610 Vamos dar uma olhada aqui. 824 00:42:44,610 --> 00:42:49,610 Isso é pedir para um tipo FILE *, nós na verdade, normalmente vê-los assim. 825 00:42:49,610 --> 00:42:57,630 Então, isso é pedir para um argumento de tipo de arquivo * chamado córrego que é src. 826 00:42:57,630 --> 00:42:58,480 OK? 827 00:42:58,480 --> 00:43:00,410 >> O tamanho das coisas fazer queremos ler? 828 00:43:00,410 --> 00:43:03,340 Eu te dei isso no descrição do problema. 829 00:43:03,340 --> 00:43:04,370 >> ALUNO 24: Um byte de cada vez. 830 00:43:04,370 --> 00:43:05,340 >> JASON HIRSCHHORN: Um byte. 831 00:43:05,340 --> 00:43:08,205 Qual é o tamanho de um byte? 832 00:43:08,205 --> 00:43:11,642 Seu tamanho é em bytes, então o que Eu posso colocar ali? 833 00:43:11,642 --> 00:43:12,910 >> ALUNO 25: Uma. 834 00:43:12,910 --> 00:43:14,730 >> JASON HIRSCHHORN: Uma. 835 00:43:14,730 --> 00:43:17,020 Certo. 836 00:43:17,020 --> 00:43:19,940 O seu tamanho é de byte unidade, então 1 é um byte. 837 00:43:19,940 --> 00:43:22,284 Quantos eu quero ler de uma vez. 838 00:43:22,284 --> 00:43:23,520 >> ALUNO 26: One? 839 00:43:23,520 --> 00:43:24,270 >> JASON HIRSCHHORN: Uma coisa. 840 00:43:24,270 --> 00:43:28,540 Quero ler uma coisa do tamanho 1, uma mordida de cada vez. 841 00:43:28,540 --> 00:43:32,110 E onde é que eu colocá-lo, uma vez que eu ler? 842 00:43:32,110 --> 00:43:35,050 843 00:43:35,050 --> 00:43:36,510 >> ALUNO 27: Destino? 844 00:43:36,510 --> 00:43:39,270 >> JASON HIRSCHHORN: Então, eu não posso colocar lo em linha reta em destino. 845 00:43:39,270 --> 00:43:40,800 >> ALUNO 28: Você vai colocar lo em um terceiro ponteiro? 846 00:43:40,800 --> 00:43:41,780 >> ALUNO 27: para o destino. 847 00:43:41,780 --> 00:43:42,270 >> JASON HIRSCHHORN: OK. 848 00:43:42,270 --> 00:43:42,630 É. 849 00:43:42,630 --> 00:43:46,820 >> ALUNO 29: Você pode declarar algo a actuar como um armazenamento temporário anteriormente. 850 00:43:46,820 --> 00:43:47,350 >> JASON HIRSCHHORN: OK. 851 00:43:47,350 --> 00:43:50,080 Dá-me isso. 852 00:43:50,080 --> 00:43:53,930 >> ALUNO 29: Outro arquivo ponteiro, talvez? 853 00:43:53,930 --> 00:43:54,220 >> JASON HIRSCHHORN: OK. 854 00:43:54,220 --> 00:43:55,585 Portanto, esta é estrela vazio - 855 00:43:55,585 --> 00:43:57,750 é um tipo void estrela, para que ele não tem que ser um ponteiro de arquivo. 856 00:43:57,750 --> 00:44:02,520 E se eu estou lendo um byte, onde seria um bom lugar 857 00:44:02,520 --> 00:44:03,850 para armazenar um byte? 858 00:44:03,850 --> 00:44:04,660 >> ALUNO 29: Uma matriz? 859 00:44:04,660 --> 00:44:05,770 >> JASON HIRSCHHORN: Uma matriz. 860 00:44:05,770 --> 00:44:07,730 OK. 861 00:44:07,730 --> 00:44:14,040 E o que mais é algo que é apenas o tamanho de um byte? 862 00:44:14,040 --> 00:44:16,980 863 00:44:16,980 --> 00:44:18,060 >> ALUNO 30: A char *? 864 00:44:18,060 --> 00:44:18,530 >> ALUNO 29: Yeah. 865 00:44:18,530 --> 00:44:19,880 >> JASON HIRSCHHORN: Um char * não é um byte. 866 00:44:19,880 --> 00:44:20,440 >> ALUNO 29: um char. 867 00:44:20,440 --> 00:44:21,810 >> JASON HIRSCHHORN: Um char é um byte. 868 00:44:21,810 --> 00:44:22,920 Certo? 869 00:44:22,920 --> 00:44:26,740 Então, vamos chamar este buffer é um genérico nome usado para essas coisas para guardar 870 00:44:26,740 --> 00:44:27,910 algo temporariamente. 871 00:44:27,910 --> 00:44:30,880 Então eu criar um buffer. 872 00:44:30,880 --> 00:44:31,150 Certo? 873 00:44:31,150 --> 00:44:32,990 Mas é preciso ser um void *. 874 00:44:32,990 --> 00:44:38,660 Então, talvez você está certo, que ele deve ser um tampão de tamanho 0. 875 00:44:38,660 --> 00:44:41,070 Então, ele armazena um - 876 00:44:41,070 --> 00:44:41,280 direita. 877 00:44:41,280 --> 00:44:43,560 >> Porque isso aqui - caractere buffer é um personagem, mas 878 00:44:43,560 --> 00:44:45,110 isso leva um void * - 879 00:44:45,110 --> 00:44:45,870 um ponteiro. 880 00:44:45,870 --> 00:44:50,640 Então, eu poderia fazer isso e agora buffer é um ponteiro. 881 00:44:50,640 --> 00:44:53,214 O que mais eu poderia fazer? 882 00:44:53,214 --> 00:44:55,775 >> ALUNO 31: Coloque uma estrela ao lado para char. 883 00:44:55,775 --> 00:44:58,380 >> JASON HIRSCHHORN: eu poderia tê-lo criado char *. 884 00:44:58,380 --> 00:45:00,216 OK. 885 00:45:00,216 --> 00:45:03,131 O que é outra coisa que eu poderia fazer? 886 00:45:03,131 --> 00:45:04,050 Ou vamos com este. 887 00:45:04,050 --> 00:45:05,740 Char * buffer, então o que posso colocar aqui? 888 00:45:05,740 --> 00:45:08,290 889 00:45:08,290 --> 00:45:09,310 >> ALUNO 31: Buffer. 890 00:45:09,310 --> 00:45:10,560 >> JASON HIRSCHHORN: Buffer. 891 00:45:10,560 --> 00:45:12,640 892 00:45:12,640 --> 00:45:14,500 Buffer é um ponteiro para um char. 893 00:45:14,500 --> 00:45:19,480 E nesse local, estamos colocando um byte de algo que li. 894 00:45:19,480 --> 00:45:19,980 É. 895 00:45:19,980 --> 00:45:20,700 Avi. 896 00:45:20,700 --> 00:45:21,230 >> AVI: Só uma pergunta rápida. 897 00:45:21,230 --> 00:45:24,440 Você quer malloc tampão? 898 00:45:24,440 --> 00:45:25,930 >> JASON HIRSCHHORN: Quem pode responder a essa pergunta? 899 00:45:25,930 --> 00:45:30,210 >> ALUNO 32: Bem, não realmente ponto para nada agora, então - 900 00:45:30,210 --> 00:45:32,610 >> JASON HIRSCHHORN: Mas fazer queremos malloc isso? 901 00:45:32,610 --> 00:45:35,600 >> ALUNO 32: Se você tivesse que fazê-lo que maneira, eu acho, sim, porque você precisa 902 00:45:35,600 --> 00:45:36,990 algum lugar para ele para apontar para. 903 00:45:36,990 --> 00:45:38,350 >> JASON HIRSCHHORN: Será que tem que malloc isso? 904 00:45:38,350 --> 00:45:40,580 >> ALUNO 33: Se você estiver indo para usá-lo fora do loop. 905 00:45:40,580 --> 00:45:42,524 >> JASON HIRSCHHORN: Será que vamos usá-lo fora do loop? 906 00:45:42,524 --> 00:45:44,392 >> ALUNO 34: Sim. 907 00:45:44,392 --> 00:45:44,860 >> ALUNO 35: Espere. 908 00:45:44,860 --> 00:45:46,980 Queremos declará-la no circuito para além? 909 00:45:46,980 --> 00:45:50,100 >> JASON HIRSCHHORN: Então eu acho que nós temos alguns pseudo loop WHILE aqui que estamos 910 00:45:50,100 --> 00:45:51,950 tentando descobrir o que nós não tivemos ainda. 911 00:45:51,950 --> 00:45:54,710 912 00:45:54,710 --> 00:45:56,010 Nós não precisamos de malloc-lo. 913 00:45:56,010 --> 00:45:59,310 Estamos operando em principal, vai apenas para ser usado dentro deste loop. 914 00:45:59,310 --> 00:46:00,540 Ele não necessita de existir fora deste. 915 00:46:00,540 --> 00:46:02,340 >> Assim, ele pode ser uma variável local. 916 00:46:02,340 --> 00:46:03,925 Você tem um ponteiro para uma variável local. 917 00:46:03,925 --> 00:46:07,984 918 00:46:07,984 --> 00:46:09,590 >> ALUNO 36: Mas não é apontando para qualquer coisa. 919 00:46:09,590 --> 00:46:11,540 >> JASON HIRSCHHORN: Não, não é inicializado para nada. 920 00:46:11,540 --> 00:46:12,790 Mas nós não vamos usá-lo também. 921 00:46:12,790 --> 00:46:15,300 Vamos colocar algo em que a primeira vez que usá-lo. 922 00:46:15,300 --> 00:46:16,580 Assim que parece OK. 923 00:46:16,580 --> 00:46:17,780 Então, nós não precisamos de malloc aqui. 924 00:46:17,780 --> 00:46:19,360 E eu acho que é OK como está. 925 00:46:19,360 --> 00:46:24,350 926 00:46:24,350 --> 00:46:25,790 OK. 927 00:46:25,790 --> 00:46:27,190 Temos a linha fread. 928 00:46:27,190 --> 00:46:28,490 Vamos fazer a próxima linha. 929 00:46:28,490 --> 00:46:32,984 >> Se queremos gravar em um arquivo, o que é uma boa função para usar para fazer isso? 930 00:46:32,984 --> 00:46:33,770 >> ALUNO 37: fwrite? 931 00:46:33,770 --> 00:46:35,140 >> ALUNO 38: fprintf? 932 00:46:35,140 --> 00:46:36,010 >> JASON HIRSCHHORN: fprintf é um deles. 933 00:46:36,010 --> 00:46:37,260 O que é mais uma? 934 00:46:37,260 --> 00:46:37,680 >> ALUNO 39: fwrite. 935 00:46:37,680 --> 00:46:38,510 >> JASON HIRSCHHORN: fwrite. 936 00:46:38,510 --> 00:46:41,250 E, para os nossos propósitos, fwrite, que vimos aqui, é 937 00:46:41,250 --> 00:46:42,500 provavelmente a melhor escolha. 938 00:46:42,500 --> 00:46:51,970 939 00:46:51,970 --> 00:46:53,950 Leva quatro argumentos também. 940 00:46:53,950 --> 00:46:57,570 Nishant, você pode dar me os argumentos? 941 00:46:57,570 --> 00:47:00,570 >> Nishant: curso do primeiro um ser apenas tampão. 942 00:47:00,570 --> 00:47:02,210 >> JASON HIRSCHHORN: OK. 943 00:47:02,210 --> 00:47:06,752 >> Nishant: A segunda de só vai ser 1. 944 00:47:06,752 --> 00:47:09,510 Terceiro vai ser 1. 945 00:47:09,510 --> 00:47:11,470 E o quarto vai ser dst. 946 00:47:11,470 --> 00:47:18,010 947 00:47:18,010 --> 00:47:19,550 >> JASON HIRSCHHORN: Alguém tem qualquer dúvida sobre essa linha? 948 00:47:19,550 --> 00:47:28,370 949 00:47:28,370 --> 00:47:29,130 Isso parece bom. 950 00:47:29,130 --> 00:47:29,590 OK. 951 00:47:29,590 --> 00:47:34,250 Então, agora parece que a única coisa que estamos falta - na verdade, vamos escrever 952 00:47:34,250 --> 00:47:35,090 esta última linha. 953 00:47:35,090 --> 00:47:36,300 Feche os arquivos. 954 00:47:36,300 --> 00:47:38,880 Quem pode concluir-nos a escrita estas duas últimas linhas? 955 00:47:38,880 --> 00:47:39,120 Sim. 956 00:47:39,120 --> 00:47:39,850 Desculpe, qual é o seu nome? 957 00:47:39,850 --> 00:47:40,580 >> LUCY: Lucy. 958 00:47:40,580 --> 00:47:41,580 >> JASON HIRSCHHORN: Lucy. 959 00:47:41,580 --> 00:47:47,560 >> LUCY: src fclose e depois fclose destino. 960 00:47:47,560 --> 00:47:52,430 >> JASON HIRSCHHORN: fclose, parêntese aberto, src, paren próximos, ponto e vírgula. 961 00:47:52,430 --> 00:47:53,680 E fclose - 962 00:47:53,680 --> 00:47:57,560 963 00:47:57,560 --> 00:47:58,090 É mesmo? 964 00:47:58,090 --> 00:48:01,710 >> LUCY: Abrir parênteses, dst e, em seguida, ponto e vírgula. 965 00:48:01,710 --> 00:48:02,520 >> JASON HIRSCHHORN: Ótimo. 966 00:48:02,520 --> 00:48:04,338 E o que devo incluir no final? 967 00:48:04,338 --> 00:48:05,210 >> LUCY: Return 0. 968 00:48:05,210 --> 00:48:05,570 >> JASON HIRSCHHORN: Return 0. 969 00:48:05,570 --> 00:48:06,820 Eu tenho que? 970 00:48:06,820 --> 00:48:10,560 971 00:48:10,560 --> 00:48:12,590 Só uma pergunta. 972 00:48:12,590 --> 00:48:14,957 Temos que incluir return 0? 973 00:48:14,957 --> 00:48:16,240 >> ESTUDANTES MÚLTIPLAS: Não. 974 00:48:16,240 --> 00:48:16,430 >> JASON HIRSCHHORN: Não. 975 00:48:16,430 --> 00:48:18,090 Principal faz isso automaticamente se você chegar ao final. 976 00:48:18,090 --> 00:48:20,580 Mas eu acho que é bom incluí-lo explicitamente. 977 00:48:20,580 --> 00:48:23,860 Especialmente quando estamos voltando outro as coisas ao longo do programa. 978 00:48:23,860 --> 00:48:24,810 OK. 979 00:48:24,810 --> 00:48:26,230 Isto é o que está faltando - 980 00:48:26,230 --> 00:48:28,520 Enquanto o que? 981 00:48:28,520 --> 00:48:31,630 Quem pode pensar em alguma - 982 00:48:31,630 --> 00:48:35,240 tem alguma noção do que coisas poderia entrar lá? 983 00:48:35,240 --> 00:48:37,350 Mesmo que seja apenas em um pseudocódigo como a linguagem? 984 00:48:37,350 --> 00:48:41,330 >> O que estamos realmente - o que queremos ir até? 985 00:48:41,330 --> 00:48:41,980 Sim, Lucy. 986 00:48:41,980 --> 00:48:43,240 >> LUCY: O fim do arquivo. 987 00:48:43,240 --> 00:48:44,990 >> JASON HIRSCHHORN: O fim do arquivo. 988 00:48:44,990 --> 00:48:49,280 Então, o que você quer dizer com o fim do arquivo? 989 00:48:49,280 --> 00:48:50,955 >> LUCY: Quando chegar ao final do arquivo, pare. 990 00:48:50,955 --> 00:48:51,240 >> JASON HIRSCHHORN: OK. 991 00:48:51,240 --> 00:48:53,460 Assim, uma vez chegamos ao final do arquivo. 992 00:48:53,460 --> 00:48:56,893 Como sabemos quando chegamos o fim do ficheiro? 993 00:48:56,893 --> 00:48:59,900 >> ALUNO 40: Eu acho tampão será definido como NULL. 994 00:48:59,900 --> 00:49:01,885 >> ALUNO 41: Buffer é declarado dentro do loop. 995 00:49:01,885 --> 00:49:03,670 >> JASON HIRSCHHORN: Então você acha buffer será definido como NULL. 996 00:49:03,670 --> 00:49:05,850 Por que o buffer ser definido como NULL? 997 00:49:05,850 --> 00:49:10,420 >> ALUNO 40: Porque quando você fread, você está tentando colocar 998 00:49:10,420 --> 00:49:13,528 nada em buffer. 999 00:49:13,528 --> 00:49:13,980 >> JASON HIRSCHHORN: OK. 1000 00:49:13,980 --> 00:49:15,550 Então você está pensando fread - 1001 00:49:15,550 --> 00:49:19,000 quando chegamos ao final do arquivo, o que é fread vai fazer? 1002 00:49:19,000 --> 00:49:21,230 Acho que essa é a questão temos de descobrir. 1003 00:49:21,230 --> 00:49:21,960 O que fread fazer? 1004 00:49:21,960 --> 00:49:25,640 Será que colocar NULL no buffer, ou ele faz outra coisa? 1005 00:49:25,640 --> 00:49:27,510 Como podemos descobrir o que ele faz? 1006 00:49:27,510 --> 00:49:28,190 >> ALUNO 42: Homem. 1007 00:49:28,190 --> 00:49:28,810 >> JASON HIRSCHHORN: Homem. 1008 00:49:28,810 --> 00:49:32,280 Então, vamos olhar para aqui. 1009 00:49:32,280 --> 00:49:34,000 Valor de retorno. 1010 00:49:34,000 --> 00:49:39,620 Em caso de sucesso, fread e fwrite retornar a número de itens lidos ou gravados. 1011 00:49:39,620 --> 00:49:43,700 Este número é igual ao número de bytes transferido apenas quando o tamanho é 1. 1012 00:49:43,700 --> 00:49:47,780 Se ocorrer um erro, ou o fim do arquivo é alcançado, o valor de retorno é um 1013 00:49:47,780 --> 00:49:51,490 contagem de itens curto ou 0. 1014 00:49:51,490 --> 00:49:57,860 >> Assim, para os nossos propósitos, se alcances fread No final do processo, e lê-se a partir de 1015 00:49:57,860 --> 00:50:02,100 o fim do arquivo, não há mais nada de ler, o que é que vai voltar? 1016 00:50:02,100 --> 00:50:03,290 >> ALUNO 43: Zero? 1017 00:50:03,290 --> 00:50:04,540 >> JASON HIRSCHHORN: O quê? 1018 00:50:04,540 --> 00:50:05,300 >> ALUNO 43: Zero? 1019 00:50:05,300 --> 00:50:05,690 >> JASON HIRSCHHORN: Zero. 1020 00:50:05,690 --> 00:50:06,940 Vai retornar zero. 1021 00:50:06,940 --> 00:50:09,360 1022 00:50:09,360 --> 00:50:13,010 Então, nós sabemos que fread, quando temos atingiu o fim do ficheiro, vai 1023 00:50:13,010 --> 00:50:13,690 para voltar a zero. 1024 00:50:13,690 --> 00:50:17,460 Como podemos usar isso a nosso favor? 1025 00:50:17,460 --> 00:50:21,733 >> AVI: Você pode declarar uma variável fora do circuito de chamada de cheque. 1026 00:50:21,733 --> 00:50:27,040 Se a verificação é igual a - 1027 00:50:27,040 --> 00:50:28,190 por enquanto - um. 1028 00:50:28,190 --> 00:50:28,920 >> JASON HIRSCHHORN: OK. 1029 00:50:28,920 --> 00:50:38,050 >> AVI: E então você pode colocar um IF declaração logo após fread dizendo que se 1030 00:50:38,050 --> 00:50:42,600 fread é igual a zero - 1031 00:50:42,600 --> 00:50:43,850 nenhum. 1032 00:50:43,850 --> 00:50:46,002 1033 00:50:46,002 --> 00:50:47,252 >> JASON HIRSCHHORN: Quem pode ajudar Avi fora? 1034 00:50:47,252 --> 00:50:49,690 1035 00:50:49,690 --> 00:50:52,410 >> AVI: Qual é o valor retornado por fread? 1036 00:50:52,410 --> 00:50:54,060 >> JASON HIRSCHHORN: Nós só passou por cima disso. 1037 00:50:54,060 --> 00:50:55,450 >> AVI: Como você representá-lo? 1038 00:50:55,450 --> 00:50:57,190 >> JASON HIRSCHHORN: Então ele retorna - vamos procurar por aqui - ele retorna um 1039 00:50:57,190 --> 00:50:59,340 size_t, que é essencialmente um inteiro. 1040 00:50:59,340 --> 00:51:02,240 1041 00:51:02,240 --> 00:51:03,410 Então, ele retorna um inteiro. 1042 00:51:03,410 --> 00:51:05,160 E no nosso caso, será retornar 1 ou 0 - 1043 00:51:05,160 --> 00:51:08,760 1 se ler uma coisa - um byte, e 0, se tiver chegado ao fim. 1044 00:51:08,760 --> 00:51:13,560 1045 00:51:13,560 --> 00:51:16,450 Então, se fread - 1046 00:51:16,450 --> 00:51:16,855 É mesmo? 1047 00:51:16,855 --> 00:51:20,330 >> ALUNO 45: Você não pode simplesmente colocar o pleno fread (tampão, 1, 1, src) na 1048 00:51:20,330 --> 00:51:21,660 while? 1049 00:51:21,660 --> 00:51:26,510 >> JASON HIRSCHHORN: Então você propõe fazendo isso para lá? 1050 00:51:26,510 --> 00:51:27,600 >> [VOZES interpondo] 1051 00:51:27,600 --> 00:51:29,520 >> JASON HIRSCHHORN: Espere um pouco. 1052 00:51:29,520 --> 00:51:30,885 Então, nós estamos livrando disso. 1053 00:51:30,885 --> 00:51:33,300 Então, você está propondo colocar em fread lá? 1054 00:51:33,300 --> 00:51:35,457 O que devemos também mover se você quer fazer isso? 1055 00:51:35,457 --> 00:51:36,740 >> ALUNO 45: O buffer de fora. 1056 00:51:36,740 --> 00:51:38,110 >> JASON HIRSCHHORN: Devemos também mover este aqui. 1057 00:51:38,110 --> 00:51:41,700 >> ALUNO 45: Mas faz isso constantemente movê-lo para a frente? 1058 00:51:41,700 --> 00:51:42,950 >> [VOZES interpondo] 1059 00:51:42,950 --> 00:51:46,540 1060 00:51:46,540 --> 00:51:47,470 >> JASON HIRSCHHORN: OK. 1061 00:51:47,470 --> 00:51:50,570 Então é isso que Okshar proposto. 1062 00:51:50,570 --> 00:51:51,930 Nós criamos o nosso buffer. 1063 00:51:51,930 --> 00:51:57,020 Nós ENQUANTO fread, então nós fwrite. 1064 00:51:57,020 --> 00:51:59,760 Pensa sobre isso? 1065 00:51:59,760 --> 00:52:04,050 >> ALUNO 46: Minha única pergunta é: seria ele realmente executar o comando fread? 1066 00:52:04,050 --> 00:52:06,175 >> JASON HIRSCHHORN: Ótima pergunta. 1067 00:52:06,175 --> 00:52:11,050 Quando você está colocando uma chamada de função dentro de uma condição, de que faz 1068 00:52:11,050 --> 00:52:12,300 chamada de função executar? 1069 00:52:12,300 --> 00:52:15,760 1070 00:52:15,760 --> 00:52:17,770 Nós já vimos exemplos disso antes. 1071 00:52:17,770 --> 00:52:24,900 1072 00:52:24,900 --> 00:52:25,660 Certo? 1073 00:52:25,660 --> 00:52:26,125 >> ALUNO 46: OK. 1074 00:52:26,125 --> 00:52:26,590 É. 1075 00:52:26,590 --> 00:52:30,140 Então ele faz executar. 1076 00:52:30,140 --> 00:52:31,790 >> JASON HIRSCHHORN: Temos visto coisas assim antes, onde temos uma 1077 00:52:31,790 --> 00:52:33,550 chamada de função dentro de uma condição. 1078 00:52:33,550 --> 00:52:35,540 Será que essa chamada de função executar? 1079 00:52:35,540 --> 00:52:36,350 Sim. 1080 00:52:36,350 --> 00:52:37,410 Portanto, a resposta é sim. 1081 00:52:37,410 --> 00:52:41,010 Esta chamada de função será executada. 1082 00:52:41,010 --> 00:52:42,418 Mas, novamente, é isso o que queremos? 1083 00:52:42,418 --> 00:52:49,250 1084 00:52:49,250 --> 00:52:52,204 >> O que é uma maneira que nós poderíamos imaginar se é o que queremos? 1085 00:52:52,204 --> 00:52:53,470 >> ESTUDANTES múltiplos: Execute-o? 1086 00:52:53,470 --> 00:52:54,460 >> JASON HIRSCHHORN: Podemos executá-lo. 1087 00:52:54,460 --> 00:52:57,500 Mas antes de fazer isso, poderíamos também raciocinar por isso. 1088 00:52:57,500 --> 00:52:57,920 Se - 1089 00:52:57,920 --> 00:53:01,920 dizer que temos um byte em nossa arquivo, nós vamos chegar até aqui, 1090 00:53:01,920 --> 00:53:02,660 nós vamos chegar a este código. 1091 00:53:02,660 --> 00:53:03,620 Este será executado. 1092 00:53:03,620 --> 00:53:07,780 fread retornará um byte e armazená-lo no buffer. 1093 00:53:07,780 --> 00:53:11,290 E isso vai avaliar para 1, direito, depois que ele retorna 1. 1094 00:53:11,290 --> 00:53:12,640 >> Assim, enquanto a 1. 1095 00:53:12,640 --> 00:53:15,325 Isso significa que o código dentro o loop WHILE será executado? 1096 00:53:15,325 --> 00:53:15,453 >> ALUNO 47: Yeah. 1097 00:53:15,453 --> 00:53:16,040 É verdade. 1098 00:53:16,040 --> 00:53:16,290 >> JASON HIRSCHHORN: sim. 1099 00:53:16,290 --> 00:53:17,490 1 é verdadeiro. 1100 00:53:17,490 --> 00:53:18,240 Não é 0. 1101 00:53:18,240 --> 00:53:20,360 Assim, o código aqui dentro será executado. 1102 00:53:20,360 --> 00:53:22,300 Então vamos escrever isso. 1103 00:53:22,300 --> 00:53:25,340 Nós vamos voltar a este linha mais uma vez. 1104 00:53:25,340 --> 00:53:26,850 Agora temos - 1105 00:53:26,850 --> 00:53:28,550 estamos no final do nosso arquivo. 1106 00:53:28,550 --> 00:53:30,980 Lemos a partir do final do nosso arquivo, porque só tinha um byte nela. 1107 00:53:30,980 --> 00:53:34,270 >> Fread retorna 0, lojas algo em tampão. 1108 00:53:34,270 --> 00:53:35,890 Eu honestamente não sei o que ele armazena em buffer. 1109 00:53:35,890 --> 00:53:38,380 Nós provavelmente poderia olhar para cima para ver o que ele faz. 1110 00:53:38,380 --> 00:53:40,130 Que eu sinceramente não sei. 1111 00:53:40,130 --> 00:53:43,090 Nós não sabemos, quem se importa o que ele armazena em tampão? 1112 00:53:43,090 --> 00:53:44,010 Mas isso não retornar 0. 1113 00:53:44,010 --> 00:53:45,440 E será que, enquanto 0 executar? 1114 00:53:45,440 --> 00:53:49,950 1115 00:53:49,950 --> 00:53:51,180 >> ENQUANTO 0 não será executado. 1116 00:53:51,180 --> 00:53:54,030 Então vamos passar por aqui. 1117 00:53:54,030 --> 00:53:58,870 Então, vamos começar um show de mãos, se esta é o código que deve ser executado, ou se 1118 00:53:58,870 --> 00:54:00,140 deve fazer alterações em primeiro lugar. 1119 00:54:00,140 --> 00:54:02,180 Então, se você pensa - você tem que votar. 1120 00:54:02,180 --> 00:54:06,885 Se você acha que devemos executar este código como é, por favor, levante a mão. 1121 00:54:06,885 --> 00:54:12,440 1122 00:54:12,440 --> 00:54:13,400 >> OK. 1123 00:54:13,400 --> 00:54:14,315 Há um - 1124 00:54:14,315 --> 00:54:17,260 você tem uma dúvida, preocupação? 1125 00:54:17,260 --> 00:54:18,080 É. 1126 00:54:18,080 --> 00:54:21,240 >> ALUNO 48: Depois de passarmos tampão fora do loop, nós 1127 00:54:21,240 --> 00:54:22,670 tem que malloc isso? 1128 00:54:22,670 --> 00:54:23,310 >> JASON HIRSCHHORN: Ótima pergunta. 1129 00:54:23,310 --> 00:54:26,670 Depois de passarmos tampão fora do loop, temos que malloc isso? 1130 00:54:26,670 --> 00:54:28,400 Esta é uma questão de escopo. 1131 00:54:28,400 --> 00:54:32,130 Se inicializar o buffer fora deste ciclo, vai existir 1132 00:54:32,130 --> 00:54:33,534 dentro do ciclo? 1133 00:54:33,534 --> 00:54:35,230 >> ESTUDANTES múltiplos: Sim. 1134 00:54:35,230 --> 00:54:35,580 >> JASON HIRSCHHORN: sim. 1135 00:54:35,580 --> 00:54:40,100 O seu âmbito de aplicação abrange dentro do loop, e, realmente, qualquer coisa abaixo dele dentro 1136 00:54:40,100 --> 00:54:42,460 deste código, incluindo a as coisas aqui dentro. 1137 00:54:42,460 --> 00:54:43,930 Então, nós não precisamos malloc-lo. 1138 00:54:43,930 --> 00:54:47,766 É uma variável local, e seu escopo ainda inclui o loop. 1139 00:54:47,766 --> 00:54:49,540 >> ALUNO 49: Será que precisamos para libertá-la? 1140 00:54:49,540 --> 00:54:51,770 >> JASON HIRSCHHORN: Será que precisa buffer livre? 1141 00:54:51,770 --> 00:54:53,860 >> ALUNO 49: Sim, se não o fizermos malloc. 1142 00:54:53,860 --> 00:54:55,750 >> JASON HIRSCHHORN: Será que precisa buffer livre? 1143 00:54:55,750 --> 00:54:57,160 Nós não. 1144 00:54:57,160 --> 00:55:01,280 Novamente, é uma variável local, de modo que não precisamos para libertá-la. 1145 00:55:01,280 --> 00:55:02,170 OK. 1146 00:55:02,170 --> 00:55:03,480 Vamos ver o que acontece. 1147 00:55:03,480 --> 00:55:17,290 1148 00:55:17,290 --> 00:55:18,220 Por isso, é não inicializado. 1149 00:55:18,220 --> 00:55:20,830 Isso foi o que algo que Marcus proposto anteriormente. 1150 00:55:20,830 --> 00:55:25,340 Portanto, temos que o erro, tampão variável é não inicializado quando usados ​​aqui. 1151 00:55:25,340 --> 00:55:26,590 >> Como podemos resolver isso? 1152 00:55:26,590 --> 00:55:29,460 1153 00:55:29,460 --> 00:55:30,960 >> ALUNO 50: malloc isso? 1154 00:55:30,960 --> 00:55:31,770 >> ALUNO 51: Igual a NULL? 1155 00:55:31,770 --> 00:55:33,000 >> ALUNO 52: Diga tampão é igual a NULL. 1156 00:55:33,000 --> 00:55:34,250 >> JASON HIRSCHHORN: OK. 1157 00:55:34,250 --> 00:55:40,040 1158 00:55:40,040 --> 00:55:40,770 Parece bom. 1159 00:55:40,770 --> 00:55:42,410 Temos agora. 1160 00:55:42,410 --> 00:55:45,630 Vamos criar algo para tentar copiar. 1161 00:55:45,630 --> 00:56:08,990 1162 00:56:08,990 --> 00:56:10,490 Então, nós temos o nosso arquivo de texto. 1163 00:56:10,490 --> 00:56:11,740 Como podemos executar este programa? 1164 00:56:11,740 --> 00:56:14,140 1165 00:56:14,140 --> 00:56:15,472 É. 1166 00:56:15,472 --> 00:56:22,230 >> ALUNO 53: Você pode fazer dot cortar cp, teste.txt. 1167 00:56:22,230 --> 00:56:25,140 E então você pode nomear um outro arquivo que vai armazenar a. 1168 00:56:25,140 --> 00:56:25,510 >> JASON HIRSCHHORN: OK. 1169 00:56:25,510 --> 00:56:27,380 Vamos chamá-lo out.txt. 1170 00:56:27,380 --> 00:56:28,630 Legal? 1171 00:56:28,630 --> 00:56:31,700 1172 00:56:31,700 --> 00:56:34,320 Seg culpa. 1173 00:56:34,320 --> 00:56:35,570 Reflexões sobre a falha seg? 1174 00:56:35,570 --> 00:56:40,900 1175 00:56:40,900 --> 00:56:41,390 Isso é ótimo. 1176 00:56:41,390 --> 00:56:45,040 Como podemos descobrir onde a culpa é seg? 1177 00:56:45,040 --> 00:56:45,680 O quê? 1178 00:56:45,680 --> 00:56:45,990 >> ALUNO 54: Gdb. 1179 00:56:45,990 --> 00:56:47,240 >> JASON HIRSCHHORN: Gdb. 1180 00:56:47,240 --> 00:56:51,400 1181 00:56:51,400 --> 00:56:55,300 Corremos gdb escrevendo barra gdb ponto, o nome do nosso programa. 1182 00:56:55,300 --> 00:56:57,020 Não há argumentos de linha de comando lá. 1183 00:56:57,020 --> 00:56:59,570 Vamos definir um ponto de interrupção na principal. 1184 00:56:59,570 --> 00:57:02,190 Se eu quiser começar gdb, o que eu faço? 1185 00:57:02,190 --> 00:57:02,730 >> ALUNO 55: R. 1186 00:57:02,730 --> 00:57:08,910 >> JASON HIRSCHHORN: R. E depois? 1187 00:57:08,910 --> 00:57:09,400 >> ALUNO 55: Os argumentos? 1188 00:57:09,400 --> 00:57:10,650 >> Jason HIRSCHHORN: Em seguida, o argumentos de linha de comando. 1189 00:57:10,650 --> 00:57:15,890 1190 00:57:15,890 --> 00:57:17,120 Vamos examinar. 1191 00:57:17,120 --> 00:57:19,090 N é só me levando linha por linha. 1192 00:57:19,090 --> 00:57:21,450 Eu estou indo para ir até Recebo minha culpa seg. 1193 00:57:21,450 --> 00:57:22,700 Não é minha culpa seg. 1194 00:57:22,700 --> 00:57:24,960 1195 00:57:24,960 --> 00:57:27,875 Parece que fread causado minha culpa seg. 1196 00:57:27,875 --> 00:57:30,570 1197 00:57:30,570 --> 00:57:32,770 Eu sei fread causada por minha culpa seg, porque essa era a 1198 00:57:32,770 --> 00:57:34,950 linha que apenas executado. 1199 00:57:34,950 --> 00:57:36,530 >> E a única coisa que era acontecendo nessa linha - 1200 00:57:36,530 --> 00:57:37,520 duas coisas foram acontecendo. 1201 00:57:37,520 --> 00:57:40,610 Fread estava indo, e depois fomos fazendo alguns testes WHILE. 1202 00:57:40,610 --> 00:57:44,820 Eu estou disposto a apostar que o WHILE verificação não estava causando minha culpa seg. 1203 00:57:44,820 --> 00:57:46,950 Muito provavelmente, fread foi causando minha culpa seg. 1204 00:57:46,950 --> 00:57:49,260 Eu também vejo alguma coisa aqui, memcopy. 1205 00:57:49,260 --> 00:57:50,500 >> Cópia da memória. 1206 00:57:50,500 --> 00:57:53,820 Soa como se movendo de memória um local para o outro. 1207 00:57:53,820 --> 00:57:56,890 Soa como algo que iria acontecer em fread, talvez alguma memória 1208 00:57:56,890 --> 00:57:58,910 mover daqui até aqui. 1209 00:57:58,910 --> 00:58:01,740 1210 00:58:01,740 --> 00:58:03,860 Vamos passar por isso de novo. 1211 00:58:03,860 --> 00:58:06,900 Como faço para começar de novo e executá-lo novamente? 1212 00:58:06,900 --> 00:58:08,092 É. 1213 00:58:08,092 --> 00:58:15,140 >> ALUNO 56: Você precisa colocar um e comercial antes de tampão? 1214 00:58:15,140 --> 00:58:17,800 >> JASON HIRSCHHORN: Então e comercial antes buffer de me dar o endereço de 1215 00:58:17,800 --> 00:58:22,330 buffer, que é um char *. 1216 00:58:22,330 --> 00:58:25,250 Vamos percorrer este mais uma vez. 1217 00:58:25,250 --> 00:58:28,248 Como faço para correr com ele mais uma vez? 1218 00:58:28,248 --> 00:58:29,210 >> ALUNO 57: você pode apenas digite correr novamente? 1219 00:58:29,210 --> 00:58:32,050 >> JASON HIRSCHHORN: Basta digitar correr novamente. 1220 00:58:32,050 --> 00:58:33,415 Então, nós não vamos executar esta linha. 1221 00:58:33,415 --> 00:58:36,250 1222 00:58:36,250 --> 00:58:39,240 Então buffer é um ponteiro NULL. 1223 00:58:39,240 --> 00:58:40,490 Corrija? 1224 00:58:40,490 --> 00:58:45,870 1225 00:58:45,870 --> 00:58:47,060 Ele está apontando para - vamos ver. 1226 00:58:47,060 --> 00:58:48,500 Se nós temos a nossa - 1227 00:58:48,500 --> 00:58:50,430 tirar uma foto rápida deste. 1228 00:58:50,430 --> 00:58:53,500 Toda a gente pode ver se Eu escrevo aqui? 1229 00:58:53,500 --> 00:59:02,890 >> Então, na pilha, temos um local de variável e é chamado de buffer, e 1230 00:59:02,890 --> 00:59:08,230 é um ponteiro para um char. 1231 00:59:08,230 --> 00:59:10,325 O endereço é esse caractere no? 1232 00:59:10,325 --> 00:59:12,550 >> ALUNO 58: 0x0. 1233 00:59:12,550 --> 00:59:13,400 >> JASON HIRSCHHORN: Certo. 1234 00:59:13,400 --> 00:59:14,200 Isso é o que isso é. 1235 00:59:14,200 --> 00:59:17,600 Em aqui, dentro de buffer, é armazenado 0x0. 1236 00:59:17,600 --> 00:59:20,480 Isso é o que nós temos - o configuração que temos agora. 1237 00:59:20,480 --> 00:59:27,540 Então esta linha, fread, coloca algo da fonte onde? 1238 00:59:27,540 --> 00:59:30,560 Dentro dessa caixa ou esta caixa? 1239 00:59:30,560 --> 00:59:31,060 Que caixa? 1240 00:59:31,060 --> 00:59:33,290 Caixa ou caixa direita e esquerda? 1241 00:59:33,290 --> 00:59:34,750 Esta caixa da direita. 1242 00:59:34,750 --> 00:59:38,440 >> Ele segue o ponteiro, e coloca-lo aqui. 1243 00:59:38,440 --> 00:59:42,620 Quando tentamos e memória toque em localização 0, o que é que vamos chegar? 1244 00:59:42,620 --> 00:59:45,050 Uma falha de segmentação. 1245 00:59:45,050 --> 00:59:46,550 Esse é o erro que temos agora. 1246 00:59:46,550 --> 00:59:46,970 É. 1247 00:59:46,970 --> 00:59:48,410 >> ALUNO 59: Você não tem colocar tampão estrela? 1248 00:59:48,410 --> 00:59:49,180 Ou não? 1249 00:59:49,180 --> 00:59:50,050 Para fread? 1250 00:59:50,050 --> 00:59:51,450 >> JASON HIRSCHHORN: Então fread leva um ponteiro. 1251 00:59:51,450 --> 00:59:54,920 1252 00:59:54,920 --> 00:59:55,900 Assim, ele passa em tampão. 1253 00:59:55,900 --> 00:59:58,980 E então ele vai de-referência que em algum lugar dentro fread. 1254 00:59:58,980 --> 01:00:00,700 Mas, novamente, nós vimos, é preciso um ponteiro. 1255 01:00:00,700 --> 01:00:02,560 Nós não precisamos passá-lo tampão estrela. 1256 01:00:02,560 --> 01:00:05,350 Isso seria passar que o que está aqui. 1257 01:00:05,350 --> 01:00:07,980 E que, provavelmente, dar-nos um erro porque estamos des referenciando-lo. 1258 01:00:07,980 --> 01:00:08,150 >> Certo? 1259 01:00:08,150 --> 01:00:10,690 Quando de-referência este ponteiro, quando tentamos acessar este local, 1260 01:00:10,690 --> 01:00:13,140 estamos recebendo um erro - nossa falha de segmentação. 1261 01:00:13,140 --> 01:00:15,800 So - 1262 01:00:15,800 --> 01:00:16,690 oops. 1263 01:00:16,690 --> 01:00:19,090 Nós vamos sair de gdb. 1264 01:00:19,090 --> 01:00:20,160 Nossa linha - 1265 01:00:20,160 --> 01:00:22,990 o nosso problema - é certo aqui nesta linha. 1266 01:00:22,990 --> 01:00:26,410 E é um problema, porque desta linha. 1267 01:00:26,410 --> 01:00:31,780 >> Como podemos criar uma caixa que está acessível em fread. 1268 01:00:31,780 --> 01:00:31,980 Certo? 1269 01:00:31,980 --> 01:00:35,190 Precisamos criar uma caixa que é uma byte grande, o tamanho de um caracter. 1270 01:00:35,190 --> 01:00:38,590 Mas precisamos que a caixa para ser acessível quando esta função é executada. 1271 01:00:38,590 --> 01:00:39,390 Então, onde - 1272 01:00:39,390 --> 01:00:39,640 sim. 1273 01:00:39,640 --> 01:00:40,440 Alguma ideia? 1274 01:00:40,440 --> 01:00:43,615 >> ALUNO 60: Basta configurá-lo como qualquer de caracteres aleatórios. 1275 01:00:43,615 --> 01:00:49,150 1276 01:00:49,150 --> 01:00:51,640 Basta fazer iguais char buffer o personagem. 1277 01:00:51,640 --> 01:00:53,795 E então, quando você tiver buffer de lá - 1278 01:00:53,795 --> 01:00:54,110 >> JASON HIRSCHHORN: Espere. 1279 01:00:54,110 --> 01:00:55,110 Char tampão? 1280 01:00:55,110 --> 01:00:55,880 Então, nenhuma estrela? 1281 01:00:55,880 --> 01:00:56,390 >> ALUNO 60: Yeah. 1282 01:00:56,390 --> 01:00:58,560 Retire a estrela. 1283 01:00:58,560 --> 01:01:00,690 Igual a um personagem aleatório. 1284 01:01:00,690 --> 01:01:01,460 >> JASON HIRSCHHORN: OK. 1285 01:01:01,460 --> 01:01:02,420 Então me dê um. 1286 01:01:02,420 --> 01:01:03,170 >> ALUNO 60: Como um ou algo assim. 1287 01:01:03,170 --> 01:01:06,160 E então quando você tem tampão lá, você usa um - 1288 01:01:06,160 --> 01:01:06,420 >> ALUNO 61: Star? 1289 01:01:06,420 --> 01:01:07,650 Ah, não, o E comercial. 1290 01:01:07,650 --> 01:01:09,000 >> ALUNO 60: Use o comercial. 1291 01:01:09,000 --> 01:01:09,470 >> JASON HIRSCHHORN: OK. 1292 01:01:09,470 --> 01:01:11,320 E o que dizer em fwrite? 1293 01:01:11,320 --> 01:01:14,150 >> ALUNO 60: Use o comercial novamente. 1294 01:01:14,150 --> 01:01:14,320 >> JASON HIRSCHHORN: Tudo bem. 1295 01:01:14,320 --> 01:01:20,970 Portanto, sua idéia é, criamos um char e colocar algo nela, e, em seguida, 1296 01:01:20,970 --> 01:01:22,612 escrever para esse caractere. 1297 01:01:22,612 --> 01:01:23,760 >> ALUNO 60: Yeah. 1298 01:01:23,760 --> 01:01:25,916 >> JASON HIRSCHHORN: O que que as pessoas pensam? 1299 01:01:25,916 --> 01:01:27,770 >> ALUNO 62: É complicado. 1300 01:01:27,770 --> 01:01:28,460 >> JASON HIRSCHHORN: OK. 1301 01:01:28,460 --> 01:01:29,760 Vamos tirá-la. 1302 01:01:29,760 --> 01:01:35,720 Então, desta vez, eu vou chamar isso de vermelho na pilha aqui, e então nós 1303 01:01:35,720 --> 01:01:36,410 terá - 1304 01:01:36,410 --> 01:01:36,822 ooh! 1305 01:01:36,822 --> 01:01:38,060 Desculpe. 1306 01:01:38,060 --> 01:01:45,930 Então, desta vez nós temos uma coisa chamada tampão, e é na pilha. 1307 01:01:45,930 --> 01:01:48,430 Corrija? 1308 01:01:48,430 --> 01:01:51,520 E nós estamos salvando em uma, inicialmente. 1309 01:01:51,520 --> 01:01:53,830 >> Então nós temos o nosso apelo para fread. 1310 01:01:53,830 --> 01:02:01,300 O fread faz é que leva um byte de nosso arquivo e coloca-lo em algum lugar. 1311 01:02:01,300 --> 01:02:04,570 Ela coloca-lo em qualquer que seja o coisa está apontando. 1312 01:02:04,570 --> 01:02:09,130 Bem, antes que nós tivemos este endereço - 1313 01:02:09,130 --> 01:02:10,250 0x0. 1314 01:02:10,250 --> 01:02:13,349 Agora, o endereço que nós temos? 1315 01:02:13,349 --> 01:02:14,650 >> ALUNO 63: Seja qual for tampão endereço é. 1316 01:02:14,650 --> 01:02:15,970 >> JASON HIRSCHHORN: Whatever tampão endereço é. 1317 01:02:15,970 --> 01:02:22,370 Ele provavelmente vai ser algo parecido. 1318 01:02:22,370 --> 01:02:26,950 Provavelmente vai começar com um b e um f, e depois tem outros seis 1319 01:02:26,950 --> 01:02:27,970 dígitos hexadecimais. 1320 01:02:27,970 --> 01:02:28,480 Não importa. 1321 01:02:28,480 --> 01:02:29,470 Alguns endereço. 1322 01:02:29,470 --> 01:02:31,410 E nós estamos passando o endereço dentro 1323 01:02:31,410 --> 01:02:34,790 >> E nós vamos colocar o nosso único coisa byte naquele endereço. 1324 01:02:34,790 --> 01:02:38,470 Então, nós vamos colocar o nosso único byte coisa aqui dentro. 1325 01:02:38,470 --> 01:02:40,800 E então vamos escrever a partir de o que é sempre aqui dentro. 1326 01:02:40,800 --> 01:02:43,425 1327 01:02:43,425 --> 01:02:45,380 Alguém tem alguma dúvida sobre isso? 1328 01:02:45,380 --> 01:02:50,990 1329 01:02:50,990 --> 01:02:54,690 Quem pensa que este código vai funcionar? 1330 01:02:54,690 --> 01:02:56,020 >> Levante a mão se você acha este código vai funcionar. 1331 01:02:56,020 --> 01:02:57,270 Você tem que tomar uma posição. 1332 01:02:57,270 --> 01:03:00,670 1333 01:03:00,670 --> 01:03:02,500 E quem pensa que esse código não vai funcionar? 1334 01:03:02,500 --> 01:03:04,610 Levante sua mão. 1335 01:03:04,610 --> 01:03:06,750 Todo mundo deve ser levantando a mão. 1336 01:03:06,750 --> 01:03:07,670 OK. 1337 01:03:07,670 --> 01:03:09,390 Michael, onde você está de pé? 1338 01:03:09,390 --> 01:03:10,680 >> MICHAEL: Eu não posso decidir. 1339 01:03:10,680 --> 01:03:12,070 Kind of no meio. 1340 01:03:12,070 --> 01:03:12,736 >> JASON HIRSCHHORN: Você é no meio. 1341 01:03:12,736 --> 01:03:13,092 Escolha um. 1342 01:03:13,092 --> 01:03:14,400 >> MICHAEL: Eu vou ter fé e dizer que vai funcionar. 1343 01:03:14,400 --> 01:03:14,660 >> JASON HIRSCHHORN: OK. 1344 01:03:14,660 --> 01:03:16,047 Você vai ter fé e dizem que funciona? 1345 01:03:16,047 --> 01:03:26,490 1346 01:03:26,490 --> 01:03:27,020 O que aconteceu? 1347 01:03:27,020 --> 01:03:28,270 >> [VOZES interpondo] 1348 01:03:28,270 --> 01:03:35,170 1349 01:03:35,170 --> 01:03:35,950 >> JASON HIRSCHHORN: Sem falha seg. 1350 01:03:35,950 --> 01:03:40,320 Como podemos verificar se duas coisas são iguais? 1351 01:03:40,320 --> 01:03:42,060 Dois arquivos são iguais. 1352 01:03:42,060 --> 01:03:43,300 >> ALUNO 64: Dif. 1353 01:03:43,300 --> 01:03:45,490 >> JASON HIRSCHHORN: Dif. 1354 01:03:45,490 --> 01:03:51,630 Cheques Dif para as diferenças entre dois arquivos, e se ele retorna 1355 01:03:51,630 --> 01:03:52,890 nada, eles são idênticos. 1356 01:03:52,890 --> 01:03:59,030 E se abrir, nós temos o nosso arquivo. 1357 01:03:59,030 --> 01:04:00,490 Então essa foi a solução correta. 1358 01:04:00,490 --> 01:04:01,780 Vamos olhar para trás, mais uma vez. 1359 01:04:01,780 --> 01:04:04,080 Na verdade, nem sequer necessário inicializar ele. 1360 01:04:04,080 --> 01:04:05,520 >> Ele provavelmente ficaria um pouco mais limpo, se você não colocou 1361 01:04:05,520 --> 01:04:07,680 algo aleatório lá. 1362 01:04:07,680 --> 01:04:13,070 O ponto é, você precisava criar algum espaço para guardar algo de 1363 01:04:13,070 --> 01:04:15,530 fread e tomar alguma coisa de fwrite. 1364 01:04:15,530 --> 01:04:18,400 E aquela coisa tinha de ser um local de variável na pilha - você 1365 01:04:18,400 --> 01:04:19,890 poderia ter malloc algum espaço. 1366 01:04:19,890 --> 01:04:23,030 >> Então, na verdade, poderia ter malloc escrito aqui, e 1367 01:04:23,030 --> 01:04:25,420 que teria funcionado. 1368 01:04:25,420 --> 01:04:28,660 E, então, teria sido o armazenamento nossas coisas em algum lugar na pilha. 1369 01:04:28,660 --> 01:04:31,940 Mas este é, na verdade, provavelmente, a solução mais elegante. 1370 01:04:31,940 --> 01:04:34,490 Basta criar algum espaço na pilha por estas coisas para ir. 1371 01:04:34,490 --> 01:04:37,690 1372 01:04:37,690 --> 01:04:38,990 >> Eu teria dois outros comentários. 1373 01:04:38,990 --> 01:04:44,650 Se você tivesse que tomar sua vez nesta, e em seguida, se marcou com isso, meus comentários 1374 01:04:44,650 --> 01:04:47,400 seria da seguinte forma. 1375 01:04:47,400 --> 01:04:54,300 Estes 1 está aqui, para mim, olhe como números mágicos. 1376 01:04:54,300 --> 01:04:56,860 Este 1, em termos de fread, faz sentido. 1377 01:04:56,860 --> 01:04:59,580 Esse é o número de coisas para ler ou escrever. 1378 01:04:59,580 --> 01:05:03,740 >> Mas este aqui deveria provavelmente ser outra coisa. 1379 01:05:03,740 --> 01:05:05,180 Então, o que é uma solução? 1380 01:05:05,180 --> 01:05:06,545 >> ALUNO 65: Tamanho de byte. 1381 01:05:06,545 --> 01:05:10,100 1382 01:05:10,100 --> 01:05:11,080 >> JASON HIRSCHHORN: Assim? 1383 01:05:11,080 --> 01:05:13,130 >> ALUNO 65: Tamanho de carvão. 1384 01:05:13,130 --> 01:05:13,820 >> JASON HIRSCHHORN: Tamanho de carvão. 1385 01:05:13,820 --> 01:05:15,290 Sim, byte não é um tipo. 1386 01:05:15,290 --> 01:05:16,320 Assim, o tamanho das obras de caracteres. 1387 01:05:16,320 --> 01:05:30,270 Poderíamos tem, na parte superior da o nosso código, # definido que. 1388 01:05:30,270 --> 01:05:33,410 Chamado algo BYTE e é realmente um char. 1389 01:05:33,410 --> 01:05:37,675 Na verdade, uma abordagem ainda melhor pode ter sido isso - 1390 01:05:37,675 --> 01:05:39,391 uint. 1391 01:05:39,391 --> 01:05:40,780 Alguém sabe o que é isso? 1392 01:05:40,780 --> 01:05:44,388 1393 01:05:44,388 --> 01:05:44,840 >> Desculpe. 1394 01:05:44,840 --> 01:05:46,090 Tenho-o para trás. 1395 01:05:46,090 --> 01:05:51,620 1396 01:05:51,620 --> 01:05:52,200 Espere, não. 1397 01:05:52,200 --> 01:05:53,450 Qual a maneira ele vai? 1398 01:05:53,450 --> 01:05:58,071 1399 01:05:58,071 --> 01:05:59,660 Alguém sabe o que é isso? 1400 01:05:59,660 --> 01:06:00,950 É. 1401 01:06:00,950 --> 01:06:05,650 >> ALUNO 67: Suposto para ajudar a padronizar através de sistemas de coisas que 1402 01:06:05,650 --> 01:06:08,760 ter - como inteiros sem sinal que tem 8 bytes? 1403 01:06:08,760 --> 01:06:11,785 >> JASON HIRSCHHORN: Isso é exatamente correto. 1404 01:06:11,785 --> 01:06:14,310 Em máquinas diferentes, o tamanho de um char - 1405 01:06:14,310 --> 01:06:15,180 geralmente não um char. 1406 01:06:15,180 --> 01:06:16,100 Chars são geralmente um byte. 1407 01:06:16,100 --> 01:06:19,590 Mas o tamanho de outros tipos de dados são tamanhos diferentes em uma máquina de 32-bit 1408 01:06:19,590 --> 01:06:21,370 contra uma máquina de 64 bits. 1409 01:06:21,370 --> 01:06:25,180 Um uint8_t é sempre 8 bits - 1410 01:06:25,180 --> 01:06:27,210 sempre um byte. 1411 01:06:27,210 --> 01:06:29,580 >> E eu preciso incluir esse arquivo de cabeçalho int padrão. 1412 01:06:29,580 --> 01:06:35,040 Então, agora, este provavelmente teria sido a melhor maneira de escrever este código. 1413 01:06:35,040 --> 01:06:40,160 1414 01:06:40,160 --> 01:06:41,450 Então, para me livrar dos números mágicos. 1415 01:06:41,450 --> 01:06:44,690 E eu também tenho um mais lógico tipo de buffer. 1416 01:06:44,690 --> 01:06:49,450 Não é simplesmente um carvão animal, que é um byte, que é o que esperamos que seja. 1417 01:06:49,450 --> 01:06:53,400 >> E aqui, nós temos realmente sido um pouco mais robusto. 1418 01:06:53,400 --> 01:06:55,190 Nós não estamos chamando isso de char, que - 1419 01:06:55,190 --> 01:06:58,630 talvez, quem sabe - pode ser um diferente tamanho em diferentes máquinas. 1420 01:06:58,630 --> 01:07:02,025 Na verdade, estamos dizendo que isso é exatamente um byte, sempre, não importa o quê. 1421 01:07:02,025 --> 01:07:05,810 E se olharmos aqui, fazemos cp. 1422 01:07:05,810 --> 01:07:08,340 Uh-oh. 1423 01:07:08,340 --> 01:07:09,590 O que aconteceu? 1424 01:07:09,590 --> 01:07:14,470 1425 01:07:14,470 --> 01:07:16,170 >> ALUNO 68: Pode ser trocada. 1426 01:07:16,170 --> 01:07:17,880 >> JASON HIRSCHHORN: O quê? 1427 01:07:17,880 --> 01:07:19,130 >> ALUNO 69: É? 1428 01:07:19,130 --> 01:07:21,940 1429 01:07:21,940 --> 01:07:25,080 >> ALUNO 70: Você não fez defini-lo como um tipo. 1430 01:07:25,080 --> 01:07:28,684 >> ALUNO 71: mas deve ser definidos na norma. 1431 01:07:28,684 --> 01:07:29,934 >> ALUNO 72: O que está acontecendo? 1432 01:07:29,934 --> 01:07:37,660 1433 01:07:37,660 --> 01:07:40,210 >> ALUNO 73: Deve definir se todas as tampas? 1434 01:07:40,210 --> 01:07:41,370 >> JASON HIRSCHHORN: Então não é # define. 1435 01:07:41,370 --> 01:07:45,490 Na verdade, neste caso, eu sou vai usar typedef. 1436 01:07:45,490 --> 01:07:48,590 Porque nós estamos usando-o como um tipo em um único local. 1437 01:07:48,590 --> 01:07:51,990 Portanto, neste caso, nós realmente queremos typedef que estamos imprimindo um novo tipo 1438 01:07:51,990 --> 01:07:54,490 byte, e é, essencialmente, este. 1439 01:07:54,490 --> 01:07:56,590 É um pouco diferente do que # define. 1440 01:07:56,590 --> 01:08:02,740 >> E agora, o nosso código funciona perfeitamente. 1441 01:08:02,740 --> 01:08:05,230 Então, mais uma vez, # define leva alguma coisa, substitui-lo em todos os lugares 1442 01:08:05,230 --> 01:08:06,780 com a outra coisa. 1443 01:08:06,780 --> 01:08:07,920 É apenas uma macro - 1444 01:08:07,920 --> 01:08:09,420 taquigrafia para se livrar dos números mágicos. 1445 01:08:09,420 --> 01:08:11,360 Mas neste caso, porque somos usando-a como um tipo - 1446 01:08:11,360 --> 01:08:12,180 aqui - 1447 01:08:12,180 --> 01:08:19,880 para que isso funcione, precisamos typedef para tudo o que é byte. 1448 01:08:19,880 --> 01:08:21,840 >> E nós estamos definindo-o aqui. 1449 01:08:21,840 --> 01:08:24,750 Não é um struct, é realmente apenas um inteiro sem sinal. 1450 01:08:24,750 --> 01:08:27,680 É um byte. 1451 01:08:27,680 --> 01:08:31,910 Este código estará disponível on-line, e vocês todos devem tê-lo agora. 1452 01:08:31,910 --> 01:08:33,830 >> Então nós temos - 1453 01:08:33,830 --> 01:08:34,250 perfeito - 1454 01:08:34,250 --> 01:08:41,359 13 minutos à esquerda para entrar problema ao longo do jogo 5. 1455 01:08:41,359 --> 01:08:44,270 Eu quero caminhar através copy.c juntos, e depois vamos falar brevemente 1456 01:08:44,270 --> 01:08:47,120 sobre as outras partes do conjunto de problemas. 1457 01:08:47,120 --> 01:08:48,899 Então deixe-me puxar para cima copy.c. 1458 01:08:48,899 --> 01:09:03,930 1459 01:09:03,930 --> 01:09:08,810 E o mais legal é que você realmente já escreveu um monte de este código. 1460 01:09:08,810 --> 01:09:11,180 >> O código que escrevemos literalmente saiu daqui quando eu era 1461 01:09:11,180 --> 01:09:13,120 escrevendo isso por conta própria. 1462 01:09:13,120 --> 01:09:16,990 Mas isso é copy.c, constitui a base para as duas primeiras partes da 1463 01:09:16,990 --> 01:09:22,340 o conjunto de problema para whodunit.c, que você precisa escrever, e resize.c. 1464 01:09:22,340 --> 01:09:27,050 Recover.c, que é a terceira e última parte do conjunto de problemas, não é 1465 01:09:27,050 --> 01:09:29,529 baseado fora deste arquivo. 1466 01:09:29,529 --> 01:09:32,200 >> Você está indo a necessidade de escrever esse arquivo, nós damos-lhe um modelo para que 1467 01:09:32,200 --> 01:09:34,620 arquivo, mas não tem nada a ver com copy.c. 1468 01:09:34,620 --> 01:09:38,675 Mas porque copy.c é a base para as duas primeiras partes, nós vamos 1469 01:09:38,675 --> 01:09:42,000 de atravessá-la agora, então você tem uma boa noção do que ele faz. 1470 01:09:42,000 --> 01:09:43,640 >> E os comentários dar um pouco dele. 1471 01:09:43,640 --> 01:09:45,120 Nós já escrevemos um pouco isso. 1472 01:09:45,120 --> 01:09:49,220 Em primeiro lugar, estamos certificando-se temos três argumentos. 1473 01:09:49,220 --> 01:09:50,560 Em seguida, vamos lembrar o nome do arquivo. 1474 01:09:50,560 --> 01:09:52,960 Então, nós saltamos essa etapa quando codificamos nossa coisa - 1475 01:09:52,960 --> 01:09:54,700 quando nosso cp. 1476 01:09:54,700 --> 01:09:56,750 Mas aqui, eles estão fazendo um pouco mais limpo. 1477 01:09:56,750 --> 01:09:59,350 >> Eles estão verificando se ambos os arquivos são bons, em 1478 01:09:59,350 --> 01:10:00,450 Além de abri-los. 1479 01:10:00,450 --> 01:10:04,760 Nós escrevemos todo este código só agora, por isso estou não vou me debruçar sobre este código. 1480 01:10:04,760 --> 01:10:09,670 Em seguida é alguma coisa que é específico para os tipos de arquivos que estamos usando, o que 1481 01:10:09,670 --> 01:10:12,240 são arquivos de bitmap. 1482 01:10:12,240 --> 01:10:15,660 Arquivos de bitmap tem alguns metadados que lhes estão associados. 1483 01:10:15,660 --> 01:10:20,190 >> Assim, o primeiro par de bytes informá-lo sobre o arquivo. 1484 01:10:20,190 --> 01:10:23,460 Eles não são as cores da o pixel na referida imagem. 1485 01:10:23,460 --> 01:10:25,120 Dizem-lhe sobre o arquivo. 1486 01:10:25,120 --> 01:10:28,220 E se você ler o conjunto de problemas, você terá muito mais informação 1487 01:10:28,220 --> 01:10:33,100 sobre quais os tipos de estruturas de metadados estão incluídos com bitmaps. 1488 01:10:33,100 --> 01:10:39,350 >> Mas é por isso que temos este primeiro conjunto de - esse código aqui. 1489 01:10:39,350 --> 01:10:42,490 Estamos lendo os metadados - 1490 01:10:42,490 --> 01:10:45,800 dois pedaços de metadados - o arquivo cabeçalho eo cabeçalho info. 1491 01:10:45,800 --> 01:10:51,030 E estamos verificando algumas partes dele para certifique-se que é um arquivo de bitmap verdadeiro 1492 01:10:51,030 --> 01:10:52,420 antes de continuar. 1493 01:10:52,420 --> 01:10:55,470 >> E mais uma vez, estes são detalhes que Não é necessário entrar em agora. 1494 01:10:55,470 --> 01:10:57,720 Se você ler o conjunto de problemas, você vai entender isso. 1495 01:10:57,720 --> 01:11:01,370 Para encurtar a história, estes são apenas dizendo, este é um arquivo de bitmap e 1496 01:11:01,370 --> 01:11:02,810 confirmando que. 1497 01:11:02,810 --> 01:11:05,180 >> Em seguida, nós estamos escrevendo os para o arquivo para fora. 1498 01:11:05,180 --> 01:11:05,660 Vemos que aqui. 1499 01:11:05,660 --> 01:11:06,910 Estamos escrevendo para o ponteiro para fora. 1500 01:11:06,910 --> 01:11:09,260 1501 01:11:09,260 --> 01:11:11,320 Em seguida, nós estamos determinando estofamento. 1502 01:11:11,320 --> 01:11:15,240 Então, novamente, como é particularidade com um arquivo de bitmap, algumas linhas de incluir 1503 01:11:15,240 --> 01:11:16,840 preenchimento no final. 1504 01:11:16,840 --> 01:11:19,000 E se você ler o conjunto de problemas, você vai aprender mais sobre o preenchimento. 1505 01:11:19,000 --> 01:11:22,330 Esta é a fórmula para determinar o preenchimento. 1506 01:11:22,330 --> 01:11:23,610 >> Importante lembrar - 1507 01:11:23,610 --> 01:11:29,720 quando você alterar o tamanho de um bitmap arquivo, o enchimento alterações. 1508 01:11:29,720 --> 01:11:31,970 Quando você muda o tamanho de um arquivo, o enchimento alterações. 1509 01:11:31,970 --> 01:11:34,310 Isso nunca vai ser superior a 3 - 1510 01:11:34,310 --> 01:11:36,510 vai ser de 0 a 3, inclusive. 1511 01:11:36,510 --> 01:11:38,930 Mas quando você alterar o tamanho da alguma coisa, as mudanças de preenchimento. 1512 01:11:38,930 --> 01:11:47,100 >> Se eu tiver apenas um pixel nessa linha, eu precisa de três bytes de preenchimento, pois 1513 01:11:47,100 --> 01:11:51,190 cada linha tem que ser múltiplos de quatro bytes em um arquivo de bitmap. 1514 01:11:51,190 --> 01:11:56,120 Mas se eu dobrá-lo, para ir de um pixel de dois pixels, cada um dos quais, 1515 01:11:56,120 --> 01:11:59,510 vamos dizer, é um byte, então eu preciso dois bytes de preenchimento para fazer 1516 01:11:59,510 --> 01:12:00,970 que igual a quatro. 1517 01:12:00,970 --> 01:12:04,200 >> Então, quando eu alterar o tamanho de alguma coisa, Eu preciso alterar a quantidade 1518 01:12:04,200 --> 01:12:06,551 de preenchimento que eu tenho. 1519 01:12:06,551 --> 01:12:08,100 Isso faz sentido para todos? 1520 01:12:08,100 --> 01:12:12,020 1521 01:12:12,020 --> 01:12:18,720 Em seguida, iterar sobre cada linha, ou através de todas as linhas. 1522 01:12:18,720 --> 01:12:21,400 E, então, iterar cada coluna em cada linha. 1523 01:12:21,400 --> 01:12:25,330 Estamos tratando este como bitmap uma grade, como temos tratado 1524 01:12:25,330 --> 01:12:26,490 a placa em 15. 1525 01:12:26,490 --> 01:12:29,200 >> Como nós tratamos os tijolos quando nós impresso-los na tela. 1526 01:12:29,200 --> 01:12:31,350 Uma grade de linhas e colunas. 1527 01:12:31,350 --> 01:12:32,350 Então - vimos isso. 1528 01:12:32,350 --> 01:12:33,840 Nós, na verdade, apenas codificado esta. 1529 01:12:33,840 --> 01:12:35,780 Criamos algumas armazenamento temporário. 1530 01:12:35,780 --> 01:12:38,710 Lemos ali, e, em seguida, nós escrevê-lo. 1531 01:12:38,710 --> 01:12:42,680 Este é exatamente o que nós fizemos. 1532 01:12:42,680 --> 01:12:46,760 >> Em seguida, porque eu disse que cada linha termina em algum estofamento, nós 1533 01:12:46,760 --> 01:12:48,260 pular que estofamento - 1534 01:12:48,260 --> 01:12:51,000 o antigo estofamento. 1535 01:12:51,000 --> 01:12:52,630 E, então, adicioná-lo de volta. 1536 01:12:52,630 --> 01:12:55,140 Neste caso, estamos criando exatamente o mesmo arquivo. 1537 01:12:55,140 --> 01:12:56,180 Estamos apenas copiá-lo. 1538 01:12:56,180 --> 01:12:57,700 Portanto, esta linha é meio bobo. 1539 01:12:57,700 --> 01:12:59,660 Poderíamos literalmente colocar o preenchimento dentro 1540 01:12:59,660 --> 01:13:04,290 >> Mas se você mudar o tamanho do arquivo, você ainda quer essa linha? 1541 01:13:04,290 --> 01:13:08,510 1542 01:13:08,510 --> 01:13:11,560 Então, se nós alterar o tamanho de um arquivo, nós ainda quero pular 1543 01:13:11,560 --> 01:13:12,810 sobre o antigo estofamento? 1544 01:13:12,810 --> 01:13:15,170 1545 01:13:15,170 --> 01:13:15,970 >> ALUNO 74: Sim. 1546 01:13:15,970 --> 01:13:17,090 >> JASON HIRSCHHORN: Então, o que fazemos. 1547 01:13:17,090 --> 01:13:19,290 Porque este, mais uma vez, ofertas com o arquivo de origem. 1548 01:13:19,290 --> 01:13:21,570 Nós não nos importamos sobre o preenchimento do arquivo de origem. 1549 01:13:21,570 --> 01:13:23,410 Queremos ir para a próxima linha. 1550 01:13:23,410 --> 01:13:28,850 Mas não basta colocar de volta o velho quantidade de preenchimento. 1551 01:13:28,850 --> 01:13:31,540 Precisamos colocar de volta o nova quantidade de preenchimento. 1552 01:13:31,540 --> 01:13:35,810 >> Então, quando nós estamos mudando o tamanho de uma arquivo, nós ainda queremos pular o 1553 01:13:35,810 --> 01:13:38,270 preenchimento no arquivo de idade - o que estamos lendo em partir. 1554 01:13:38,270 --> 01:13:40,370 Mas o que estamos escrevendo para, vamos a necessidade de colocar de volta um pouco diferente 1555 01:13:40,370 --> 01:13:41,890 número de preenchimento que nós determinado. 1556 01:13:41,890 --> 01:13:42,780 É. 1557 01:13:42,780 --> 01:13:44,550 >> ALUNO 75: A ordem dos dois linhas não importa, certo? 1558 01:13:44,550 --> 01:13:46,160 Porque você está lidando arquivos diferentes. 1559 01:13:46,160 --> 01:13:46,620 >> JASON HIRSCHHORN: Exatamente. 1560 01:13:46,620 --> 01:13:48,220 A ordem destas duas linhas não importa. 1561 01:13:48,220 --> 01:13:49,790 Nós escrevemos essa linha. 1562 01:13:49,790 --> 01:13:51,430 Este é aqui para o arquivo estamos escrevendo. 1563 01:13:51,430 --> 01:13:54,370 Isso é importante, por isso temos a quantidade certa de estofamento. 1564 01:13:54,370 --> 01:13:57,560 Isso tem que lidar com o arquivo no formato. 1565 01:13:57,560 --> 01:13:58,560 Queremos pular sobre o preenchimento. 1566 01:13:58,560 --> 01:13:59,470 >> Não quero ler - 1567 01:13:59,470 --> 01:14:01,500 se estamos a ler um byte de cada vez, nós não se preocupam com esses bytes de preenchimento. 1568 01:14:01,500 --> 01:14:04,070 Queremos passar para a próxima linha. 1569 01:14:04,070 --> 01:14:11,800 Finalmente, assim como Lucy deu para nós, vamos fechar os arquivos e retornar 0. 1570 01:14:11,800 --> 01:14:13,890 Portanto, esta é copy.c. 1571 01:14:13,890 --> 01:14:17,850 E nós realmente escreveu - que passou a maior parte de seção escrevendo isso, essencialmente. 1572 01:14:17,850 --> 01:14:18,740 >> Você fez isso. 1573 01:14:18,740 --> 01:14:22,440 Portanto, esperamos que você tenha um bom senso do que está acontecendo aqui. 1574 01:14:22,440 --> 01:14:25,890 A grande diferença, sinceramente, é apenas Nesta primeira parte que lida com 1575 01:14:25,890 --> 01:14:29,970 peculiaridades de arquivos de bitmap. 1576 01:14:29,970 --> 01:14:33,570 Então, eu tenho como meu próximo slide, o que precisamos fazer? 1577 01:14:33,570 --> 01:14:35,510 Bem, vamos pensar em romance policial. 1578 01:14:35,510 --> 01:14:38,080 >> E para alguém que ler o conjunto de problemas, o que é que vamos 1579 01:14:38,080 --> 01:14:41,410 precisa fazer a whodunit? 1580 01:14:41,410 --> 01:14:42,080 Simply. 1581 01:14:42,080 --> 01:14:42,460 Aleja. 1582 01:14:42,460 --> 01:14:48,570 >> ALEJA: Você pode tirar a parte de cada pixel, que indica a vermelho. 1583 01:14:48,570 --> 01:14:49,730 E então - 1584 01:14:49,730 --> 01:14:50,730 espécie de? 1585 01:14:50,730 --> 01:14:51,860 >> JASON HIRSCHHORN: OK. 1586 01:14:51,860 --> 01:14:54,460 Então, retire a parte de cada um pixel que indica vermelho. 1587 01:14:54,460 --> 01:14:57,234 É perto, mas não tudo isso. 1588 01:14:57,234 --> 01:14:59,780 >> ALUNO 76: Bem, não há maneiras diferentes de fazê-lo. 1589 01:14:59,780 --> 01:14:59,870 >> JASON HIRSCHHORN: OK. 1590 01:14:59,870 --> 01:15:03,070 Dê-me uma maneira. 1591 01:15:03,070 --> 01:15:08,240 >> ALUNO 76: Retire todo o vermelho, e em seguida, destacar o azul eo verde. 1592 01:15:08,240 --> 01:15:10,010 >> JASON HIRSCHHORN: OK. 1593 01:15:10,010 --> 01:15:11,830 Assim, dado estes dois aspectos - 1594 01:15:11,830 --> 01:15:15,210 parece que nós dar-lhe um pixel, ele tem um nível de vermelho, azul e verde. 1595 01:15:15,210 --> 01:15:19,350 Queremos mudar os níveis relativos de o vermelho, azul e verde, dependendo 1596 01:15:19,350 --> 01:15:20,740 em que o pixel. 1597 01:15:20,740 --> 01:15:28,380 Onde neste código devemos mudar o parente vermelho, azul e verde 1598 01:15:28,380 --> 01:15:29,720 os níveis de um dado pixel. 1599 01:15:29,720 --> 01:15:30,600 Depois que o li - 1600 01:15:30,600 --> 01:15:32,520 antes de escrevê-lo? 1601 01:15:32,520 --> 01:15:34,564 Dê-me o número da linha. 1602 01:15:34,564 --> 01:15:35,950 >> ESTUDANTES múltiplos: 83. 1603 01:15:35,950 --> 01:15:37,320 >> JASON HIRSCHHORN: 83. 1604 01:15:37,320 --> 01:15:38,570 Então aqui. 1605 01:15:38,570 --> 01:15:40,830 1606 01:15:40,830 --> 01:15:45,710 Para whodunit, o código que você precisa para write todos devem ir para a direita lá. 1607 01:15:45,710 --> 01:15:47,640 E isso é o único código você precisa escrever. 1608 01:15:47,640 --> 01:15:51,520 Porque, como ouvimos, tudo que você precisa fazer é mudar estes azul relativa, 1609 01:15:51,520 --> 01:15:54,420 níveis de vermelho, verde e de cada pixel. 1610 01:15:54,420 --> 01:15:58,250 >> Você lê-lo, e agora você está indo para escrevê-lo. 1611 01:15:58,250 --> 01:16:03,100 Como faço para que - se eu tenho essa coisa chamado triplo, bem aqui, e é de 1612 01:16:03,100 --> 01:16:04,570 digite RGBTRIPLE - 1613 01:16:04,570 --> 01:16:08,650 bem, se olhássemos em bmp.h, o que é RGBTRIPLE? 1614 01:16:08,650 --> 01:16:11,450 1615 01:16:11,450 --> 01:16:12,700 >> ALUNO 77: É um struct. 1616 01:16:12,700 --> 01:16:17,440 1617 01:16:17,440 --> 01:16:18,900 >> JASON HIRSCHHORN: RGBTRIPLE é um struct. 1618 01:16:18,900 --> 01:16:22,330 Vemos que bem aqui. 1619 01:16:22,330 --> 01:16:26,600 E assim se eu queria acesso, por exemplo, o nível vermelho da estrutura, como faço 1620 01:16:26,600 --> 01:16:30,005 acessar o nível vermelho desta struct? 1621 01:16:30,005 --> 01:16:37,280 >> [CLASSE murmura] 1622 01:16:37,280 --> 01:16:38,530 >> ALUNO 78: RGBTRIPLE.rgbtred? 1623 01:16:38,530 --> 01:16:47,250 1624 01:16:47,250 --> 01:16:48,856 >> JASON HIRSCHHORN: Isso está correto? 1625 01:16:48,856 --> 01:16:53,040 >> ALUNO 79: Deve ser triplo ponto, em vez de RGBTRIPLE ponto? 1626 01:16:53,040 --> 01:16:54,120 >> JASON HIRSCHHORN: Triple. 1627 01:16:54,120 --> 01:16:56,700 Triplo é a variável local, assim aqui, não há indicadores aqui. 1628 01:16:56,700 --> 01:16:58,400 Então, é só usar a notação de ponto. 1629 01:16:58,400 --> 01:17:00,480 Isso vai me dar o nível de vermelho. 1630 01:17:00,480 --> 01:17:06,180 Se eu quero mudar isso, eu apenas definir que equivalem a algo diferente. 1631 01:17:06,180 --> 01:17:13,190 Então, novamente, esta linha de código acessa esta variável dentro dessa estrutura, e 1632 01:17:13,190 --> 01:17:15,070 podemos defini-lo como algo novo. 1633 01:17:15,070 --> 01:17:20,040 >> Assim, para whodunit, novamente, isso é, em essência, o que precisamos fazer. 1634 01:17:20,040 --> 01:17:21,170 Muito simples. 1635 01:17:21,170 --> 01:17:25,020 Basta alterar alguns níveis relativos, e este é o lugar onde esse código vai. 1636 01:17:25,020 --> 01:17:27,720 Redimensionar, por outro lado, é um pouco mais complicado. 1637 01:17:27,720 --> 01:17:30,900 Na verdade, é provavelmente o redimensionamento mais complicada parte deste conjunto de problemas. 1638 01:17:30,900 --> 01:17:32,720 Temos três minutos para passar por isso. 1639 01:17:32,720 --> 01:17:34,910 >> Mas, novamente, nós já escrevemos a maior parte deste código, de modo que 1640 01:17:34,910 --> 01:17:36,500 deve ser bastante familiar. 1641 01:17:36,500 --> 01:17:40,750 Quais são algumas das coisas que queremos fazer em redimensionar, se você já leu sobre o 1642 01:17:40,750 --> 01:17:43,470 conjunto de problemas? 1643 01:17:43,470 --> 01:17:45,290 Se você lhes der a mim, nós pode falar sobre elas. 1644 01:17:45,290 --> 01:17:47,340 Quais são algumas das coisas que queremos fazer? 1645 01:17:47,340 --> 01:17:47,970 >> ALUNO 80: verticalmente - 1646 01:17:47,970 --> 01:17:52,360 então você tem que horizontalmente redimensioná-la, mas verticalmente redimensioná-la também? 1647 01:17:52,360 --> 01:17:58,475 >> JASON HIRSCHHORN: Então, se nós estamos dando um pixel, e queremos redimensioná-la por um 1648 01:17:58,475 --> 01:18:03,460 fator de dois, agora precisa ser redimensionadas horizontalmente e redimensionadas 1649 01:18:03,460 --> 01:18:05,220 verticalmente. 1650 01:18:05,220 --> 01:18:06,640 Será que isso faz sentido? 1651 01:18:06,640 --> 01:18:07,060 É. 1652 01:18:07,060 --> 01:18:09,300 Então, essa é provavelmente a maior desafio. 1653 01:18:09,300 --> 01:18:10,430 E vamos falar sobre isso em um segundo. 1654 01:18:10,430 --> 01:18:11,065 É. 1655 01:18:11,065 --> 01:18:15,270 >> ALUNO 81: A maneira que eu pensei nisso foi-lhe necessário imprimi-lo - 1656 01:18:15,270 --> 01:18:15,490 >> JASON HIRSCHHORN: Espere. 1657 01:18:15,490 --> 01:18:17,580 Não diga-nos o que você fez. 1658 01:18:17,580 --> 01:18:20,620 Vamos falar de lógica. 1659 01:18:20,620 --> 01:18:21,870 >> ALUNO 81: OK. 1660 01:18:21,870 --> 01:18:25,090 1661 01:18:25,090 --> 01:18:27,410 Qual foi a pergunta? 1662 01:18:27,410 --> 01:18:28,892 >> JASON HIRSCHHORN: Você só levantou sua mão. 1663 01:18:28,892 --> 01:18:31,600 Não havia dúvida. 1664 01:18:31,600 --> 01:18:32,520 Deixe-me apresentá-lo. 1665 01:18:32,520 --> 01:18:34,560 Deixe-me discutir isso brevemente. 1666 01:18:34,560 --> 01:18:38,400 Portanto, temos um pixel, nós queremos replicá-lo, tanto na horizontal como 1667 01:18:38,400 --> 01:18:39,360 verticalmente. 1668 01:18:39,360 --> 01:18:48,920 Assim, idealmente o que fazemos aqui é que nós ler em nossa pixels, escrevemos 1669 01:18:48,920 --> 01:18:51,690 porém muitos dos tempos. 1670 01:18:51,690 --> 01:18:54,720 >> Mas, então, nós temos o nosso truque aqui, porque então queremos saltar para o 1671 01:18:54,720 --> 01:18:57,660 próxima linha e escrevê-lo no no início da próxima linha. 1672 01:18:57,660 --> 01:19:02,960 Portanto, se queremos replicar tanto horizontalmente e verticalmente, o que é 1673 01:19:02,960 --> 01:19:05,050 uma boa maneira de fazer isso - 1674 01:19:05,050 --> 01:19:06,780 um bom embora a fazer isso? 1675 01:19:06,780 --> 01:19:11,950 Então, nós não precisamos buscar constantemente em torno do nosso arquivo para colocar as coisas. 1676 01:19:11,950 --> 01:19:14,360 >> Essa pergunta não pode ter fazia sentido, mas eu acho que um 1677 01:19:14,360 --> 01:19:15,800 responder a ele vai ajudar. 1678 01:19:15,800 --> 01:19:17,210 >> ALUNO 82: Criar uma matriz? 1679 01:19:17,210 --> 01:19:20,090 >> JASON HIRSCHHORN: Então, vamos pensar de cada arquivo como uma linha. 1680 01:19:20,090 --> 01:19:22,550 Vamos pensar em termos de linhas. 1681 01:19:22,550 --> 01:19:26,670 Se nós temos a nossa primeira linha de nosso pequeno imagem, podemos fazer essa linha 1682 01:19:26,670 --> 01:19:30,640 em uma grande linha de uma imagem grande, e, em seguida, replicar essa linha no entanto 1683 01:19:30,640 --> 01:19:34,250 muitas vezes ele precisa ser replicado, ao invés de ir pixel por pixel, 1684 01:19:34,250 --> 01:19:37,260 que fica confuso quando lidar com arquivos. 1685 01:19:37,260 --> 01:19:38,730 >> Porque se nós tivemos - 1686 01:19:38,730 --> 01:19:41,260 Eu estou ficando sem espaço. 1687 01:19:41,260 --> 01:19:46,490 Se este é o nosso arquivo, e nós temos que um pixel lá, e queremos colocá-lo 1688 01:19:46,490 --> 01:19:49,840 ali, ainda temos algumas coisas que necessidade de ir lá quando estamos 1689 01:19:49,840 --> 01:19:51,450 escrever e criar o nosso novo arquivo - 1690 01:19:51,450 --> 01:19:53,250 o nosso arquivo que é duas vezes maior. 1691 01:19:53,250 --> 01:19:56,820 >> Mas é realmente difícil, com funções de arquivo para saltar em torno de novas linhas 1692 01:19:56,820 --> 01:20:00,260 assim, e depois voltar aqui e colocar as coisas lá dentro. 1693 01:20:00,260 --> 01:20:04,500 É quase impossível fazer alguma coisa assim, se isso faz sentido. 1694 01:20:04,500 --> 01:20:10,180 Então, se pensarmos em termos de linhas, podemos levar a nossa linha e, em seguida, colocá-lo - 1695 01:20:10,180 --> 01:20:11,720 replicar linhas verticalmente. 1696 01:20:11,720 --> 01:20:15,860 >> E é assim que lidamos com o redimensionamento verticalmente em vez de horizontalmente. 1697 01:20:15,860 --> 01:20:18,810 Isso era uma espécie de rápida, e um pouco confuso. 1698 01:20:18,810 --> 01:20:22,375 Infelizmente o nosso tempo acabou. 1699 01:20:22,375 --> 01:20:27,340 Vou ficar de fora para aqueles de vocês aqui quem tiver dúvidas sobre o 1700 01:20:27,340 --> 01:20:30,500 conjunto de problemas, incluindo a recuperar. 1701 01:20:30,500 --> 01:20:32,320 >> Então, vamos adiar por enquanto. 1702 01:20:32,320 --> 01:20:34,480 E, novamente, se você tiver quaisquer perguntas, podemos conversar lá fora. 1703 01:20:34,480 --> 01:20:38,294