PGM画像をファイルポインタから読み込んで、構造体変数に格納するプログラムを作成しました。
しかし、セグメントエラーが起きてしまいます。
簡単にプログラムの流れを説明します。
・main関数
画像読み込み関数load_imageを呼び出しています。
この関数の引数には読み込みたい画像のファイル名の文字列になります。
文字列を入れない場合はload_image関数で文字列の入力を要求するようになっております。
・load_image関数
まず受け取った引数に文字列が入っているかを調べ、なければ入力を要求します。
fopenでファイルを開きます。
続いてヘッダの読み込みをします。
今回取り扱う画像はPGM形式のためヘッダはコメント文を除いて3行になります。
コメント文を読み飛ばしながら
画像の形式、画素数、最大階調の情報を読み出します。
最後に各座標の画素値を読み出して終了します。
原因がわからず困っております。どうかご教授のほどよろしくお願いいたします。
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
/* 定数宣言 */
#define MAX_IMAGESIZE 1280 /* 想定する縦・横の最大画素数 */
#define MAX_BRIGHTNESS 255 /* 想定する最大階調値 */
#define GRAYLEVEL 256 /* 想定する階調数(=最大階調値+1) */
#define MAX_FILENAME 256 /* 想定するファイル名の最大長 */
#define MAX_BUFFERSIZE 256 /* 利用するバッファ最大長 */
#define MAX_NUM_OF_IMAGES 5 /* 利用する画像の枚数 */
typedef struct PGM{
char format[MAX_BUFFERSIZE];
int width;
int height;
int brightness;
int image[MAX_IMAGESIZE][MAX_IMAGESIZE];
}pgm;
/* 関数のプロトタイプ宣言 */
/* 階調画像を入力する関数 */
struct PGM load_image(char name[] );
/* name[]:ファイル名(""のときはキーボード入力)*/
/* 階調画像を出力する関数*/
void save_image( int n, char name[] );
/*name[]:ファイル名(""のときはキーボード入力)*/
int main(void){
pgm im;
im = load_image("");
return 0;
}
struct PGM load_image(char name[] ){
FILE *fp;
char file_name[MAX_FILENAME];
char buff[MAX_BUFFERSIZE];
int header = 3;
pgm img;
int x,y;
if(name[0] != '\0'){
strcpy(file_name, name);
}else{
printf("入力ファイル名(*.pgm):");
scanf("%s", file_name);
}
if((fp = fopen(file_name,"r")) == NULL){
printf("ファイルを開くことができませんでした\n");
exit(1);
}
while(header){
fgets(buff, MAX_BUFFERSIZE, fp);
if(buff[0] != '#'){
switch(header){
case 3:
if(buff[0] != 'P' || buff[1] != '2'){
printf("P2形式の画像ではありません\n");
exit(1);
}
strcpy(img.format, buff);
break;
case 2:
sscanf(buff,"%d %d", &img.width, &img.height);
break;
case 1:
sscanf(buff, "%d", &img.brightness);
break;
}
header--;
}
}
for(y = 0; y < img.width; y++){
for(x = 0; x < img.height; x++){
img.image[x][y] = (int)fgetc(fp);
}
}
return img;
fclose(fp);
}