>> [Música tocando]
>> ZAMYLA CHAN: Vamos enfrentar recuperar.
Recuperar é provavelmente o meu favorito PSET, e, principalmente, porque eu acho que é
muito, muito legal.
Basicamente, você está dado uma memória arquivo de cartão em que
fotos foram excluídos.
Mas o que você vai fazer é recuperá-los todos.
>> OK.
Então, é realmente excitante, mas talvez um pouco intimidante, porque você é
dado um arquivo e C vazio você tem que preenchê-lo dentro
OK, então vamos quebrar esse em partes gerenciáveis.
Você vai querer abrir o de arquivos do cartão de memória.
Isso parece bastante simples.
Em seguida, localize o início de uma imagem JPG.
Todos os arquivos deste memória cartão vão ser JPGs.
Então, quando você encontrar o início, você vai abrir uma nova JPG, que
é, tipo, criar um JPG, e escrever 512 byte de cada vez até que um novo JPG é
encontrado, e terminando o programa, uma vez que você detectar o fim do arquivo.
>> Então primeiros passos primeira é abrir o arquivo de cartão de memória.
Mas você já sabe disso, e não há um arquivo de função I / O que vai
ser muito útil.
OK.
Então, quais são JPGs?
Porque precisamos começo.
Bem, JPGs, assim como mapas de bits, são apenas seqüências de bytes.
Felizmente, cada JPG começa com um 0xff, 0xd8, 0xff, 0xE0, uma seqüência
de bytes, ou outro seqüência de bytes.
>> Então esses quatro bytes indicam o início de um JPG.
Nada mais do que essas duas combinações de quatro bytes.
E felizmente para nós, outro fato que pode aproveitar é que cada
JPG é armazenado lado-a-lado no cartão de memória.
Eu representada a estrutura de um cartão de memória esquematicamente nesta
deslizar aqui.
Aqui, cada praça, cada retângulo, representa 512 bytes, e começa
com um cinza em que nós não realmente tem um JPG.
>> Mas, então, finalmente, acertar um bloco com uma estrela.
Isso significa que os primeiros quatro bytes fora dos 512 é um daqueles dois
iniciar seqüências de um JPG.
E vamos a partir daí, em seguida, uma vez um JPG termina, o próximo começa.
Não precisa nem mais espaço cinza no meio.
>> Mas como é que vamos realmente ler isto, e ler os 512 bytes, para que possamos fazer
a comparação do primeiro lugar?
Bem, vamos voltar para fread, que leva na estrutura que conterá
os bytes que você está lendo.
Então você está indo para colocar aqueles em que -
o tamanho, o número e, em seguida inpointer que você está lendo a partir.
Agora, queremos ler 512 de cada vez, e queremos armazenar isso em um buffer,
Vou chamá-lo.
>> Basicamente, nós estamos indo para segurar para essas 512 bytes e fazer
coisas com ele, certo?
Ou nós vamos comparar a primeira quatro bytes, ou nós vamos
ler-lo, OK?
Então o ponteiro de dados será então servir como seu buffer, ea
inpointer, bem, isso só vai para ser o seu cartão de memória.
>> De volta ao nosso esquema de cartão de memória.
Vamos ler 512 bytes de cada vez, armazenando cada bloco de 512 bytes
em um buffer, agarrando-se aqueles tampão, essas 512 bytes, até que saibamos
exatamente o que fazer deles.
Assim, o começo não é nada, então vamos ler o buffer, compará-lo, e
nós não precisamos fazer nada com ele.
E então, finalmente acertar uma estrela bloquear, o que significa que nós temos
encontramos nosso primeiro JPG.
Então, o buffer agora detêm bytes do que JPG.
>> A próxima vez que 512 bytes, porque eles são não um bloco de estrela, são também
parte desse JPG.
E JPGs são contínuas a partir daí em diante, até chegarmos a próxima JPG.
E então o buffer então segura 512 bytes para que JPG e
assim por diante, e assim por diante.
OK.
>> Então, quando você acertar o primeiro estrelado bloco, a primeira JPG, como você
na verdade, bem, abri-lo?
Vamos fazer um novo JPG.
Os nomes de arquivos para um JPG vão ter o formato, o número, o número,
number.jpg, na medida em que está nomeado em a ordem na qual eles se encontram,
começando em 0.
>> Assim, o primeiro JPG que você encontrar será 000.jpg.
Então, provavelmente uma boa idéia para manter um registo de quantas JPGs que você encontrou até agora.
Então esse é o nome do arquivo.
Mas como você realmente fazer isso?
Bem, nós estamos indo para usar um função chamada sprintf.
Um pouco semelhante ao printf, onde você pode usar espaços reservados para cordas,
só que neste caso, sprintf imprimirá o arquivo para fora no atual
diretório, não no terminal.
>> OK.
Então, vamos ver que temos o título, uma matriz de char que irá armazenar o
cadeia resultante, e passamos no título da seqüência real com uma
espaço reservado, assim como nós aprendi a fazer com printf.
Mas esse código que eu tenho aqui dará 2.jpg, não 002.jpg.
Então, eu vou deixar você para descobrir como modificar o espaço reservado para fazer a
nome correto.
>> OK.
Então, uma vez que você sprintf'd então você pode abrir esse arquivo, porque existe em
seu diretório, com fopen, usando o título e qualquer que seja o modo que você quer
para abrir esse arquivo dentro
Portanto, agora que abrimos um novo arquivo JPG, agora podemos escrever 512 bytes em um
tempo, até que um novo JPG é encontrado.
Então, vamos ter um outro olhar na sintaxe de fwrite.
>> Eu sei que eu estou mostrando este slide um muito, mas eu só quero ter certeza de que
Vocês não ficar muito confuso, porque Eu sei que é muito fácil de
misturar-se a primeira e a última argumento, em particular.
Mas lembre-se que você está escrevendo a partir de seu buffer nas imagens de arquivo para fora.
>> Agora que você sabe como a gravação de 512 bytes em seu arquivo JPG que você tem
criado, bem, nós queremos parar com isso processo uma vez que tenhamos chegado ao fim da
a placa, porque não haverá mais imagens para ser encontrado.
Então vamos voltar para fread mais uma vez, eu prometo.
fread retorna quantos itens de tamanho, tamanho, estavam prontos em sucesso.
O ideal é que isso vai ser o que você passar por número, certo?
Porque você está tentando ler o número de elementos de tamanho, o tamanho.
Mas se fread não é capaz de ler que número de elementos, então ele vai voltar
qualquer número que lido com sucesso.
>> Agora, uma coisa importante a salientar é que se você usar outro arquivo I / O
função como fgetc, ele também vai voltar quantos itens ele ler com sucesso.
O que é útil sobre esta função é que se você utilizar as funções dentro de uma
condição, ele vai executar-se enquanto determinar essa condição, o que é
realmente muito útil.
Então se você tem esta condição, digamos, se tampão fread, CÃO sizeof, 2,
ponteiro, é igual é igual a 1, isto significa que eu gostaria de ler
2 cães no momento.
Mas se fread retorna uma vez de duas como esperado, o que significa que existem dois
cães deixados no meu arquivo, mas sim 1.
Mas se ele retorna 2, então eu ainda tenho esses dois cães dentro do meu tampão.
>> Portanto, agora que lhe dá uma sensação de como verificar o fim do arquivo, mas
vamos passar por agora a lógica.
Como é que vamos realmente remendar tudo esses elementos juntos?
Uma vez que nós batemos o nosso primeiro JPG, desde sabemos que JPGs são armazenados
contígua, estaremos escrevendo até chegamos ao final do arquivo do cartão.
Mas não quero escrever nada até então.
Então, é importante, não só que estamos no o início de um novo JPG, mas se
já encontramos um JPG ou não.
>> Se É o início de uma nova JPG, nós vamos quer fechar nossa atual arquivo JPG se
temos um aberto e aberto um novo para escrever em.
Se não é o início do novo JPG, porém, vamos manter o mesmo arquivo JPG
abrir e escrever para isso.
Vamos escrever a nossa reserva para qualquer Arquivo JPG temos aberto, desde que
temos uma aberta, é claro.
Se nós não encontramos nosso primeiro JPG ainda, não escreva nada.
E este processo continua até que você atingir o fim do ficheiro do cartão.
>> E, finalmente, você vai querer fazer Certifique-se de que você fclose qualquer
arquivos que você fopened.
Uma vez que você está confortável com o conceitos, dê uma olhada em algumas
pseudocódigo, que eu incluí aqui.
Primeiro, você deseja abrir o arquivo de cartão, e em seguida, repita o processo a seguir
até que você tenha atingido o extremidade do cartão.
Você quer ler 512 bytes em um tampão.
Usando esse buffer, você vai querer verificar se você está no início de um
novo JPG ou não.
E a resposta para essa pergunta vai afetar o seu gerenciamento de arquivos -
quais arquivos você aberto, o que aqueles que você fechar.
>> Em seguida, você já encontrou um JPG?
Como você tem sido manter o controle de que?
Então, dependendo do que, você quer escrever para o JPG atual que
ter aberto, ou não escrevê-lo em tudo, porque você ainda não encontrou um JPG ainda.
Finalmente, uma vez que você chegou ao fim da o arquivo, você vai querer fechar qualquer
remanescente arquivos que você tenha aberto.
Queremos ser arrumado aqui.
>> E com isso, você já recuperou todos os arquivos ausentes de que a memória
cartão, o que é um feito incrível.
Então, palmadinhas nas costas.
Mas, há mais um elemento para o PSET, que é a competição.
Você verá que todas as imagens que você tenha recuperado são realmente
fotos de funcionários do CS50.
Então, se você está no campus ou em algum lugar próximo, então você pode tirar fotos com
o pessoal, ea seção que tem o a maioria das fotos com os membros da equipe
a partir de seus arquivos recuperados serão receber um prêmio incrível.
Com isso, depois que você terminou o PSET recuperar.
Meu nome é Zamyla, e este é CS50.