2013-02-09 116 views
1

我目前被困在能够准备jpeg文件。它看起来像我很接近,但无论出于何种原因,该文件不读取jpeg文件的不同签名。当然,我不确定我是否做错了什么,笨拙或什么。这里是我目前的代码:在阅读c文件中的jpeg文件时出现问题

int main (void) 
{ 
    typedef unsigned char BYTE ; 
    char image_name[8]; 
    int counter=1; 
    FILE* fp = fopen("card.raw", "r"); 
    FILE *outfile=NULL; 
    int size=512; 
    BYTE buffer[size]; 
    while (feof(fp) == false) 
    { 
     fread(buffer,size,sizeof(unsigned char),fp); 
     if (fp== NULL) 
     { 
      printf("Could not open file \n"); 
      return 1; 
     } 
     if(buffer[0]==255 && buffer[1]== && || buffer[2]==255 && (buffer [3]==224 && buffer[3]==225)) 
     { 
      for(int i=0; i<51; ++i){   
       sprintf(image_name, "%.3d.jpg", counter);   
       outfile= fopen(image_name, "w"); 
       fwrite(buffer,sizeof(buffer),1,outfile); 
       counter=counter+1; 
       if (outfile == NULL)    
       {     
        printf("could not create jpeg file\n");     
        return 2;    
       }  
      } 
     } 
     fclose(fp); 
     fclose(&outfile); 
     return 0; 
    } 

现在,我目前只是完成这项任务的一部分。

+0

对不起,我不能有更多的帮助,但你提到它是一个“任务”。如果它是作业,我会添加“家庭作业”标签,很多人会被弯曲成围绕这些部分的'回合'。祝你好运! – Chris 2013-02-09 05:51:01

+3

@Chris:没有。请阅读作业标签wiki。不要使用该标签。 – Mat 2013-02-09 05:52:13

+0

我建议您不要共享一项作业的完整代码,只是您怀疑的具体部分。 – InfZero 2014-12-17 03:46:44

回答

1

您打开文本模式文件,但你应该二进制模式打开:

fopen("card.raw", "rb"); /* Notice the `b` for binary mode */ 

当您打开写的一样。


也只读过的性格,但再查多:

/* This reads a single byte (`sizeof(unsigned char)` == 1) */ 
fread(buffer,size,sizeof(unsigned char),fp); 

/* Here you check multiple bytes in the buffer, 
* even though you only have read a single byte 
*/ 
if(buffer[0]==255 && buffer[1]== && || buffer[2]==255 && (buffer [3]==224 && buffer[3]==225)) 

还要注意的是表达buffer [3]==224 && buffer[3]==225可以从未是真实的。

+0

我不会认为这是问题 - 任何符合POSIX的系统(包括Linux和OS X)都会将所有文件视为二进制文件,并忽略“b”标志。我相信这只会在Windows上造成问题。 – 2013-02-09 06:08:04

+0

@MattPatenaude那么,OP没有指定平台,但是这样的错误通常是因为在Windows上使用了错误的模式。 – 2013-02-09 06:09:39

+0

有效的点,添加它当然没有任何伤害! – 2013-02-09 06:11:29

2

if(buffer[0]==255 && buffer[1]== && ||的语法不正确。

buffer[1]==而不是&&应该有一些值。

这是错误的后?

+0

这是一种类型。它被认为是缓冲区[1] == 224我相信。 – user2014904 2013-02-09 06:51:00

+0

@您可能想用正确的代码更新问题。 – Rohan 2013-02-09 06:55:13