2015-04-25 2 views
2

J'ai donc un fichier .ppm et le but est de lire chaque pixel dans les éléments r [] g [] et b [] correspondants. Le code lit la première ligne (idk correct ou pas), mais ça ne va pas plus loin. Je ne suis pas sûr si j'ai besoin de ces getc(fp); afin de sauter des espaces. Lire chaque ligne et l'analyser en int n'est pas une option. Merci pour toute aide.C ne va pas à la ligne suivante lors de la lecture .ppm

int main(int argc, char** argv) 
    { 
     int height; 
     int width; 
     int max; 
     FILE *fp; 
     fp = fopen("vit_small.ppm", "r"); 
     fscanf(fp, "%*[^\n]\n", NULL); 
     fscanf(fp, "%d %d", &width, &height); 
     printf("Width is %d height is %d \n", width, height); 
     fscanf(fp, "%d", &max); 
     printf("Maximum value %d \n", max); 
     int r [height][width]; 
     int g [height][width]; 
     int b [height][width]; 
     int hist [5]; 
     int w = 0; 
     int h = 0; 
     char buffer [1000]; 
     for (;w<height;w++) 
     { 
      printf("Row number %d \n", w); 
      for (;h<width;h++) 
       { 
       fread(&r[w][h], 1, 1, fp); 
       printf("%d ", r[w][h]); 
       getc(fp); 
       fread(&g[w][h], 1, 1, fp); 
       printf("%d ", g[w][h]); 
       getc(fp); 
       fread(&b[w][h], 1, 1, fp); 
       printf("%d ", b[w][h]); 
       getc(fp); 
       } 
      getc(fp); 
      printf("\n"); 
     } 

     int i = 0; 
     int j = 0; 
     for (;i<height; i++) 
     { 
      for (;j<width; j++) 
      { 
       printf("%d %d %d ", r[i][j], g[i][j], b[i][j]); 
      } 
     printf("\n"); 
     } 

    fclose(fp); 
    FILE * res; 
    res = fopen ("Image_output.ppm", "w"); 
    fprintf (res, "P6\n"); 
    fprintf(res, "%d\n", width); 
    fprintf(res, "%d\n", height); 
    fprintf(res, "%d\n", max); 
    i = 0; 
    j = 0; 
    for(; i < height; i++) 
    { 
     for(; j < width; j++) 
     { 
      fprintf(res, "%d %d %d", r[i][j], g[i][j], b[i][j]); 
     } 
     fprintf(res,"\n"); 
    } 
     return (EXIT_SUCCESS); 
    } 
+0

Totalement sans rapport, mais si vous utilisez le format '"% * ... "' avec 'scanf' et la famille, alors vous n'avez pas besoin d'argument. –

+0

De plus, 'scanf' traite tous les espaces dans le format comme n'importe quel espace. Ainsi, le format '"% [^ \ n] "' correspondra à tout caractère non-blanc, pas seulement au caractère non-retour. Donc, si la ligne contient * des * espaces quelconques comme l'espace ou la tabulation normale ou quoi que ce soit d'autre, le balayage s'arrêtera à cela. Donc, vous ne pouvez pas utiliser cela pour lire (ou dans votre cas jeter) toute ligne contenant un espace. Pas vraiment pertinent pour votre question et votre problème, mais bon à savoir pour référence future. –

+0

En outre, vous devriez probablement utiliser par exemple. 'fgets' pour obtenir chaque ligne, puis analyser la ligne. –

Répondre

1

Le format P6 de PPM stocke chaque primaire sous forme d'octet et il n'y a pas de ligne ni d'espace. Donc, si une image est de 10 sur 6, elle aura 180 octets (10x6x3) après le caractère 255 et le caractère de retour à la ligne. Voir Wikipedia entry on PPM.

+0

Merci, je l'ai déjà résolu, mais c'était effectivement le problème. –