У меня вопрос о том, как восстановить jpg-изображения (это назначение для CS50). Мой код работает по большей части (я считаю), однако я только получаю кучу миниатюр, когда открываю найденные jpg.C. CS50 восстановить назначение, восстановить изображения Jpg
Я пытался решить это упражнение уже довольно давно, но я не могу понять, почему он не работает. Может кто-нибудь дать мне толчок в правильном направлении.
Вот мой код (также доступен в http://pastebin.com/U2pwJd5e):
#include <stdio.h>
#include <stdlib.h>
#include "bmp.h"
int main(int argc, char* argv[])
{
//get input file
char* infile = "card.raw";
// open card file
FILE* inptr;
inptr = fopen("card.raw", "r");
// error checking (copied from copy.c)
if (inptr == NULL)
{
printf("Could not open %s.\n", infile);
return 2;
}
// initialize buffer
BYTE buffer[512];
//initialize jpg variables:
int increment = 0;
char outfilename[8];
// while the end of the file is not reached, continue process & write to buffer next block of 512 bytes
while (fread(buffer, 512, 1, inptr) != 0)
{
// if the inpointer is not empty
if(inptr != NULL)
{
// If the block of 512 bytes starts with markers
if(buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3]== 0xe1 || buffer[3]== 0xe0))
{
// increase file number by 1
sprintf(outfilename,"%.3d.jpg", ++increment);
// open new file
FILE* outptr;
outptr = fopen(outfilename, "a");
// write first block of 512 bytes, then read next block
fwrite(buffer, 512, 1, outptr);
if(fread(buffer, 512, 1, inptr) == 0)
break;
// copy all information from inpointer to buffer to jpg
while((buffer[0] != 0xff && buffer[1] != 0xd8 && buffer[2] != 0xff && (buffer[3]!= 0xe1 || buffer[3]!= 0xe0)))
{
// if next byte is NULL break
if(fread(buffer, 512, 1, inptr) == 0)
break;
fread(buffer, 512, 1, inptr);
//copies jpg file 1 byte at a time
fwrite(buffer, 512, 1, outptr);
}
// close file
fclose(outptr);
}
}
}
return 0;
}
Добро пожаловать в Переполнение стека. Вскоре прочитайте страницу [О программе]. В общем случае, по крайней мере, можно утверждать, что если код работает, он может принадлежать [Code Review] (http://codereview.stackexchange.com/). Если он не работает, вам нужно показать код, который не работает, и, возможно, (ссылка на a) образец сломанного изображения, на котором он не работает. Как правило, людям не очень нравится переходить на другой сайт для кода. Когда операционный код длиной всего 70 с лишним строк, вы можете, вероятно, вставить его здесь. –