Jason Hirschhorn: Benvido, todos, a Semana 6. Estou feliz en velo todos vivos e ben despois quiz 0, porque sei que foi un pouco difícil. Pero, por sorte, todos vostedes fixo moi ben. E así que é marabilloso. Se está na miña sección, eu dei máis de faga súas probas xa. Unha parella de ti, vou atopar despois da aula. E se vostede é un estudante de extensión e non ten recibido o cuestionario de volta aínda, a súa TF é probablemente a traballar nel e graduouse o, e vai busca-la de volta pronto. Entón meus alumnos de extensión que son asistir agora - espero vivir - Vou comezar súas probas Pronto ben. Nosa axenda para hoxe é o seguinte. En primeiro lugar, imos pasar por riba de algúns recursos que CS50 ofrece para ti. Nós imos pasar por riba de proba 0 seguinte, e Vou responder a posibles preguntas que ninguén ten sobre problemas particulares. E entón, nós estaremos pasando por riba ficheiro E / S e conxunto de problemas 5. Estes dous últimos temas levará a maior parte da sección de hoxe. Coloque esta lista cada semana como un recordatorio para todos vostedes, pero do núcleo sección, temos só 90 minutos - nós non son capaces de cubrir todo o que eu Encantaríame cubrir para vós. Pero nós temos unha tonelada de recursos para ti debuxe sobre como comeza a coñecer o material e de traballo a través define o seu problema. Un recordatorio de que eu teño un texto en liña box, creado para que cubra se ten algún feedback para min, tanto positivos como construtivo, uns sección. Esta URL está situado aquí. Entón, por favor, tome un momento se ten calquera producto, sexa durante a sección, ou despois, ou despois de ver o vídeo en liña, para me dar o seu producto. Eu realmente aprecio todo e todo. Entón, eu teño tido pequenas conversas con unha morea de miña os alumnos durante toda a semana - como eu entrego quizzes atrás, fala de por suposto, ver como está facendo. E un tema xurdiu unha e máis en falar - en en particular - conxuntos de problemas. E eu teño que encapsulado tema na tarxeta agora. Esencialmente, hai unha diferenza entre transformando en algo que é feito correctamente e algo que é ben feito. A maioría das persoas teñen feito fantástico en termos de corrección - 5 de ou 4 da serie de exercicios en todos. A maioría das persoas están quedando os de todos os tempos. Con todo, só porque fixo algo certo, non significa que ten feito algo tan elegante, ou de forma eficaz, é tan limpa como podería ter feito isto. E iso é o que o proxecto - e ata certo punto, estilo menor - eixes son para. Entón, eu estou empuxando todos vós, e outros TFS están empurrando vostedes, non só pola súa vez, en cousas que son correctas, pero acaban nas cousas que son codificadas tamén. Non facer innecesario para loops, non recalcular variables se non precisa. Por exemplo, mirando cara atrás para conxunto de problemas 4, cando a colocación dos ladrillos no pantalla, cada liña - cada ladrillo nunha determinada liña ten a mesma coordenada y - coordinar a mesma altura. Así que coordinada y non precisaba ser calculada no interior do interior Nested loop que probablemente usado para poñer os ladrillos na pantalla. El só debe ser calculado cada vez que cambiou unha liña, ou descendeu unha fileira. Entón diga se hai 10 ladrillos nun fila, cada ladrillo pode ter o mesmo coordinada y, e que coordinada y só se pode calcular dunha vez por todas deses. Non ten que ser calculado 10 veces, nin esta necesidade cálculo pasar no real función de chamada - a nova función chamada gracked. Entón, se iso foi un pouco confuso para ti, máis xenericamente, as cousas que non ocorrer en cada momento pasar por un loop FOR non debe ser poñer dentro do loop FOR, e non debe ocorrer cada vez que vai a través do lazo FOR. Outro exemplo bo proxecto, vimos a Semana 3 por 15, podería manter pista de cero. Entón, cando arrincar a tarxeta, vostede gardar - nunha variable global, quizais - xe y-coordinar de cero. E, a continuación, sempre que - na súa función de movemento, sempre que se fai un movemento exitoso, entón actualiza o localización de cero. Isto iría garda-lo de ter que facer nested loops para ollar a través dos embarcarse cada vez na súa función de movemento e atopar a cero, ou atopar o azulexo, e, a continuación, comprobar o que está ao seu lado. Pola contra, ten a localización do cero, pode só ollar por riba, a continuación, e para a esquerda e dereita do mesmo, para atopar a tella que busca. Polo tanto, en termos dos programas que estamos escribindo, eles nunca son grandes abondo que algunhas desas decisións de proxecto son realmente vai dificultar a súa programa, ou facelo funcionar máis lentamente, ou quizais mesmo quedar sen memoria. Pero aínda estamos empurrando vostedes para escribir tan elegante e código eficiente canto posible. Entón, se acabar escribindo cousas que ten unha significativamente maior ámbito, que será escrito con boa proxectar ademais de ser correcta. Así, un número de que ten trouxo isto. Isto é algo que estamos a buscar - algo que seguiremos empurralo lo caras. Se ten algunha dúbida sobre o proxecto do seu programa, sexa a vontade para chegar a min, e eu estou feliz percorrer o seu programa con vostede, e apuntar algún do deseño decisións que fixo, e darlle algúns suxestións sobre como facer aínda mellores decisións de proxecto. Entón, imos seguir adiante para falar de Quiz 0. Antes de facelo, alguén ten algunha dúbida sobre o que Eu cobre ata agora? [Farfalhar] Jason Hirschhorn: Sete segundos. Aceptar. Imos falar sobre Quiz 0 a un bit. A maioría de vós ten o seu quiz 0 costas. Se non o fai, espero que Lembra-se un pouco. Pero se tomou quiz 0, entón tamén ten acceso ao PDF en liña en as solucións de mostras. Alguén ten algunha dúbida antes ir para o material da semana sobre un problema particular en proba 0 - por que a resposta é o que é? Ten alguén confuso sobre algo? Mesmo se ten o problema dereito, pero só quere me explicar isto un pouco máis, eu estou feliz en facelo agora. Así que pedín que vostedes veña preparado con algunha pensamentos sobre Quiz 0. Entón, quen quere ter nos comezou cunha pregunta ou comentar Quiz 0? [PAPER furtos] Jason Hirschhorn: Non todo o mundo fixo perfectamente. Entón eu sei [risas] ten que haber algunhas preguntas sobre Quiz 0. Aceptar. Si Ompica. OMPICA: Número 10. Jason Hirschhorn: Número 10. Cal era o número 10? OMPICA: A - Jason Hirschhorn: I haven't - OMPICA: The inclúen - Jason Hirschhorn: número 10 tiña oito anos I - a escrita de oito a i? OMPICA: Yeah. Jason Hirschhorn: Aceptar. Así, unha pregunta que pode ter preguntou se estou presciente? A resposta é si. Na sección antes da proba, pedín vostedes para codificar tanto Sterling e de oito a i. Ambos pasou aparecen no quiz. Polo tanto, agardamos, paga atención a iso. E se tivese, entón tería que probabelmente ben feito sobre os dous. Pero oito para i, non o fixemos en realidade código lo en clase, pero foi, unha vez máis, preguntado sobre o quiz. Así, un par de cousas para levar notar cando a codificación de oito a i. O primeiro que, por cuestión, foi que precisaba para comprobar que a cadea foi igual a nulo. Algunhas persoas tentaron comprobar máis tarde no programa se s soporte era - así un carácter específico en que cadea - foi igual a nulo. Pero lembre, que é esencialmente nulo - é bo pensar nulo como un punteiro de cero - un punteiro a cero - en algún lugar en memoria onde vostede non pode acceder. Entón, se algo é igual a nulo, vostede sei que non foi inicializado, ou non hai nada alí. Entón s é unha estrela char, s soporte de i é un char. Por iso, ten sentido comparar s como nulo, pero o soporte non s i como nulo. Pero unha vez máis - de xeito que foi o primeiro que debería facer - asegúrese de que realmente teño unha corda real. Logo quería pasar por cada carácter na cadea. E así, iso sería como un soporte de s Eu, por exemplo, se i é o iterador. E teña ese carácter, e obter o seu valor real. Telo gardado como un char, pero o valor ASCII para a cero - cero como un personaxe - non é, en realidade, o enteiro cero. É algún outro número que se pode mirar para arriba na táboa ASCII. Así, un xeito de corrixir iso - probablemente, o mellor xeito de corrixir que - é restar o valor do carácter - cero como un personaxe. Aspas Entón negativo, cero, outra aspa simple. Isto vai levar o número que ten como un char, e obtelo igual a o número como un número enteiro real. E iso é moi semellante á formulación unha chea de xente tivo no problema axustaron 2, con César e Viginere - estas cifras, cando foron xirando-os. Entón, despois de telo como un número de de cero a nove, entón - dependendo a onde vai o número final - hai que multiplicala lo por unha potencia de 10. Algunhas persoas se mudaron de tras para a fronte, e multiplicou o individuo número por unha potencia de 10. Algunhas persoas pasaron de diante para atrás - e así tivo a maior ordenar os números en primeiro lugar - e ía salvar aqueles en un variable do contador global. E, a continuación, cada vez a través do PARA loop, multiplicar ese xigante mundial combater variable por 10, para facer espazo á seguinte carbón. Entón iso foi un pouco confuso, sen me escribilo lo no taboleiro. Pero a solución mostra está dispoñible para ti. Pero estas eran as cousas grandes que estabamos a buscar. Tamén unha verificación para asegurarse de que cada carácter individual era de feito un carácter entre cero e nove anos, e non algún outro personaxe, como un A, por exemplo. Esas foron as cousas que estaban a buscar no esta pregunta. Isto responde a súa pregunta? OMPICA: Yeah. Jason Hirschhorn: Aceptar. Existen outras cuestións sobre Quiz 0? E sobre a compilación? Todo o mundo compilando non? Non Había un - [Risas] Calquera dúbida sobre o proceso de compilación? Guau. [PAPER furtos] Jason Hirschhorn: si. Michael. MICHAEL: É o número 7 - chou? Jason Hirschhorn: Número 7. Número 7 foi obter un número enteiro aleatorio. Excelente. Entón, está dado un enteiro e un a b enteiro, e quere un chou enteiro entre a e b. Podemos realmente escribir este en da tarxeta, xa que este era unha liña de código - un xeito de facelo. Entón, nós estamos dada drand como función que poderiamos usar. E o que drand - asumindo que foi sementado - o que drand volver? MICHAEL: A flutuación entre 0,0 e 1,0. Jason Hirschhorn: Un número - si. Un número entre 0 e 1. E así temos b e a. E entón temos o noso número aleatorio entre 0 e 1 dado a nós por drand. Algunhas persoas tentaron poñer b, ou b menos un, ou algo dentro aqueles parénteses. Isto significa que son argumentos para esta función. drand non leva ningún argumento - como getString fai Non Tomé ningún argumento. Entón é só paréntese aberta, preto paren - e que, en si, é a chamada de función. E iso dálle un número entre 0 e 1. Por suposto, temos unha gama completa que números poden Pol Digamos que, se b é 10 e un é de 5, nós realmente Quere un número con un intervalo de 5. Polo tanto, a seguinte cousa que necesitamos facer é multiplique iso polo menos unha pista de b. Así, supoñendo que é multiplicado. E iso vai dar unha serie dentro dun determinado intervalo. E esa franxa específica sendo o diferenza entre b menos un. E, finalmente, que só vai darlle a partir de - din que a franxa entre b menos un é 5, que vai dar unha número de 0 a 5. Pero se un é de feito 5, necesitamos aumentar esta franxa de ata onde é de feito, debería ser, engadindo un. Así que recibe o dereito de lóxica. E entón, que tería outra pregunta? MICHAEL: Non Eu me sinto moi idiota agora. [Risas] Jason Hirschhorn: Non Non se sinta realmente estúpido. Un número de persoas que loitaron con esta cuestión. E, a continuación, a outra cuestión é, drand, dixo, dálle un float - retorna un float. Pero esta función realmente pediu para un enteiro para ser devolto. Non precisa de publicar isto explicitamente a un número enteiro, porque estes operacións han tratalo como un todo float - como un número de coma flotante. Lle gusta a vontade - aínda que iso é un número enteiro, esta vontade ser multiplicado correctamente. Toda a multiplicación funcionará. Non precisa lanzalo aquí. En realidade, non debe lanzalo. Iso sería - se lanzar un número que está entre 0 e 1 - un número aleatorio, un punto flotante - logo será ou só 0 ou 1, de xeito vai perder todo isto de precisión. Pero ao final, cando atrás, fica automaticamente enviado de volta como un enteiro. Así que non facer que lanzando-se. Polo tanto, esta foi a resposta a a esta pregunta, o número 7. Calquera outras preguntas sobre quiz 0? Si, Annie. ANNIE: Cando usamos recursiva - cando é que imos usar loops iterativos? Jason Hirschhorn: Cando utilice os recursiva - así máis xeral, a pros e contras de recursão contra unha visión iterativa. Alguén pode ofrecer un profesional ou un engodo? Por favor? Non pode ninguén. Quen pode ofrecer un profesional ou un engodo? [PAPER furtos] ALUMNO 1: recursiva é menor codificación - menos de dixitación? Jason Hirschhorn: Entón, xeralmente, recursão sobre todo, unha función - ou un algoritmo como merge tipo - que se presta para unha visión recursiva - pode ser máis simple para codificar de forma recursiva. E só facer máis sentido para facelo de forma recursiva. Entón iso sería un profesional para a recursividade. Outros? Si? ALUMNO 2: Con de recursión - Usa máis memoria. Jason Hirschhorn: Entón exactamente correcto. Unha función recursiva seguirá a engadir pila de cadros para a pila. Entón, se está operando en unha morea de números, e ten que chamar esta funcionar moi, entón certamente vai ocupan máis memoria, mentres unha visión iterativa só vai poñer un apilar cadro na pila, porque todo acontece dentro dunha función. Outros pros e contras? É. ALUMNO 3: Pros para recursión. Non ten que determinar en avanzar cantas veces o código tivo que ser repetida. Pode ter un número predeterminado de veces que tes que interactuar, así recursão é mellor, porque é preciso que o resultado. Jason Hirschhorn: Eu creo que iso é verdade. Pero eu creo que en ambos os casos nunca faría iso - probablemente obter un entrada do usuario. Ou esa función tería algunha entrada que ía determinar cantas veces debe ser executado. Entón, xeralmente, non faría código duro - mesmo nunha abordaxe iterativa - como moitas veces ese ciclo debe ser executado. Será que ten outro que estaba pensar, Annie? Aceptar. Polo tanto, estas son probablemente os dous - o maior pro eo maior con un recursiva contra unha visión iterativa. Aceptar. Calquera outra cousa en quiz 0? Imos seguir adiante. File I / O. Hai un marabilloso curta esta semana en arquivo I / O que esperamos asistiu múltiple veces, e admirado. Moito traballo foi para tanto, e eu teño oído é demencia útil. Eu tamén incluíu a ligazón nesta foto, no caso de non ter unha oportunidade de velo 10 veces. Entón, nós estamos indo a ir brevemente sobre o principais pasos para abrir e traballar cos arquivos, e despois nós imos mergullo nun problema de codificación antes examinar o conxunto de problemas. Entón, de novo, eu vou poñer isto en a pantalla, pero eu vou falar para só un minuto sobre o que estamos facendo aquí co arquivo I/O-- O que significa isto? Isto significa que podemos crear o noso programas e, a continuación, temos os nosos programas saída, e non fixeron ningún impacto sobre o mundo fóra do noso programa. Pero cando comezamos a traballar con arquivos - tanto lelos e crear eles - que pode ter algún efecto sobre a mundo fóra do noso programa. Así como o Microsoft Word non foi capaz facer os documentos de Word, logo xa que Microsoft Word parar, todo o seu traballo tería ido, e que sería realmente ser inútil. Queremos finalmente poder escribir programas que poden afectar o mundo ao seu redor, tanto pola inxestión de entradas complexas - en termos de ficheiros e a través de arquivos, e tamén crear interesantes e saídas convincentes - en termos de diferentes tipos de arquivos. É por iso que estamos empezando a aprender a traballar con arquivos. En concreto, o o que facemos é a seguinte. É moi sinxelo. Hai só un par de pasos, e son listados aquí neste código. Entón imos pasar por este código liña por liña. En primeiro lugar, ve destaque - cando está a traballar con un arquivo, independentemente do tipo de ficheiro que é, ten que abrilo. E é cunha chamada a fopen - ben aquí. Incluír o nome do ficheiro. Se o ficheiro non está no seu directorio, ou o cartafol onde este programa vidas, entón tamén ten que incluír un camiño cara a onde o arquivo está. Supoñamos que esta ficheiro chamado "text.txt" - un documento de texto simple - está no mesmo cartafol que este programa é. Entón, iso é outra cousa a ter en mente - que, se quere abrir un ficheiro noutro lugar, realmente precisa para incluír a súa localización. En segundo lugar, pode pasar un argumento para fopen, e iso é o que quere facer co arquivo. Existen tres principais argumentos que vai pasar para fopen. Quen me pode dar os tres? Quen me pode dar un deles? Si ESTUDANTE 4: O nome do ficheiro? Jason Hirschhorn: Sentímolo. Tres principais argumentos pode pasar como o segundo argumento para fopen. Está certo - o nome do ficheiro é o primeiro argumento. Pero o segundo argumento para fopen son xeralmente tres cordas, e - si. Aleja. ALEJA: A para aumento. Jason Hirschhorn: A, se quere Adxuntar un arquivo que xa existe. ESTUDANTE 5: R para ler. Jason Hirschhorn: R si quere ler un arquivo. ESTUDANTE 6: W a gravación. Jason Hirschhorn: E w, se quero escribir a un ficheiro. Polo tanto, neste caso, estamos escribindo para o arquivo, polo que temos w. Abri-lo, tamén ten que gardar o arquivo en algún lugar, e iso é co codificar para o lado esquerdo da o operador de asignación - Estou creando un punteiro a un ficheiro chamado neste caso de arquivo. Non imos preocuparnos que esa cousa ARQUIVO todas as tapas é. Tan só dicir, é un longo fluxo de ceros e uns. E é así que imos operalo e comprende-lo. A seguinte cousa que cómpre facer - e Isto é moi importante - sempre que abrir un arquivo - de feito, sempre que chamar malloc, por exemplo, e obter algunha memoria e probe e salva-o nun punteiro, sempre querer comprobar para asegurarse de que este función non voltar nulo. Polo tanto, neste caso, estamos comprobando para facer Asegúrese de que realmente abriu a arquivar correctamente, e non había ningún erro no noso programa. A continuación, unha vez que temos comprobado para asegurarse que temos un arquivo de traballo, podemos gravar ou ler a partir de, ou achegar o arquivo. Neste caso, estou simplemente imprimir unha liña a este arquivo. Como sei diso? Ben, eu estou usando esta función chamado fprintf. Todas as funcións que pode utilizar ao gardar ou ler a partir de, ou manipulación de ficheiros será semellante ao funcións que xa viu antes, pero comezan coa letra F, pé para o arquivo. E fprintf, ao contrario da nosa impresión normal aplicación, ten un argumento adicional, e que é o ficheiro no que quere imprimir esta liña. Eu non teño nada que o dereito de ohai. Eu non teño a terceira argumento para printf - ou o segundo argumento para printf, o terceiro argumento para fprintf, porque eu non ten espazos reservados aquí. Eu non estou incluíndo os variables. Pero, de novo, fprintf e todos estes ficheiros funcións que operan con arquivos son xeralmente vai ter do arquivo en que está operando. Finalmente, a última cousa importante a facer é pechar o ficheiro, así como con - sempre que malloc algo, queremos liberar algo, para que non ter un baleirado de memoria - queremos para pechar o noso arquivo. Se este programa saíu sen pechar o arquivo, as probabilidades son nada ía mal, sobre todo se era un arquivo pequeno. Pero é sen dúbida un bo código e práctica para sempre pechar o ficheiro cando termine de usalo. Entón iso é o básico do ficheiro I / O. Probablemente xa viu iso antes, ou asistir-lo nese fantástico curta. Alguén ten algunha dúbida, antes de nós entramos nalgunha codificación práctica problemas, uns ficheiro E / ou a pasos que eu só fun de novo? [DATILOGRAFAM SONS] Jason Hirschhorn: Vostede teño unha pregunta, Avi? AVI: Non Jason Hirschhorn: Aceptar. Vou agardar un sete segundo. [Risas] Esta é unha información moi boa. Vostedes só non me gusta facer preguntas. Iso é bo. Aceptar. Así, o noso primeiro problema é práctica, estamos vai duplicar a función de unha ferramenta de liña de comandos que, probablemente, usado antes - copia - a ferramenta de copia. Se insire cp e, a continuación, pasalo dúas argumentos no seu terminal, pode copiar un arquivo. E iso é o que nós estamos indo para escribir agora. Entón, de novo, a lectura fóra deste foto, eu que escriba un programa que tira dous e só dous de liña de comandos argumentos - un arquivo de orixe e un arquivo de destino - e copiar o contido da fonte ficheiro para o ficheiro de destino un byte de cada vez. Entón, iso é moi pedindo. Unha vez máis, unha boa visión para iso é non ir directo para o código C, pero decompô-lo en un par de pasos. En primeiro lugar, pense sobre a lóxica - exactamente o que eu estou pedindo para lle facer - e comprender toda a pasos a este problema. Non en C, só nun pseudocódigo, ou un modelo mental de o que está pasando. Logo, despois de o pseudocódigo para abaixo, descubrir como o pseudocódigo mapas na ferramentas e cousas que temos aprendeu en uso en C. E, finalmente, xa que ten todo o que xuntos, pode codificar o problema. Take 5 a 10 minutos para traballar sobre este problema. Vou poñer as instrucións back-up en un segundo. E entón nós imos pasar por riba de o pseudocódigo eo código el vive como un grupo. Se ten algunha dúbida, mentres está traballar sobre iso, sexa a vontade para recadar súa man, e eu virei volta e respondelas. ESTUDANTE 7: Podo roubar un anaco de papel? Jason Hirschhorn: Que foi? [DATILOGRAFAM SONS] Jason Hirschhorn: Aceptar. Imos revisar o pseudocódigo en primeiro lugar, e entón eu vou dar-lle máis un par minutos para rematar a codificación. Quen quere me comezar coa primeira liña de pseudocódigo para esta función? ALUMNO 8: Asegúrese de que que lle foi dada dous arquivos. Jason Hirschhorn: Aceptar. E se nós non somos? ALUMNO 8: eu ía regresar 0. Jason Hirschhorn: Debemos regresar 0? ALUMNO 8: Volver a - supresión. Sentímolo. Jason Hirschhorn: Yeah. Probablemente non 0. Porque 0 significa que todo era bo. Aceptar. Así que esta é a primeira liña de pseudocódigo. Quen ten a segunda liña do pseudocódigo? ESTUDANTE 9: Abre os dous arquivos? Jason Hirschhorn: Abre os dous arquivos. OK? ALUMNO 10: Comprobe O ficheiro é NULL? Jason Hirschhorn: Comprobe seguro que non son NULL. Como un aparte - cortar 0 - é que NULL? ALUMNO 11: Non Jason Hirschhorn: Iso non é NULL. Isto chámase o terminador NULL. É realmente escrito con só un l. Así, alomenos algo contra iso - que en realidade é un personaxe - así alomenos algo que está en contra non o mesmo que a verificación para ver se é igual a NULL. E algunhas persoas - nos seus probas e seu problema conxuntos - ten o dous deles confuso. Pero os dous destes son de feito diferente. Un termina unha cadea - é un punteiro para 0. ALUMNO 12: Por que non comprobar a asegurarse de que os arquivos non son NULL antes de abri-los? Jason Hirschhorn: Entón aberto gardada algo nese arquivo. E se volver aquí - así que esta liña - fopen - lle vai dar unha dirección e tenda este enderezo no arquivo se funciona. Se iso non funciona, pode almacenar NULL - ALUMNO 12: Oh Aceptar. Collín-te. Jason Hirschhorn: O ficheiro. Entón non pode comprobar a existencia de NULL antes de abri-los. NULL significa algo que non fixo funcionar correctamente. Aceptar. Entón, asegúrese de non é? Ou son? Que pensa? Imos con iso. ALUMNO 13: É. Jason Hirschhorn: É? Tampouco é? ALUMNO 13: É. Jason Hirschhorn: Aceptar. Parece que temos algúns consenso sobre iso. Nin é NULL. OK, próxima liña de pseudocódigo. Quen non me deu unha liña aínda? Imos esperar por ti. É. ALUMNO 14: Ten que ler desde o primeiro arquivo? Jason Hirschhorn: Aceptar. ALUMNO 14: Ou usamos fscanf ou algo así como que o primeiro arquivo? Jason Hirschhorn: Entón, queremos ler a partir do primeiro arquivo e - imos deixar isto ben aquí. Ler a partir do ficheiro de orixe. E entón, o que imos facer despois de que ler desde o ficheiro de orixe? Alguén máis? ALUMNO 15: Escribir en o ficheiro de destino? Jason Hirschhorn: Escribir para o ficheiro de destino, e - Aceptar. O que máis estamos perdendo? Alguén que non me deu un liña de código aínda - de pseudocódigo. É. ALUMNO 16: Quizais sempre pode comprobar se hai algo para ler a, como a seguinte liña? Isto é como a seguinte liña, ver se existir. [Electrónica Campá] Jason Hirschhorn: Oops. Ese é o meu programa journaling. Si? ALUMNO 16: Yeah. Jason Hirschhorn: Entón dea isto para min unha vez máis. ALUMNO 16: Asegúrese de que hai aínda a seguinte liña do ficheiro de orixe para ler. Jason Hirschhorn: Aceptar. Polo tanto, non estamos lendo liñas - estaban lendo bytes por aquí - pero está correcto. Queremos ler e escribir ata non hai máis bytes. Aceptar. E así, estes deben realmente ser recuado un pouco, xa que están alí embaixo. Non? Ata que estamos fóra de bytes, imos ler desde o ficheiro de orixe e escribir ao ficheiro de destino. E entón, o que é a última liña de pseudocódigo? Alguén que non é dado me algo aínda. ALUMNO 17: Pecha os ficheiros? Jason Hirschhorn: Exactamente. Pecha os ficheiros. Polo tanto, non é o noso pseudocódigo. Vou poñer o pseudocódigo en gedit, e nun par de minutos, codificará iso xuntos. Aceptar. Imos comezar como un grupo. Nishant, eu teño o meu novo ficheiro. Acaba de abrir iso. Documento Untitled 1. Cal é o primeiro que debería facer? Nishant: Incluír bibliotecas? Jason Hirschhorn: Aceptar. Que as bibliotecas? Nishant: stdio.h, stdlib.h, eu creo? Jason Hirschhorn: Aceptar. Que é stdlib a? Nishant: eu esquezo. Jason Hirschhorn: Aceptar. Polo tanto, incluír stdio. ¿Que debería facer antes de Comezar a programar? Nishant Escribe unha cabeceira? Jason Hirschhorn: Como fago para obtelo colorido? [Voces interpondo] Nishant: Como conseguiu iso de cor? Jason Hirschhorn: Como podo colorear codificación? Nishant: Eu non sei. Oh Salva. Jason Hirschhorn: Gardar. Si Eu debería garda-lo como un arquivo. C. Entón salva-o no escritorio como cp.c. Doce. E se eu desexa estilo completo puntos, o que debo incluír na parte superior? Nishant: Vostede podería escribir o seu nome, nome do programa, eo obxectivo do programa tamén? Jason Hirschhorn: Parece bo. Excelente. Entón comezou connosco perfectamente. # Include - Tamén imos escribir - Aceptar. Entón, eu creo que estou preparado para ir. Quen ten a primeira liña de código para min - ou as primeiras liñas de código que que será necesario para satisfacer o noso primeiro comentar en pseudocódigo? Vostede ALUMNO 18: Non debería ser int argc e char * argv? Jason Hirschhorn: Eu creo que está certo. Imos mudalo para int principais, paréntese aberto, int argc, coma, char * argv? Así? ALUMNO 18: Soportes. Jason Hirschhorn: Soportes. Abrir soporte, preto do soporte, preto do pai. Perfecto. Agora podo ter argumentos de liña de comandos. Aceptar. Asegúrese de que está dado dous arquivos. Vostede me pode dar iso tamén. ALUMNO 18: Se argc - este non coincide 3. Jason Hirschhorn: Se paréntese aberta O argc non igual a 3? ALUMNO 18: Si, retornar 1 ou nada. Jason Hirschhorn: Sentímolo. ALUMNO 18: Return 1 ou nada. Jason Hirschhorn: Return 1. OK? Grande. Abre os dous arquivos. Quen me pode axudar a abrir os arquivos? Quen non me deu código aínda? Kurt? Kurt: Entón, as tapas F-I-L-E Orixe estrela. Jason Hirschhorn: Vou para sacar as vogal. Aqueles son legais. É como Tumblr. ALUMNO 18: Igual fopen - Jason Hirschhorn: Igual fopen? ALUMNO 18: paréntese aberto, argv, soporte aberto. Jason Hirschhorn: Agarde. Sentímolo. Abrir paréntese. Aceptar. ALUMNO 18: Yeah. Argv sub 1. Jason Hirschhorn: Sub 1? ALUMNO 18: Yeah. Argv soporte aberto 1 - Si E, a continuación coma, e logo abre o dobre cita, r, comiñas dobres, paren próximos, punto e coma. Jason Hirschhorn: Sweet. E sobre o outro? ALUMNO 18: Moi semellante, pero en vez de S-R-C, diría que é D-S-T. Jason Hirschhorn: Oo! Me gusta diso. ALUMNO 18: Só D-S-T. É. E, a continuación, argv, soporte aberto, 2. É. E, a continuación, no canto de w r. É. Jason Hirschhorn: gran. Seguinte par de liñas. Ademais, se alguén ten cousas a engadir ao liñas que fixemos, póñase en engade-as tamén. Asegúrese de que non é NULL. Quen me pode dar o código que eu teño satisfacer esta liña de pseudocódigo? Archer. ARCHER: Se src igual iguais NULL ou dst iguais iguais NULL, entón volver - Jason Hirschhorn: O que? ARCHER: Return 2? Jason Hirschhorn: Return 2. Entón, se paréntese aberta src igual é igual a NULL, ou - sexa alí o que thing 's - cachimbo? Cachimbo? Imos chamalo de tubulação. Pipe, cachimbo, dst iguais iguais NULL, o retorno 2. OK? Ata que estamos fóra de bytes - nós medio que pulou esa etapa de a parte pseudocódigo para ir aquí. Pero ata que estamos fóra de bytes - o que iso parece? Que tipo de estructura C - pero eu non usar a estrutura da palabra, porque nós imos comezar a usar que noutros casos - pero ferramenta C é que o son como? ALUMNO 19: Un lazo. Jason Hirschhorn: Un loop. Soa como un loop. Entón, quen me pode dar a primeira liña do código de loop aquí? Tamén podes escoller o tipo de loop que quere, se me der esta liña de código. Existen tres tipos. Comeza a escoller. Quere suxerir un deses. Avi. Cal deles quere? AVI: FOR. Jason Hirschhorn: FOR. AVI: int i é igual a cero. Jason Hirschhorn: Aceptar. AVI: Esta parte eu non estou seguro. Pero i é menos que o tamaño de fonte de estrela? Eu non estou seguro diso. Jason Hirschhorn: Aceptar. AVI: Por quere a tamaño dun ficheiro, non? Jason Hirschhorn: Entón, iso probablemente non vai ofrécenos o tamaño do real ficheiro en bytes. Entón o que máis poderiamos facer? ¿Que é un outro tipo de loop? Ou debemos estar co loop FOR? ALUMNO 20: Vostede podería facer un loop while? E entón, o que faría se you'd - porque temos un char * para o arquivo. Entón, se nós só seguir incrementando que ata que quere atopar o carácter NULL en o fin de todo? Ou non, é que non como os ficheiros de traballo? Jason Hirschhorn: Entón podemos manter incrementando o char * ata atopamos a NULL - ALUMNO 20: Esencialmente continuar carácter por carácter ata chegar a fin do ficheiro. Jason Hirschhorn: si. Entón é iso que queremos facer. Queremos manter a lectura, carácter polo personaxe, ata chegar ao a fin do ficheiro. ALUMNO 20: Yeah. Atope - o que é o fin ou sinal de parada ao final dun ficheiro de texto. Jason Hirschhorn: Aceptar. Así, cando chegar ao final do arquivo - como sabemos que chegamos o fin dun ficheiro? Se eu estou chamando - entón imos dar un paso atrás. ¿Que é unha función? Imos para esta liña aquí. Ler a partir do ficheiro de orixe. Quen me pode dar esa liña de código? ALUMNO 21: fscanf? Jason Hirschhorn: fscanf. Aceptar. E se eu queira ler, moi especificamente, un byte? ALUMNO 21: Eu non sei. Jason Hirschhorn: Aceptar. Aínda máis simple do que fscanf - o que é un - Quero ler desde un ficheiro de orixe? Ler un ficheiro de orixe. ¿Que é unha función - si. ALUMNO 22: É fread? Jason Hirschhorn: Fread. Creo que imos ir con que un por agora. Que tipo de argumentos fread non tomar? ALUMNO 22: Probablemente o tipo de arquivo, e localización no arquivo? Jason Hirschhorn: Que podo escribir aquí para descubrir que o tipo de argumentos fread leva? ESTUDANTES múltiples: Home fread. Jason Hirschhorn: Home fread e fwrite. Parece que saen xuntos. Entón fread leva cantos argumentos? ALUMNO 23: Catro. Jason Hirschhorn: Leva catro argumentos. Hai que un punteiro, un tamaño, e que cousa, o que é raro, e algúns arquivos. OK? Imos ler sobre iso aquí. "A función fread le n memb elementos de datos, cada un de tamaño bytes de lonxitude, desde o fluxo apuntado por transmitir, almacenando os no lugar dada polo punteiro ". Entón, catro argumentos. Por que non podo simplemente copiar tanto, e pegalo aquí. Aceptar. Entón, quen pode comezar a cubrir estes argumentos para min? Avi. AVI: Elimina o baleiro. Pon só src. Elimina do punteiro ea estrela. Pon src. Entón - Jason Hirschhorn: Entón eu vou deixar ti alí, por iso é incorrecto. Está certo co src pero onde debe src ir? [Voces interpondo] Jason Hirschhorn: debe pasar por riba aquí. Ese é o src - noso src é un tipo. Imos dar un ollo aquí. Isto é pedir a un tipo FILE *, nós de feito, normalmente velos así. Entón, iso é pedir a un argumento de tipo de ficheiro * chamado córrego que se src. OK? O tamaño das cousas facer queremos ler? Eu che dei iso no descrición do problema. ALUMNO 24: Un byte de cada vez. Jason Hirschhorn: Un byte. Cal é o tamaño dun byte? O seu tamaño é en bytes, entón o que Podo poñer alí? ALUMNO 25: Unha. Jason Hirschhorn: Unha. Correcto. O seu tamaño é de byte unidade, entón 1 é un byte. Cantos quero ler dunha vez. ALUMNO 26: One? Jason Hirschhorn: Unha cousa. Quero ler algo do tamaño 1, unha mordida de cada vez. E onde é que eu poñer-lo, xa que eu ler? ALUMNO 27: Destino? Jason Hirschhorn: Entón, eu non podo poñer lo en liña recta en destino. ALUMNO 28: Vai poñer lo nun terceiro punteiro? ALUMNO 27: ao destino. Jason Hirschhorn: Aceptar. É. ALUMNO 29: Pode declarar algo a actuar como un almacenamento temporal anteriormente. Jason Hirschhorn: Aceptar. Dáme iso. ALUMNO 29: Outro ficheiro punteiro, quizais? Jason Hirschhorn: Aceptar. Polo tanto, esta é estrela baleiro - é un tipo void estrela, para que non ten que ser un punteiro de arquivo. E se eu estou lendo un byte, onde sería un bo lugar para almacenar un byte? ALUMNO 29: Unha matriz? Jason Hirschhorn: Unha matriz. Aceptar. E o que máis é algo que se só o tamaño dun byte? ALUMNO 30: A char *? ALUMNO 29: Yeah. Jason Hirschhorn: Un char * non é un byte. ALUMNO 29: un char. Jason Hirschhorn: Un char é un byte. Non? Entón, imos chamar este búfer é un xenérico nome usado para estas cousas para gardar algo temporal. Así que crear un buffer. Non? Pero hai que ser un void *. Entón, talvez está certo, que el debe ser un tapón de tamaño 0. Entón, el almacena un - dereita. Por iso aquí - carácter buffer é un personaxe, pero iso leva un void * - un punteiro. Entón, eu podería facelo, e agora buffer é un punteiro. O que máis eu podería facer? ALUMNO 31: Pon unha estrela xunto a char. Jason Hirschhorn: eu podería telo creado char *. Aceptar. Qué é outra cousa que eu podería facer? Ou imos con este. Char * buffer, entón o que podo poñer aquí? ALUMNO 31: Buffer. Jason Hirschhorn: Buffer. Buffer é un punteiro para un char. E nese lugar, estamos poñendo un byte de algo que lin. É. Avi. AVI: Só unha pregunta rápida. Quere malloc tapón? Jason Hirschhorn: Quen pode responder a esta pregunta? ALUMNO 32: Ben, non realmente punto para nada agora, entón - Jason Hirschhorn: Pero facer queremos malloc isto? ALUMNO 32: Se tivese que facelo que xeito, creo, si, porque precisa algún lugar para el para apuntar para. Jason Hirschhorn: Será que ten que malloc isto? ALUMNO 33: Se está indo a usalo fóra do loop. Jason Hirschhorn: Será que imos usalo fóra do loop? ALUMNO 34: Si ALUMNO 35: Espera. Queremos declaralo la no circuíto ademais? Jason Hirschhorn: Entón eu creo que temos algúns pseudo loop while aquí que estamos tentando descubrir o que nós non tivemos aínda. Non necesitamos malloc-lo. Estamos operando en principal, vai só para o uso dentro deste loop. Non precisa de existir fóra deste. Así, pode ser unha variable local. Ten un punteiro para unha variable local. ALUMNO 36: Pero non é apuntando para calquera cousa. Jason Hirschhorn: Non, non é iniciar para nada. Pero nós non imos usalo tamén. Imos poñer algo en que a primeira vez que usalo. Así que parece Aceptar. Entón, nós non precisamos de malloc aquí. E eu creo que é OK como está. Aceptar. Temos a liña fread. Imos facer a seguinte liña. Se queremos gravar nun ficheiro, o que é unha boa función para usar para facer iso? ALUMNO 37: fwrite? ALUMNO 38: fprintf? Jason Hirschhorn: fprintf é un deles. O que é máis unha? ALUMNO 39: fwrite. Jason Hirschhorn: fwrite. E, para os nosos propósitos, fwrite, que vimos aquí, é probablemente a mellor opción. Leva catro argumentos tamén. Nishant, pode dar mos argumentos? Nishant: curso do primeiro un ser só tapón. Jason Hirschhorn: Aceptar. Nishant: A segunda de só será 1. Terceiro será 1. E o cuarto será dst. Jason Hirschhorn: Alguén ten calquera dúbida sobre esta liña? Isto parece bo. Aceptar. Entón, agora parece que o único que estamos falta - de feito, imos escribir esta última liña. Pecha os ficheiros. Quen pode concluír-nos a escritura estas dúas últimas liñas? Si Sentímolo, cal é o seu nome? Lucy: Lucy. Jason Hirschhorn: Lucy. Lucy: src fclose e despois fclose destino. Jason Hirschhorn: fclose, paréntese aberto, src, paren próximos, punto e coma. E fclose - É mesmo? Lucy: Abrir parénteses, dst e logo, punto e coma. Jason Hirschhorn: gran. E o que debo incluír ao final? Lucy: Return 0. Jason Hirschhorn: Return 0. Teño que? Só unha pregunta. Temos que incluír return 0? ESTUDANTES múltiples: Non Jason Hirschhorn: Non Iniciar fai iso automaticamente Se chegar ao final. Pero eu creo que é bo inclui-lo explicitamente. Especialmente cando estamos volvendo outro as cousas ao longo do programa. Aceptar. Isto é o que falta - Mentres o que? Quen pode pensar nalgunha - Ten algunha idea do que cousas podería entrar alí? Aínda que sexa só nun pseudocódigo como a linguaxe? O que estamos realmente - o que queremos ir? Si, Lucy. Lucy: O fin do ficheiro. Jason Hirschhorn: O fin do ficheiro. Entón, o que quere dicir co fin do ficheiro? Lucy: Cando chegar ao final do arquivo, pare. Jason Hirschhorn: Aceptar. Así, unha vez chegamos ao final do arquivo. Como sabemos cando chegamos a fin do ficheiro? ALUMNO 40: Creo tapón será definido como NULL. ALUMNO 41: Buffer é declarado dentro do loop. Jason Hirschhorn: Entón pensas buffer será definido como NULL. Por que o buffer definirse como NULL? ALUMNO 40: Porque cando fread, estás a poñer nada en buffer. Jason Hirschhorn: Aceptar. Entón está a pensar fread - cando chegamos ao final do ficheiro, o que é fread vai facer? Creo que esa é a cuestión debemos descubrir. Que fread facer? Será que poñer NULL no buffer, ou fai outra cousa? Como podemos descubrir o que fai? ALUMNO 42: Home. Jason Hirschhorn: Home. Entón, imos ollar para aquí. Valor de retorno. En caso de éxito, fread e fwrite voltar a número de elementos lidos ou gravados. Este número coincide co número de bytes trasladado só cando o tamaño é 1. Se ocorrer un erro, ou a fin do ficheiro é alcanzado, o valor de retorno é un conta de elementos curto ou 0. Así, para os nosos propósitos, se alcances fread Ao final do proceso, e le-se a partir de a fin do ficheiro, non hai máis nada de ler, que é o que vai volver? ALUMNO 43: Cero? Jason Hirschhorn: O que? ALUMNO 43: Cero? Jason Hirschhorn: Cero. Vai voltar cero. Entón, nós sabemos que fread, cando temos alcanzou o final do arquivo, vai para volver a cero. Como podemos usar isto ao noso favor? AVI: Pode declarar unha variable fóra do circuíto de chamada de cheque. Se a verificación é igual a - polo de agora - un. Jason Hirschhorn: Aceptar. AVI: E entón podes poñer un IF declaración logo fread dicindo que se fread é igual a cero - ningún. Jason Hirschhorn: Quen pode axudar Avi fóra? AVI: Cal é o valor retorno por fread? Jason Hirschhorn: Nós só pasou por riba diso. AVI: Como representa-lo? Jason Hirschhorn: El retorna - imos buscar por aquí - el retorna un size_t, que é esencialmente un enteiro. Entón, el retorna un enteiro. E no noso caso, será voltar 1 ou 0 - 1 se ler unha cousa - un byte, e 0, se ten chegado ao fin. Entón, se fread - É mesmo? ALUMNO 45: Non pode simplemente poñer o pleno fread (tapón, 1, 1, src) en while? Jason Hirschhorn: Entón propón facendo iso para alí? [Voces interpondo] Jason Hirschhorn: Espere un pouco. Entón, nós estamos librando diso. Entón, está propoñendo poñer en fread alí? O que temos que tamén mover se quere facer isto? ALUMNO 45: O búfer de fóra. Jason Hirschhorn: Debemos tamén mover este aquí. ALUMNO 45: Mais o fai constantemente movelo para adiante? [Voces interpondo] Jason Hirschhorn: Aceptar. Entón é iso que Okshar proposto. Creamos o noso buffer. Nós Mentres fread, entón nós fwrite. Pensa sobre iso? ALUMNO 46: A miña única pregunta é: sería realmente executar a orde fread? Jason Hirschhorn: Gran pregunta. Cando está poñendo unha chamada de función dentro dunha condición, de que forma chamada de función realizar? Nós xa vimos exemplos diso antes. Non? ALUMNO 46: Aceptar. É. Entón fai executar. Jason Hirschhorn: Vimos cousas así antes, onde temos unha chamada de función dentro dunha condición. Será que esta chamada de función realizar? Si Polo tanto, a resposta é si. Esta chamada de función será executada. Pero, de novo, iso é o que queremos? ¿Que é un xeito que poderiamos imaxinar se é o que queremos? ESTUDANTES múltiples: Executa-o? Jason Hirschhorn: Podemos executalo. Pero antes de facelo, poderiamos tamén razoar por iso. Se - dicir que temos un byte na nosa ficheiro, nós imos chegar ata aquí, nós imos chegar a este código. Este será executado. fread volverá un byte e almacena-lo no buffer. E iso vai avaliar a 1, dereito, despois de que el retorna 1. Así, mentres a 1. Isto significa que o código dentro o loop while levará a cabo? ALUMNO 47: Yeah. É certo. Jason Hirschhorn: si. 1 é certo. Non é 0. Así, o código aquí dentro será executado. Entón imos escribir isto. Nós imos voltar a este liña unha vez máis. Agora temos - estamos ao final do noso arquivo. Lemos desde o final do noso arquivo, porque só tiña un byte nela. Fread retorna 0, tendas algo no tapón. Eu honestamente non sei o que almacena en buffer. Nós probablemente podería mirar para arriba a ver que fai. Que eu sinceramente non sei. Non sabemos, quen lle importa o que almacena en tapón? Pero iso non voltar 0. E será que, aínda que 0 realizar? Mentres 0 non se levará a cabo. Entón imos pasar por aquí. Entón, imos comezar un concerto de mans, se esta é o código que debe ser executado, ou se debe facer cambios en primeiro lugar. Entón, se vostede pensa - ten que votar. Se pensas que hai que executar este código como é, por favor, levante a man. Aceptar. Hai un - ten unha dúbida, preocupación? É. ALUMNO 48: Despois de pasarmos tapón fóra do loop, nós ten que malloc isto? Jason Hirschhorn: Gran pregunta. Despois de pasarmos tapón fóra do loop, temos que malloc isto? Esta é unha cuestión de alcance. Se iniciar o buffer fóra deste ciclo, vai existir dentro do ciclo? ESTUDANTES múltiples: Si Jason Hirschhorn: si. O seu ámbito de aplicación abrangue dentro do loop, e, en realidade, calquera cousa por baixo del dentro deste código, incluíndo a as cousas aquí dentro. Entón, nós non precisamos malloc-lo. É unha variable local, eo seu ámbito aínda inclúe o loop. ALUMNO 49: Será que necesitamos para liberalo la? Jason Hirschhorn: Será que Debe buffer libre? ALUMNO 49: Si, se non o facemos malloc. Jason Hirschhorn: Será que Debe buffer libre? Non. De novo, é unha variable local, de modo que non necesitamos para liberalo la. Aceptar. Imos ver o que acontece. Por iso, non é inicializar. Isto foi o que algo que Marcus proposto anteriormente. Polo tanto, temos que o erro, tapón variable é non iniciar cando usados ​​aquí. Como podemos solucionar isto? ALUMNO 50: malloc isto? ALUMNO 51: Igual a NULL? ALUMNO 52: Diga tapón é igual a NULL. Jason Hirschhorn: Aceptar. Parece bo. Temos agora. Imos crear algo para tratar de copia. Entón, nós temos o noso arquivo de texto. Como podemos executar este programa? É. ALUMNO 53: Podes facer dot cortar cp, teste.txt. E entón pode nomear outro ficheiro que vai gardar a. Jason Hirschhorn: Aceptar. Imos chamalo out.txt. Legal? L culpa. Reflexións sobre o fallo seg? Isto é óptimo. Como podemos descubrir onde a culpa é seg? O que? ALUMNO 54: gdb. Jason Hirschhorn: gdb. Corremos gdb escribindo barra gdb punto, o nome do noso programa. Non hai argumentos de liña de comandos alí. Imos establecer un punto de interrupción na principal. Se eu queira comezar gdb, o que fago? ALUMNO 55: R. Jason Hirschhorn: R. E despois? ALUMNO 55: Os argumentos? Jason Hirschhorn: A continuación, o argumentos de liña de comandos. Imos examinar. N é só me levando liña por liña. Eu estou indo a ir ata Recibe a miña culpa seg. Non é a miña culpa seg. Parece que fread causado miña culpa seg. Sei fread causada pola miña culpa Lun, porque esa era a liña que só executado. E o único que era pasando nesa liña - dúas cousas foron a suceder. Fread estaba indo, e despois fomos facendo algunhas probas while. Eu estou disposto a apostar que a while verificación non estaba causando a miña culpa seg. Moi probablemente, fread foi causando a miña culpa seg. Eu tamén vexo algo aquí, memcopy. Copia da memoria. Soa como movendo de memoria un lugar a outro. Soa como algo que ía ocorrer en fread, quizais algunha memoria mover de aquí ata aquí. Imos pasar por iso de novo. ¿Como comezar de novo e executa-lo novo? É. ALUMNO 56: Debe poñer un e comercial antes de tapón? Jason Hirschhorn: Entón e comercial antes buffer de me dar o enderezo de buffer, que é un char *. Imos percorrer este unha vez máis. Como fago para executar con el unha vez máis? ALUMNO 57: pode só escriba correr de novo? Jason Hirschhorn: Escriba correr de novo. Entón, nós non imos executar esta liña. Entón buffer é un punteiro NULL. Corrixa? Está apuntando - imos ver. Se temos a nosa - sacar unha foto rápida deste. Todo o mundo pode ver se Eu escribo aquí? Entón, na pila, temos un lugar de variable e chámase buffer, e é un punteiro para un char. O enderezo é este carácter no? ALUMNO 58: 0x0. Jason Hirschhorn: Certo. Iso é o que é. Desde aquí, dentro de buffer, almacénase 0x0. Iso é o que temos - o configuración que temos agora. Entón esta liña, fread, pon algo da fonte onde? Dentro desa caixa ou esta caixa? Que caixa? Caixa ou caixa dereita e esquerda? Este cadro da dereita. El segue o punteiro, e pon-lo aquí. Cando tratamos e memoria toque localización 0, que é o que imos chegar? Un fallo de segmento. Ese é o erro que temos agora. É. ALUMNO 59: Non ten poñer tapón estrela? Ou non? Para fread? Jason Hirschhorn: Entón fread leva un punteiro. Así, el pasa en tapón. E entón el vai de-referencia que nalgún lugar dentro fread. Pero, de novo, nós vimos, é preciso un punteiro. Non precisamos pasalo tapón estrela. Iso sería pasar que o que está aquí. E que, probablemente, darnos un erro porque estamos des referenciando-lo. Non? Cando de-referencia este punteiro cando intentamos acceder a este sitio, estamos a recibir un erro - nosa fallo de segmento. So - oops. Nós imos saír de gdb. Nosa liña - o noso problema - é certo aquí nesta liña. E é un problema, porque desta liña. Como podemos crear unha caixa que está accesible en fread. Non? Necesitamos crear unha caixa que é unha byte grande, o tamaño dun caracter. Pero necesitamos que a caixa para ser accesible cando esta función é executada. Entón, onde - si. Algunha idea? ALUMNO 60: Só ten que configurar-lo como calquera de caracteres aleatorios. Só ten que facer iguais char buffer o personaxe. E entón, cando ten buffer de alí - Jason Hirschhorn: Agarde. Char tapón? Entón, ningunha estrela? ALUMNO 60: Yeah. Elimina a estrela. Igual a un personaxe ao chou. Jason Hirschhorn: Aceptar. Entón me dea un. ALUMNO 60: Como un ou algo así. E entón cando tes tapón alí, usa un - ALUMNO 61: Star? Ah, non, o E comercial. ALUMNO 60: Utilice o comercial. Jason Hirschhorn: Aceptar. E que dicir en fwrite? ALUMNO 60: Use o comercial de novo. Jason Hirschhorn: Todo ben. Polo tanto, a súa idea é, creamos un char e poñer algo nela, e, a continuación, escribir para ese carácter. ALUMNO 60: Yeah. Jason Hirschhorn: Qué que a xente pensa? ALUMNO 62: É complicado. Jason Hirschhorn: Aceptar. Imos tirala. Entón, esta vez, eu vou chamar iso de vermello na pila aquí, e entón nós terá - ooh! Sentímolo. Entón, esta vez temos unha cousa chamada tapón, e é na pila. Corrixa? E nós estamos a gardar nunha, inicialmente. Entón temos o noso chamamento para fread. O fread fai é que leva un byte de noso arquivo e coloca-lo nalgún lugar. Ela coloca-lo en calquera que sexa o cousa está a apuntar. Ben, antes de que tivemos este enderezo - 0x0. Agora, a dirección que temos? ALUMNO 63: Sexa cal sexa tapón enderezo é. Jason Hirschhorn: Whatever tapón enderezo é. El probablemente vai ser algo parecido. Probablemente vai comezar cun b e un f, e despois ten outros seis díxitos hexadecimais. Non importa. Algúns enderezo. E nós estamos pasando a dirección dentro E nós imos poñer o noso único cousa byte naquel enderezo. Entón, nós imos poñer o noso único byte cousa aquí dentro. E entón imos escribir a partir de o que é sempre aquí dentro. Alguén ten algunha dúbida sobre iso? Quen pensa que este código vai funcionar? Levante a man se pensas este código vai funcionar. Ten que tomar unha posición. E quen pensa que este código non vai funcionar? Levante súa man. Todo o mundo debe ser levantando a man. Aceptar. Michael, onde está de pé? MICHAEL: Eu non podo decidir. Kind of no medio. Jason Hirschhorn: Vostede é no medio. Escolla un. MICHAEL: Vou ter fe e dicir que vai funcionar. Jason Hirschhorn: Aceptar. Vai ter fe e din que funciona? Que pasou? [Voces interpondo] Jason Hirschhorn: Sen fallo seg. Como podemos comprobar que dúas cousas son iguais? Dous ficheiros son iguais. ALUMNO 64: Dif. Jason Hirschhorn: Dif. Cheques Dif para as diferenzas entre dous arquivos, e se volve nada, son idénticos. E se abrir, temos o noso arquivo. Entón esa foi a solución correcta. Imos mirar para atrás, unha vez máis. De feito, nin sequera necesario arrincar el. El probablemente sería un pouco máis limpo, se non puxo algo aleatorio alí. A cuestión é, necesitas crear un espazo para gardar algo de fread e tomar algo de fwrite. E esa cousa tiña que ser un lugar de variable na pila - vostede podería malloc algún espazo. Entón, en realidade, podería malloc escrito aquí, e que tería funcionando. E, entón, sería o almacenamento nosas cousas en algún lugar en pila. Pero este é, en realidade, probablemente, a solución máis elegante. Só ten que crear un espazo na pila por estas cousas para ir. Eu dous outros comentarios. Se tivese que tomar a súa vez nesta, e logo se marcou con iso, os meus comentarios sería do seguinte xeito. Estes 1 está aquí, para min, mire como números máxicos. Este 1, en termos de fread, ten sentido. Ese é o número de cousas para ler ou escribir. Pero este aquí debería probablemente ser outra cousa. Entón, o que é unha solución? ALUMNO 65: Tamaño de byte. Jason Hirschhorn: Así? ALUMNO 65: Tamaño de carbón. Jason Hirschhorn: Tamaño de carbón. Si, byte non é un tipo. Así, o tamaño das obras de caracteres. Poderiamos ten, na parte superior da o noso código, # definido que. Chamado algo byte e é realmente un char. En realidade, unha visión aínda mellor pode ser iso - uint. Alguén sabe o que é iso? Sentímolo. Teño-o para atrás. Espera, non. Cal é a forma que vai? Alguén sabe o que é iso? É. ALUMNO 67: Suposto para axudar a estandarizar mediante sistemas de cousas que ter - como enteiros sen signo que ten 8 bytes? Jason Hirschhorn: Isto é exactamente correcto. En máquinas diferentes, o tamaño dun char - xeralmente non un char. Chars son xeralmente un byte. Pero o tamaño de outros tipos de datos son tamaños diferentes nunha máquina de 32 bits contra unha máquina de 64 bits. Un uint8_t sempre 8 bits - sempre un byte. E eu teño incluír este arquivo de cabeceira int estándar. Entón, agora, este probablemente sería o mellor xeito de escribir este código. Entón, para me librar dos números máxicos. E eu tamén teño un máis lóxico tipo de buffer. Non é simplemente un carbón animal, que é un byte, que é o que esperamos que sexa. E aquí, temos realmente foi un pouco máis robusto. Non estamos chamando iso de char, que - quizais, quen sabe - pode ser un diferente tamaño en diferentes máquinas. En realidade, estamos dicindo que iso é un byte, sempre, non importa o que. E se miramos aquí, facemos CP. Uh-oh. Que pasou? ALUMNO 68: Pode ser trocada. Jason Hirschhorn: O que? ALUMNO 69: É? ALUMNO 70: Non fixo define-lo como un tipo. ALUMNO 71: pero debe ser definidos na norma. ALUMNO 72: O que está a suceder? ALUMNO 73: Debe definir todas as tapas? Jason Hirschhorn: Entón non é # define. De feito, neste caso, eu son vai utilizar typedef. Porque nós estamos usando-o como un tipo nun único local. Polo tanto, neste caso, nós realmente queremos typedef que estamos imprimindo un novo tipo byte, e é, esencialmente, este. É un pouco diferente do que # define. E agora, o noso código funciona perfectamente. Entón, unha vez máis, # define leva algo, substitúe-lo en todas as partes coa outra cousa. É só unha macro - taquigrafia para se librar dos números máxicos. Pero neste caso, porque somos utilizando-a como un tipo - aquí - para que isto funcione, necesitamos typedef para todo o que é byte. E nós estamos definindo-o aquí. Non é un struct, é realmente só un enteiro sen sinal. É un byte. Este código está dispoñible en liña, e vostedes todos deben te-lo agora. Entón temos - perfecto - 13 minutos á esquerda para entrar problema ao longo do xogo 5. Quero camiñar a través copy.c xuntos, e despois imos falar brevemente sobre as outras partes do conxunto de problemas. Entón deixe-me puxar arriba copy.c. E o máis legal é que realmente xa escribiu unha morea de este código. O código que escribimos literalmente saíu de aquí cando eu era escribindo isto por conta propia. Pero iso é copy.c, constitúe a base para as dúas primeiras partes da o conxunto de problema para whodunit.c, que ten que escribir, e resize.c. Recover.c, que é a terceira e última parte do conxunto de problemas, non é baseado fóra deste ficheiro. Vas a necesidade de escribir o ficheiro, nós dámoslle un modelo para que ficheiro, mais non ten nada a ver con copy.c. Senón porque copy.c é a base para as dúas primeiras partes, nós imos de atravesa-la agora, así que ten unha boa idea do que fai. E os comentarios dar un pouco del. Nós xa escribimos algo iso. En primeiro lugar, estamos asegurarse de temos tres argumentos. A continuación, imos lembrar o nome do ficheiro. Entón, nós saltamos esta etapa cando codificamos nosa cousa - cando o noso CP. Pero aquí, están facendo algo máis limpo. Eles están comprobando se ambos os ficheiros son bos, en Ademais de abri-los. Nós escribir todo este código só agora, polo que estou non vou me debruzouse sobre este código. A continuación é algo que é específico para tipo de arquivos que estamos a usar, o que son arquivos de mapa de bits. Arquivos de mapa de bits ten algúns metadatos que lles están asociados. Así, o primeiro par de bytes informarlles lo sobre o arquivo. Non son as cores da o pixel na referida imaxe. Din-lle sobre o arquivo. E se ler o conxunto de problemas, terá moita máis información sobre que tipo de estruturas de metadatos están incluídos con bitmaps. Pero é por iso que temos este primeiro conxunto de - este código aquí. Estamos lendo os metadatos - dous anacos de metadatos - o ficheiro cabeceira eo cabeceira info. E estamos comprobando algunhas partes del para asegúrese de que é un ficheiro de mapa de bits certo antes de continuar. E unha vez máis, estes son detalles que Non é necesario entrar en momento. Se ler o conxunto de problemas, vai entender iso. Para reducir a historia, estes son só dicindo, este é un ficheiro de mapa de bits e confirmando que. Logo estamos escribindo os para o arquivo para fóra. Vemos que aquí. Estamos escribindo para o punteiro para fóra. Logo estamos determinando estofado. Entón, de novo, como é particularidade con un ficheiro de mapa de bits, algunhas liñas de incluír recheo ao final. E se ler o conxunto de problemas, vai aprender máis sobre o recheo. Esta é a fórmula para determinar o recheo. Importante lembrar - cando cambiar o tamaño dun bitmap ficheiro, o recheo cambios. Cando cambia o tamaño dun ficheiro, o recheo cambios. Isto non vai ser máis de 3 - será de 0 a 3, inclusive. Pero cando cambiar o tamaño da algo, os cambios de enchido. Se eu tivera só un pixel nesa liña, eu precisa de tres bytes de recheo, xa que cada liña ten que ser múltiplos de catro bytes nun ficheiro de mapa de bits. Pero se eu dobre-lo, para ir dun píxel de dous píxeles, cada un dos cales, imos dicir, é un byte, entón eu teño dous bytes de recheo para facer que igual a catro. Entón, cando cambiar o tamaño de algo, Eu teño cambiar a cantidade de recheo que eu teño. Isto ten sentido para todos? Logo iterado sobre cada liña, ou a través de todas as liñas. E, entón, iterado cada columna en cada liña. Estamos tratando este como bitmap unha reixa, como temos tratado a tarxeta en 15. Como nós tratamos os ladrillos cando nós impreso-los na pantalla. Unha reixa de liñas e columnas. Entón - vimos isto. Nós, en realidade, só codificado esta. Creamos algunhas almacenamento temporal. Lemos alí, e, a continuación, nós escribilo. Este é o que nós fixemos. Logo, porque eu dixen que cada liña remata nalgún estofado, nós saltar que estofado - o antigo estofado. E, entón, engadir lo de volta. Neste caso, estamos creando exactamente o mesmo ficheiro. Estamos só copialo. Polo tanto, esta liña é medio parvo. Poderiamos literalmente poñer o recheo interior Pero se cambiar o tamaño do arquivo, aínda quere esta liña? Entón, se nós cambiar o tamaño dun ficheiro, aínda quero saltar sobre o antigo estofado? ALUMNO 74: Si Jason Hirschhorn: Entón, o que facemos. Porque este, unha vez máis, ofertas co arquivo de orixe. Nós non nos importa sobre o recheo do ficheiro de orixe. Queremos ir á seguinte liña. Pero non basta poñer de volta o vello cantidade de recheo. Necesitamos poñer de volta o nova cantidade de recheo. Entón, cando nós estamos cambiando o tamaño dunha arquivo, aínda queremos saltar o recheo no ficheiro de idade - o que estamos lendo en partir. Pero o que estamos escribindo para, imos a necesidade de poñer de volta un pouco diferente número de recheo que nós determinado. É. ALUMNO 75: A orde dos dous liñas non importa, non? Porque está lidando arquivos diferentes. Jason Hirschhorn: Exactamente. A orde destas dúas liñas non importa. Nós escribir esta liña. Este é aquí para o arquivo estamos escribindo. Isto é importante, polo que temos a cantidade correcta de estofado. Isto ten que xestionar o arquivo en formato. Queremos saltar sobre o recheo. Non quero ler - se estamos a ler un byte de cada vez, nós non se preocupan eses bytes de enchido. Queremos pasar á seguinte liña. Por último, así como Lucy deu para nós, imos pechar os ficheiros e voltar 0. Polo tanto, esta é copy.c. E nós realmente escribiu - que pasou a maior parte da sección escribindo isto, esencialmente. Vostede fixo iso. Polo tanto, esperamos que teña un sentido común do que está pasando aquí. A gran diferenza, sinceramente, é só Nesta primeira parte que trata sobre peculiaridades de arquivos de mapa de bits. Entón, eu teño como o meu seguinte diapositiva, o que necesitamos facer? Ben, imos pensar en novela policial. E para alguén que ler o conxunto de problemas, que é o que imos cómpre facer a whodunit? Simply. Aleja. ALEJA: Pode aproveitar a parte de cada pixel, que indica a vermello. E entón - especie de? Jason Hirschhorn: Aceptar. Entón, elimina a parte de cada un pixel que indica vermello. É preto, pero non todo isto. ALUMNO 76: Ben, non hai diferentes formas de facelo. Jason Hirschhorn: Aceptar. Déame un xeito. ALUMNO 76: Elimina todo o vermello, e logo destacar o azul eo verde. Jason Hirschhorn: Aceptar. Así, dado estes dous aspectos - parece que darlle un pixel, el ten un nivel de vermello, azul e verde. Queremos cambiar os niveis relativos de o vermello, azul e verde, en función en que o pixel. Onde neste código debemos cambiar o parente vermello, azul e verde os niveis de un dato pixel. Despois de que o lin - antes de gravala-lo? Dáme o número da liña. ESTUDANTES múltiples: 83. Jason Hirschhorn: 83. Entón aquí. Para whodunit, o código que precisa para write todos deben ir á dereita alí. E iso é o único código ten que escribir. Porque, como escoitamos, todo o que precisa facer é cambiar estes azul relativa, niveis de vermello, verde e de cada pixel. Le-lo, e agora está indo a escribilo. ¿Como que - se eu teño esa cousa chamado triple, ben aquí, e é de escriba RGBTRIPLE - ben, se olhássemos en bmp.h, o que é RGBTRIPLE? ALUMNO 77: É un struct. Jason Hirschhorn: RGBTRIPLE é un struct. Vemos que ben aquí. E así se eu quería acceso, por exemplo, o nivel vermello da estrutura, como fago acceder o nivel vermello desta struct? [CLASE murmura] ALUMNO 78: RGBTRIPLE.rgbtred? Jason Hirschhorn: Isto é correcta? ALUMNO 79: Debe ser triplo punto, en vez de RGBTRIPLE punto? Jason Hirschhorn: Triple. Triple é a variable local, así aquí, non hai indicadores aquí. Entón, é só usar a notación de punto. Isto vai me dar o nivel de vermello. Se quero cambiar isto, eu só definir que equivalen a algo diferente. Entón, de novo, esta liña de código accede esta variable dentro desa estrutura, e podemos definilo como algo novo. Así, para whodunit, de novo, iso é, en esencia, o que necesitamos facer. Moi sinxelo. Só ten que cambiar algúns niveis relativos, e este é o lugar onde este código vai. Cambiar o tamaño, por outra banda, é un pouco máis complicado. En realidade, é probablemente o redimensionamento máis complicada parte deste conxunto de problemas. Temos tres minutos para pasar por iso. Pero, de novo, xa escribimos a maior parte deste código, de xeito que debe ser moi familiar. Cales son algunhas das cousas que queremos facer en cambiar o tamaño, se xa leu sobre o conxunto de problemas? Se lles dá a min, nós Pode falar sobre elas. Cales son algunhas das cousas que queremos facer? ALUMNO 80: vertical - así que ten que horizontal redimensiona-la, pero vertical redimensiona-la tamén? Jason Hirschhorn: Entón, se nós estamos dando un pixel, e queremos redimensiona-la por un factor de dous, agora hai que redimensionadas horizontal e redimensionadas vertical. Será que isto ten sentido? É. Entón, esta é probablemente a maior desafío. E imos falar sobre iso nun segundo. É. ALUMNO 81: O xeito que eu penso niso foille necesario imprimir lo - Jason Hirschhorn: Agarde. Non diga-nos o que fixo. Imos falar de lóxica. ALUMNO 81: Aceptar. Cal foi a pregunta? Jason Hirschhorn: Só levantou a súa man. Non había dúbida. Deixe-me presenta-lo. Déixeme discutir iso brevemente. Polo tanto, temos un pixel, queremos Replica-lo, tanto en horizontal como vertical. Así, idealmente o que facemos aquí é que nós ler na nosa píxeles, escribimos porén moitos dos tempos. Pero, entón, temos o noso truco aquí, porque entón queremos ir ao seguinte liña e gravala-lo no ao comezo da seguinte liña. Polo tanto, se queremos replicar tanto horizontal e vertical, o que é unha boa forma de facelo - un bo aínda que a facelo? Entón, nós non precisamos buscar constantemente en torno ao noso arquivo para poñer as cousas. Esa pregunta non pode ter tiña sentido, pero eu creo que un responder a el vai axudar. ALUMNO 82: Crear unha matriz? Jason Hirschhorn: Entón, imos pensar de cada ficheiro como unha liña. Imos pensar en termos de liñas. Se temos a nosa primeira liña de noso pequeno imaxe, podemos facer esa liña nunha gran liña dunha imaxe grande, e logo, replicar esa liña con todo moitas veces ten que ser replicado, en vez de ir pixel por pixel, que queda confuso cando xestionar ficheiros. Porque se tivemos - Eu estou quedando sen espazo. Se este é o noso arquivo, e temos que un pixel alí, e queremos poñelo alí, aínda temos algunhas cousas que necesidade de ir alí cando estamos escribir e crear o noso novo arquivo - o noso arquivo que é dúas veces maior. Pero é realmente difícil, con funcións de arquivo para ir en torno de novas liñas así, e despois volver aquí e poñer as cousas alí dentro. É case imposible facer algo así, se iso ten sentido. Entón, se pensamos en termos de liñas, podemos levar a nosa liña e, a continuación, colocar-lo - replicar liñas vertical. E é así que lidamos co redimensionamento vertical no canto de horizontal. Isto era unha especie de rápido, e un pouco confuso. Desafortunadamente o noso tempo rematou. Vou ir de fóra para aqueles de vostedes aquí quen ten dúbidas sobre o conxunto de problemas, incluíndo a recuperar. Entón, imos adiar por agora. E, de novo, se ten algunha preguntas, podemos falar por aí.