Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2013, 20:41   #1
Lorien
Новичок
Джуниор
 
Регистрация: 11.03.2013
Сообщений: 1
По умолчанию cs50 восстановление фоток

Само задание такое (это из курса 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(&section, 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(&section, 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...не обращайте внимания.
Lorien вне форума Ответить с цитированием
Старый 11.03.2013, 22:49   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Для начала замени вот это
Код:
char *fileNameString = "000";
char *fileNameStringPast = "000";
на
Код:
char fileNameString[] = "000";
char fileNameStringPast[] = "000";
Ну и файлы открывать в двоичной режиме стоит ("rb", "wb").
Son Of Pain вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос вставки фоток в таблице maragva Microsoft Office Excel 13 06.08.2012 17:33
Получение фоток и их оценок. Abuhamed PHP 10 19.02.2012 13:39
изменить позицию фоток в скрипте johny_03 JavaScript, Ajax 0 25.11.2011 17:59
Фото из чужих фоток demondmitriy Свободное общение 3 11.07.2008 11:39
Перевод фоток в чб 1quick1 PHP 1 27.12.2006 20:18