• 締切済み

画像の処理について

『ppm形式の画像の読み込み』のプログラムを実行したのですが、 エラーがでてうまくいきません。 どこを修正しなければいけないのか、教えてください。 エラーの内容↓ function 'main': main.c:17: 警告: passing argument 1 of 'fopen' makes pointer from integer without a cast main.c: In function 'headerScan': main.c:35: 警告: ポインタと整数との比較を行なっています main.c:36: 警告: ポインタと整数との比較を行なっています main.c:37: 警告: ポインタと整数との比較を行なっています main.c: In function 'dataScan': main.c:44: 警告: ポインタと整数との比較を行なっています プログラム↓ #include <stdio.h> #include <stdlib.h> struct image{ int type; int width; int height; int depth; char *data; }; int main(int argc, char *argv){ FILE *fpin; fpin = fopen("argv[1]", "rb"); struct image *img; headerScan(fpin, img); img->data = (char *)malloc(sizeof(char)*img->width*img->height*3); dataScan(fpin, img); free(img->data); fclose(fpin); return 0; } int headerScan(FILE *fp, struct image *img){ while(fscanf(fp, "P%d", &(img->type)) == NULL) ; while(fscanf(fp, "%d %d", &(img->width), &(img->height)) == NULL) ; while(fscanf(fp, "%d", &(img->depth)) == NULL) ; return 0; } int dataScan(FILE *fp, struct image *img){ int i = 0; while(fscanf(fp, "%c%c%c", &(img->data[i++]), &(img->data[i++]), &(img->data[i++])) != NULL) ; return 0; }

noname#69423
noname#69423

みんなの回答

  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

>『ppm形式の画像の読み込み』のプログラムを実行したのですが、 >エラーがでてうまくいきません。 「実行」までいってない。 >どこを修正しなければいけないのか、教えてください。 エラーの内容のとおりだけど? まず、関数のリファレンスを読み直すことと、エラーの意味を理解することから始めるべき。 >main.c:17: 警告: passing argument 1 of 'fopen' makes pointer from integer without a cast fopen()の使い方が問題。 関数に渡す引数の内容が違う。 >main.c:35: 警告: ポインタと整数との比較を行なっています >main.c:36: 警告: ポインタと整数との比較を行なっています >main.c:37: 警告: ポインタと整数との比較を行なっています >main.c:44: 警告: ポインタと整数との比較を行なっています fscanf()の戻り値はint型。戻る値は項目数(0もありえる)かEOF。 NULL比較はできない。 >main.c: In function 'dataScan': プロトタイプ宣言されていないから、main()より下に書かれている関数が認識されていない。

関連するQ&A

  • なぜ無限ループになるかが分かりません。

    こんにちは。 関数内でCSVファイルからデータを読み取り、そのデータをリストに入れて、先頭を指すポインタをmain内に返すと言う作業をさせたくて書いたソースです。なぜ無限ループするのか分かりません。 どなたか教えていただけませんか? 以下ソース #include <stdio.h> #include <stdlib.h> struct account{ int ID; char Sname[50]; char Fname[50]; char Adress[100]; int Sex; int Age; char Group[100]; struct account *next; }; struct account *Rfile(char *FileName,struct account *top); int main(void) { char FileName[FILENAME_MAX]; struct account *top,*q; top = NULL; printf("読み込むファイルの名前を入力してください>>>"); scanf("%s",FileName); q = Rfile(FileName,top); return 0; } struct account *Rfile(char *FileName,struct account *top) { FILE *fp; char filename[FILENAME_MAX]; int ret; struct account *new; new = (struct account *) malloc(sizeof(struct account)); new->next = NULL; strcpy(filename,FileName); if( (fp = fopen( filename,"r")) == NULL) { printf("ファイルが見つかりません。>>>%s\n",filename); //exit(EXIT_FILURE); } while( (ret = fscanf( fp, "%d,%[^,],%[^,],%[^,],%d,%d,%[^,]", &(new->ID), new->Sname, new->Fname, new->Adress, &(new->Sex), &(new->Age), new->Group ) ) != EOF )//ファイルの最後でないなら { printf("%d,%s,%s,%s,%d,%d,%s",new->ID,new->Sname,new->Fname,new->Adress,new->Sex,new->Age,new->Group); if(top != NULL){ while(top->next != NULL){ top = top->next; } top = new; } else{//top == NULL top = new; } new = NULL; new = (struct account *) malloc(sizeof(struct account)); new->next = NULL; } fclose(fp); return top; }

  • ソースを観てくれませんか。

    こんにちは。C言語で書きました。 関数内でCSVファイルからデータを読み取り、そのデータをリストに入れて、先頭を指すポインタをmain内に返すと言う作業をさせたくて書いたソースです。なぜ無限ループするのか分かりません。 どなたか教えていただけませんか? 以下ソース #include <stdio.h> #include <stdlib.h> struct account{ int ID; char Sname[50]; char Fname[50]; char Adress[100]; int Sex; int Age; char Group[100]; struct account *next; }; struct account *Rfile(char *FileName,struct account *top); int main(void) { char FileName[FILENAME_MAX]; struct account *top,*q; top = NULL; printf("読み込むファイルの名前を入力してください>>>"); scanf("%s",FileName); q = Rfile(FileName,top); return 0; } struct account *Rfile(char *FileName,struct account *top) { FILE *fp; char filename[FILENAME_MAX]; int ret; struct account *new; new = (struct account *) malloc(sizeof(struct account)); new->next = NULL; strcpy(filename,FileName); if( (fp = fopen( filename,"r")) == NULL) { printf("ファイルが見つかりません。>>>%s\n",filename); //exit(EXIT_FILURE); } while( (ret = fscanf( fp, "%d,%[^,],%[^,],%[^,],%d,%d,%[^,]", &(new->ID), new->Sname, new->Fname, new->Adress, &(new->Sex), &(new->Age), new->Group ) ) != EOF )//ファイルの最後でないなら { printf("%d,%s,%s,%s,%d,%d,%s",new->ID,new->Sname,new->Fname,new->Adress,new->Sex,new->Age,new->Group); if(top != NULL){ while(top->next != NULL){ top = top->next; } top = new; } else{//top == NULL top = new; } new = NULL; new = (struct account *) malloc(sizeof(struct account)); new->next = NULL; } fclose(fp); return top; }

  • ファイル処理について

    大学の課題なのですが、何度取り組んでもエラーになるため、間違いのご指摘、または正答を教えていただけないでしょうか。 問題は以下のものです。 【問題】 ファイルから整数を読み込み,その値によってfpの読み込み位置をかえ,何度目の読み込みで0を読み込んだかを表示するプログラムを作成せよ. ファイルの内容の例 2,4,0, fpの読み込み位置を変えるにはfseekという関数を利用する. fseekの使い方: 現在の読み取り位置xだけずらすには, fseek(ファイルポインタ, x, SEEK_CUR); と記述する. STEP 1 データを一区切りで読み取る("2,"や"-4,"などの整数とコンマの組) 2 読み取ったデータに応じてfpを移動させる("2,"なら2移動,"-4,"なら-4移動) 3 0を読むまで繰り返す +++++*+++++fseek-exercise.c+++++*+++++ #include <stdio.h> int main(void){ FILE *fp; int c; int i; int count=0; char filename[60]; printf("ファイル名 :"); scanf("%s",filename); //ファイルを開く // (* ここに解答を書き加える *) while(1){ printf("読み込み前 : %ld\n",ftell(fp)); //fpから値を読む // (* ここに解答を書き加える *) printf("読み込んだ値は%dです\n",c); printf("読み込み後 : %ld\n\n",ftell(fp)); //読み込み位置をずらす // (* ここに解答を書き加える *) } printf("%d回目です.",count); fclose(fp); return(0); } // 以上になります。 自分で作ったプログラムは以下のようになりました。 #include <stdio.h> int main(void){ FILE *fp; int c; int i; int count=0; char filename[60]; printf("ファイル名 :"); scanf("%s",filename); //ファイルを開く // fp = fopen(filename,"r"); if(fp == NULL){ printf("cannot open\n"); exit(1); } while(1){ printf("読み込み前 : %ld\n",ftell(fp)); //fpから値を読む // c = fgetc(fp); printf("読み込んだ値は%dです\n",c); printf("読み込み後 : %ld\n\n",ftell(fp)); //読み込み位置をずらす // if(c > '0' || c< '9'){ i = atoi(&c); count++; if(i == 0){ break; } fseek(fp,i,SEEK_CUR); } } printf("%d回目です.",count); fclose(fp); return(0); } // どこを訂正していいのかわかりません。 どうぞ、よろしくお願いいたします。

  • fscanf

    fscanfを使って、ファイル(普通の英文が入っています)から一単語ずつ読み込んでいきたいと思っているのですが、どうすれば良いのかわかりません。 int main(int argc,char *argv[]){ FILE *fp; char *word; fp = fopen(argv[1], "r"); if(fp == NULL){ printf("error: not open file.\n"); return(0) ;} while( ){ fscanf(fp,"%[a-zA-Z]",word); printf("%s\n", word); fflush(stdout); } fclose(fp); return 0; } とりあえず上の様なプログラムで、一単語ずつ順番に単語を出力できるようにしたいと思っているのですが。 いろいろ変なところなど在ると思いますが、whileの条件など、どうすればよいか教えてください。

  • ポインターについて

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=2352832 で、質問させて頂いた者です。 ポインターの使い方について 理解できないところがありましたので 新しく質問をさせて頂きました。 ----------- ↓構造体の型を宣言しています typedef struct douken_ { char tiku[11]; char ken[9]; } douken; int main(void){ FILE *fp; ↓変数を宣言 douken dou [100]; ・ ・ ・ while (fgets(buff,sizeof buff,fp) != NULL){ ファイルから読み込んだデータを構造体に格納 memcpy(&dou[i].tiku ,buff,10); memcpy(&dou[i].ken ,buff+10,10); 【ここが問題】 現データと全データを比較する if (strcmp(dou[i].tiku , dou[i-1].tiku)){ ----------- if文で現データと全データを比較する時に、 実数だと正常に動くのですが ポインターで指定すると 警告が出てしまいます。 if (strcmp(&dou[i].tiku , &dou[i-1].tiku)){ とすると >警告 W8075 kadai3-2.c 33: 問題のあるポインタの変換(関数 main ) という警告が出てしまうのです。 どうしてポインターで指定すると 警告が出るのかが分からないのです。 (memcpyではファイルから読み込んだデータを 構造体に格納するときはポインターで指定しているのに…) ご教授して頂けたら幸いです。

  • ファイルから読み込んだデータを構造体に格納できますか?

    1レコード19バイトのファイルを 読み込む処理を行っています。 地区名10バイト 県名8バイト 改行1バイト このデータをdouken(構造体)に格納したいのですが >while (fgets(dou,19,fp) != NULL){ で、エラーになってしまいます。 どのようにしたら ファイルから読み込んだデータを 構造体に格納できますか? #include<stdio.h> #include <stdlib.h> struct douken { char tiku[10]; char ken[8]; } main(void){ FILE *fp; struct douken dou[100]; int i; fp = fopen("ex3.fil","rb"); if ( fp == 0 ){ printf("can't open\n"); exit(1); } while (fgets(dou,19,fp) != NULL){ ・ ・ ・

  • エラーが出ます

    12,51,13,123,133,551,… というコンマで区切られているファイルを読み込みたいです。数字は100文字です。どう書けば全部読み込めるでしょうか? よろしくお願いします。 int main(int argc,char *argv[ ]){ int line; int i; FILE *fp; fp = (argc > 1)? fopen(argv[1],"r"): stdin; if(fp==NULL){ perror("fopen"); exit(0); }   while(fscanf(fp,"%d",&line) != EOF){ printf("%d\n") } if(argc>1){ fclose(fp);   }

  • ポインタについて

    途中までのソースコード typedef struct node{ char moji[128]; --------(1) }NODE; int main(int argc, char *argv[]){ FILE *fp; char buf[128]; NODE p[128]; char *tp; int i = 0; int j,k; int res; NODE temp; fp = fopen(argv[1],"r"); while(fscanf(fp,"%s",&buf) == 1){ tp = strtok(buf," ,.-"); strcpy(p[i].moji,tp); ---------(2) i++; while(tp != NULL){ tp = strtok(NULL," ,.-"); if(tp != NULL){ strcpy(p[i].moji, tp); --------(2) i++; } } } for(j = 0;j < i; j++) puts(p[j].moji); return 0; } file.txt これ以下の文字を読み込む -------------- The Java programming language is a general-purpose, concurrent, class-based, object-oriented language. It is designed to be simple enough that many programmers can achieve fluency in the language. 例えばこんなソースコードがあって、(1)をポインタにして、(2)のstrcpyを使わずにポインタだけで表現するとしたらどのようになるんですか?

  • fscanfで格納された変数がおかしいです。

    fscanfで格納された変数がおかしいです。 ダブルポインタで定義した変数にfscanfでファイルから文字列データを読み込んでいるのですが 表示がおかしな事になっています。 読み込んだファイルの内容は、 aiueo kakikueko sasisuseso tatituteto です。 表示された結果が kakikueko sasisuseso tatituteto kakisasitatituteto sasitatituteto tatituteto 自分では解決しずらいのでここで質問をさせて頂くことになりました。 C/C++で記述してあるのですが、以下にソースを載せておきますのでご指摘ください。 /* double pointa */ #include <stdio.h> #include <stdlib.h> #define MAXSIZE 256 char** size; // TEST void test(void) { for(int l = 0; l < 3; l++) { printf("\n%s", &size[l]); } } int main() { FILE* fp; int c = -1; char moji[MAXSIZE]; if((fp = fopen("test.txt","rb")) == NULL) { printf("error"); exit(1); } while(fscanf(fp,"%s",moji) != EOF) c++; size = (char**)malloc(sizeof(char) * MAXSIZE * c); // 初めに戻す fseek(fp, 0, SEEK_SET); // 最初の文だけ取り出す fscanf(fp,"%s",moji); // 一文を格納する for(int l = 0; fscanf(fp, "%s", &size[l]) != EOF; l++) { printf("\n%s", &size[l]); } printf("\n"); test(); fclose(fp); getchar(); free(size); return 0; } test関数内で表示するとおかしな結果がでるのですが何故かわかりません。 よろしくお願いします。

  • ファイル操作

    あるファイルから長さの違った数字や文字を読み込んで配列に格納したいのですが数字などの長さが違うとなんかおかしくなってしまいます; 例えば 1 a 1 2 a 2 3 b 3 4 b 4 などのファイルはできるのですが 0 1 2 3 a 3 4 b 4 5 c 5 の場合5つの配列に格納したいのです。1行目で1つ2行目で1つ3行目の 左、真ん中、右の数字でそれぞれ1つづつ格納したいのです。 それで自分でやったのですが typedef struct path{ int left [100]; int right[100]; char center [100]; }Path; int main(int argc,char *argv[]) { FILE *fp; Path path; int i=0; int first; int second[100]; fp = fopen(argv[1],"r"); while(fscanf(fp,"%d %c %d",&path.left[i],&path.center[i],&path.right[i])==3){ i++; } fclose(fp); このようにやると3行目からはきちんとよみこむのですが1、2行目がうまくできません@@; firstとsecondのそれぞれ1、2行目を入れたいのです。 fscanfをもう1つ増やすしてもやってみましたがうまくいきませんでした。 ちなみにfscanf関数のところをならったばかりです。 fgetcとかそのようなのを使うのでしょうか?(よくわからないですけど) よろしくお願いします。ちなみにLinuxでgcc、C言語です。

専門家に質問してみよう