Само задание такое (это из курса cs50) надо восстановить - прочесть с диска 51 фотку jpeg - мы не знаем размер и название фото ищем по началу jpg файла. диск вроде, с камеры, поэтому размер отдельной области с данными 512 байт.
Вот что уже сделано - тут включаемый файл(там 2 структурки - для определения начала файла jpg и одна для чтения данных);
Код:
/*
* file with jpeg start bytes
*/
#include <stdint.h>
typedef uint8_t BYTE;
typedef struct
{
int startJpegImage[4];
int anotherStartJpegImage[4];
} __attribute__((__packed__))
JPGHEADER;
typedef struct
{
BYTE section[500];
} __attribute__((__packed__))
SectionOfCard;
А вот и собственно код - буду очень признателен если кто скажет где валится segmentatuon fault - смотрю на код сам вроде все в порядке ( ps я просто не очень в дебаге под linux)
Код:
/****************************************************************************
* recover.c
*
* Computer Science 50
* Problem Set 4
* Roman Ivanov
* Recovers JPEGs from a forensic image.
***************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "jpg.h"
/* prototype */
bool arrayCompare(int *array);
int main(int argc, char* argv[])
{
int counter = 0;
FILE* inptr = fopen("card.raw", "r");
FILE* outptr;
if (inptr == NULL)
{
printf("Could not open recover.raw\n");
return 2;
}
int end = 0;
printf("start read file that we have opened\n");
printf("%d\n",feof(inptr));
bool notNew = false;
while( end == feof(inptr))
{
printf("read first 4 bytes into the structure");
// declaration section
int fromFileToCompare[4];
SectionOfCard section;
// for dynamic add names to finded jpg images
int fileNameInt = 0;
fileNameInt = counter;
char *fileNameString = "000";
char *fileNameStringPast = "000";
sprintf(fileNameString,"%3d",counter);
sprintf(fileNameStringPast,"%3d",counter--);
//read first 4 pots from file and analyze it
fread(&fromFileToCompare, sizeof(int), 4, inptr);
//compare with rgb start bytes
// if file closed and it is new file
if( arrayCompare(fromFileToCompare) && notNew == false)
{
outptr = fopen(fileNameString, "w");
if (outptr == NULL)
{
return 3;
}
fseek(inptr, sizeof(int)*(-4), SEEK_CUR);
fread(§ion, sizeof(SectionOfCard), 1, inptr);
printf("%s", fileNameString);
counter++;
fwrite(&outptr , sizeof(SectionOfCard), 1, outptr);
notNew = true;
} // if it is not start of Image and file still open
else if ( arrayCompare(fromFileToCompare) == false && notNew == true)
{
fseek(inptr, sizeof(int)*(-4), SEEK_CUR);
fread(§ion, sizeof(SectionOfCard), 1, inptr);
fwrite(&outptr , sizeof(SectionOfCard), 1, outptr);
fseek(inptr, sizeof(SectionOfCard), SEEK_CUR);
}
else if ( arrayCompare(fromFileToCompare) == true && notNew == false )
{
fseek(inptr, sizeof(int)*(-4), SEEK_CUR);
fclose(outptr);
notNew = false;
}
}
}
bool arrayCompare(int array[4])
{
bool compare = false;
JPGHEADER headerImage = {{ 0xff, 0xd8, 0xff, 0xe0},{ 0xff, 0xd8, 0xff, 0xe1} };
for(int i = 0; i < 4; i++)
{
bool isImage = array[i] == headerImage.startJpegImage[i];
bool isImageOrNot = array[i] == headerImage.anotherStartJpegImage[i];
if( isImage || isImageOrNot)
{
printf("true");
compare = true;
}
else
{
printf("oh no!");
compare = false;
return compare;
}
}
printf ("find the jpg");
return compare;
}
Если можно, примеры своего кода тоже выкладывайте как бы Вы это решили - ну и конечно замечания по оформлению тоже приемлемы - только не матюкайтесь сильно. =) Заранее благодарен за просмотр кода. С уважением, Иванов Роман.
P.S. printf -это для debugg...не обращайте внимания.