2015-07-17 4 views
0

Я мог бы использовать некоторые рекомендации по этому pset от cs50. Ниже приведен код, который у меня есть. Я застрял в этой точке, где я понятия не имею, как действовать. Когда я запускаю программу, он выводит 16 файлов jpg, но я не могу их просматривать, поэтому что-то должно быть неправильно. Любые советы приветствуются.cs50 pset4 recover.c нужна консультация

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{    
// create buffer to store in 
unsigned char buffer[512]; 

// array for filename is 8 for "000.jpg" 
char jpgName[8]; 

// declaring counter for amount of jpegs 
int jpgcounter = 0; 

// open memory card file 
FILE* inptr = fopen("card.raw", "r"); 
FILE* outptr = NULL; 

if (inptr == NULL) 
{ 
    printf("Could not open %s.\n", "card.raw"); 
    return 1; 
} 

    // repeat until end of card 
    while(fread(buffer, sizeof(buffer), 1, inptr) == 1) 
    {         

     // find beginning of jpg 
     if(buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] == 0xe0 || buffer[3] == 0xe1)) 
     { 
      // if allready a outptr file is open close it 
      if (outptr != NULL) 
      { 
        fclose(outptr); 
      } 

      // create filename for jpegs 
      sprintf(jpgName,"%03d.jpg", jpgcounter); 

      // open a new file with name defined by sprintf 
      FILE* outptr = fopen(jpgName, "w");        

      // write into the outfile from buffer 
      fwrite(&buffer, sizeof(buffer), 1, outptr); 

      // increment counter for jpegs 
      jpgcounter++; 
      }          
    } 
    fclose(inptr); 
    return 0; 
} 
+1

Было ли ваше намерение писать только каждый * другой * 512-байтовый? потому что это то, что это делает. Если это не предназначено, у вас есть посторонний «fread» в вашем цикле. Поиск google «cs50 pset4 recovery» дает удивительное количество * правильных * реализаций, для справки, fyi. – WhozCraig

+0

у вас есть один читать, а у вас есть другой сразу после него? возможно, вы хотите лучше описать, какова задача. также открыть файлы в двоичном режиме? –

+0

задача заключалась в том, чтобы найти 16 jpegs в файле card.raw. И скопируйте их в отдельные файлы. –

ответ

0

Если я правильно понял вашу задачу, вам нужно что-то вроде этого - см. Ниже. Подсказка: что вы планируете делать, если это не начало jpg-файла?

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{    

unsigned char buffer[512] = {0}; 
char jpgName[8] = {0}; 
int jpgcounter = 0; 
FILE* outptr = NULL; 

// open memory card file 
FILE* inptr = fopen("card.raw", "rb"); 
if (inptr == NULL) 
{ 
    printf("Could not open %s.\n", "card.raw"); 
    return 1; 
} 

// Start reading  
while(fread(buffer, sizeof(buffer), 1, inptr) == 1) 
{         

     // Find beginning of jpg 
     if(buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] == 0xe0 || buffer[3] == 0xe1)) 
     { 
      if(NULL!=outptr)     
      { 
       fclose(outptr); 
       outptr=NULL; 
      } 

      // Create filename for jpegs 
      sprintf(jpgName,"%03d.jpg", jpgcounter); 

      // Open a new file with name defined by sprintf 
      outptr = fopen(jpgName, "wb");   
      if (NULL == outptr) 
      { 
       printf("Could not open %s.\n", jpgName); 
       return 1; 
      }      

      // Write into the outfile from buffer 
      fwrite(buffer, sizeof(buffer), 1, outptr); 

      // Increment counter for jpegs 
      jpgcounter++; 
     } 
      else 
     { 
      // Continue writing to old file if it is not beginning of file 
      if(NULL!=outptr) 
       fwrite(buffer, sizeof(buffer), 1, outptr);        
     } 
    } 

    if(NULL!=outptr) 
     fclose(outptr); 
    if(NULL!=inptr) 
     fclose(inptr); 

    return 0; 
} 
+0

Спасибо, Джорджи, он работает сейчас. Но у меня все еще есть некоторые вопросы. Что означает «wb» в fopen? Я знаю только w для записи и r для чтения. –

+0

@ VerpoortenNick: b означает двоичный код. Вы хотите открыть jpg в двоичном режиме. Но я не уверен, что, возможно, это зависит от ОС, нужно ли вам указывать b или нет, вы можете посмотреть его. –

0

Это не может работать:

while(fread(buffer, sizeof(buffer), 1, inptr) == 1) 
{         

    // read 512 bytes from inptr and store them in buffer 
    fread(&buffer, sizeof(buffer) , 1, inptr); 

, как вы используете fread дважды и данные считываются первым перезаписаны и вторым. Похоже, что это потеряет первые 512 байт каждого kB в исходном файле.

Вы должны получить дополнительную информацию, если вы удалите второй файл fread().

+0

Спасибо, что указали это. Я удалил второй файл, но я все еще не могу просмотреть файлы jpg. –

+0

@ VerpoortenNick Трудно сказать без знания формата ввода. Является ли ваш формат ввода действительно последовательностью jpeg-файлов, каждая из которых имеет длину всего 512 байт? – Jens

+0

Да, это от pset: И поэтому я пошел вперед и создал «криминалистическое изображение» карты, сохранив ее содержимое, после байта, в файле с именем card.raw. Чтобы вы не тратили время на итерацию более миллиона ненужных файлов, я только что отобразил первые несколько мегабайт CF-карты. Но вы должны в конечном итоге найти, что изображение содержит 16 JPEG –

Смежные вопросы