2017-03-03 4 views
0

私はCを使ってP3 PPMファイルを保存しようとしていますが、私はそれを経験していないので、レンガの壁に当たっています。誰かが私の仕事を達成するのを手伝ってくれるかどうか疑問に思っていました。ありがとうございました。PPM P3ファイルのすべての値を保存

私はそれらを構造体PPMおよび構造体PPM * getPPM(File * fd)として保持したいと思いますが、内容を変更することができます。

コメントを保存する方法もわからないので、コメントも保存してください。

は基本的に私は次のようにデータを格納しようとしています:

P3 
#comment.1 
. . . 
#comment.n 
width height 
max 
r1 g1 b1 
r2 g2 b2 
r3 g3 b3 
. . . 

編集:私はそれを正しくコンパイルするために、今私はARGVに合格しようとしているため、変更を行っている

ファイルがファイル名を取得するためにargv [1]を読み取る可能性があります。私がそうするとき、私はセグメンテーションエラーを受け取る。

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

//Holds the data 
struct data {int r,g,b;}; 
struct PPM {char code[4]; char comments; int width; int height; int max; struct data *Data;}; 

//Gets the PPM data 
struct PPM* GetPPM(FILE * fd, argv) 
{ 
    char readChars[256] = {0}; 
    //Allocates memory for PPM 
    struct PPM *image = (struct PPM *)calloc(1, sizeof(struct PPM)); 
    int i; 
    fgets(image->code, sizeof(image->code), fd); 
    fd = fopen(argv[1], "r"); 
    //Checks if file is type P3 
    if((image->code[0] != 'P') && (image->code[0] != '3')) 
    { 
      return NULL; 
    } 
    image->code[2] = '\0'; 
    //Checks for comments then continues around the loop until there's no more 
    fgets(readChars, sizeof(readChars), fd); 
    while(readChars[0] == '#') 
    { 
      fgets(readChars, sizeof(readChars), fd); 
    } 
    //Checks for PPM width, height and max 
    sscanf(readChars, "%d %d", &image->width, &image->height); 

    fgets(readChars, sizeof(readChars), fd); 
    sscanf(readChars, "%d", &image->max); 

    image->Data = (struct data*)malloc(image->width * image->height * sizeof(struct data)); 
    i = 0; 
    while(fgets(readChars, sizeof(readChars), fd)); 
    { 
      sscanf(readChars, "%d %d %d", &(image->Data[i].r), &(image->Data[i].g), &(image->Data[i].b)); 
      ++i; 
    } 
    fclose(fd); 
    return image; 
} 


//Deallocates memory 
void freePPM(struct PPM *image) 
{ 
    free(image->Data); 
    free(image); 
} 

//Displays PPM 
void showPPM(struct PPM *image) 
{ 
    int i = 0; 
    int totalpixels = image->width * image->height; 
    printf("%s\n", image->code); 
    printf("%d %d\n", image->width, image->height); 
    printf("%d\n", image->max); 

    for(i = 0; i < totalpixels; ++i) 
    { 
      printf("%d %d %d\n", image->Data[i].r, image->Data[i].g, image->Data[i].b); 
    } 
} 



int main(int argc, char ** argv) 
{ 
    struct PPM *image = GetPPM(argv); 
    showPPM(image); 
    freePPM(image); 

    return 0; 
} 

答えて

0

構造の宣言とデータの読み込み方法に多少の誤差があります。次のコードでデータがどのように読み込まれているかを確認し、より明確にするためにここに戻ってください。

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

struct data {int r,g,b;}; 
struct PPM {char code[4]; char comments; int width; int height; int max; struct data *Data;}; 

struct PPM* GetPPM(FILE * fd) 
{ 
    char readChars[256] = {0}; 
    struct PPM *image = (struct PPM *)calloc(1, sizeof(struct PPM)); 
    int i; 

    fgets(image->code, sizeof(image->code), stdin); 

    if((image->code[0] != 'P') && (image->code[0] != '3')) 
    { 
     return NULL; 
    } 
    image->code[2] = '\0'; 

    fgets(readChars, sizeof(readChars), stdin); 
    while(readChars[0] == '#') 
    { 
     fgets(readChars, sizeof(readChars), stdin); 
    } 

    sscanf(readChars, "%d %d", &image->width, &image->height); 

    fgets(readChars, sizeof(readChars), stdin); 
    sscanf(readChars, "%d", &image->max); 

    image->Data = (struct data*)malloc(image->width * image->height * sizeof(struct data)); 
    i = 0; 
    while(fgets(readChars, sizeof(readChars), stdin)) 
    { 
     sscanf(readChars, "%d %d %d", &(image->Data[i].r), &(image->Data[i].g), &(image->Data[i].b)); 
     ++i; 
    } 

    return image; 
} 

void FreePPM(struct PPM *image) 
{ 
    free(image->Data); 
    free(image); 
} 

void PrintPPM(struct PPM *image) 
{ 
    int i = 0; 
    int totalpixels = image->width * image->height; 
    printf("%s\n", image->code);  
    printf("%d %d\n", image->width, image->height); 
    printf("%d\n", image->max); 

    for(i = 0; i < totalpixels; ++i) 
    { 
     printf("%d %d %d\n", image->Data[i].r, image->Data[i].g, image->Data[i].b); 
    } 
} 

int main() 
{  
    struct PPM *image = GetPPM(stdin); 
    PrintPPM(image); 
    FreePPM(image); 

    return 0; 
} 
+0

なぜ私はコードでfdを使用したことがないのでしょうか? PPMファイルを読むことができない場合、PPMファイルのデータをどのように見たいのですか?あるいは、stdinのすべてのインスタンスをfdに変更するだけですか?それ以外はほとんど見た目がよく、ほとんどの部分はI/Oの動作が少し良くなっていることを理解しています – Jason

+0

@Jason: 'GetPPM(FILE * fd)'関数は 'FILE *'をパラメータとして受け取ります。したがって、必要なイメージファイルを開いて、有効なハンドルを 'GetPPM'関数に渡すことができます。 – sameerkn

関連する問題