C言語で24bit Windowsbitmapの画像データ部を読み込んで10進数でダンプするプログラムの作成方法

このQ&Aのポイント
  • C言語で24bit Windowsbitmapの画像データ部を読み込み、10進数でダンプするプログラムの作成方法について教えてください。
  • 初めてバイナリファイルを扱うため、勘違いがあるかもしれません。お知恵をお貸しください。
  • bmpファイルの画像データを表示するC言語のプログラムを作成しましたが、表示が000...となってしまいます。どこが間違っているのか教えてください。
回答を見る
  • ベストアンサー

bmpファイルの画像データ表示

C言語で24bit Windowsbitmapの画像データ部を読み込んで10進数でダンプするプログラムを書きましたが000…と表示されます. バイナリファイルの扱いは初めてなので勘違いを多々しているとおもいます.ご指導,ご指摘宜しくお願いします. =======ソース=========================== #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]){ FILE *fp; char buff[40]; char buffData[2560]; size_t size = 1; size_t n = 40; int biSize; int biBitCount; int biCompression; int biWidth; int biHeight; int bfSize; int bfOffBits; int lineByte; int i; int position; int line; if( argc != 2){ printf("Run this way !! %s [bit map image] \n",argv[0]); return 0; } fp = fopen(argv[1],"rb"); if(fp == NULL){ printf("%s No such file or directory !!\n",argv[1]); return 0; } /********************************* * check header infomation * *********************************/ // check input file type fread(buff,size,n,fp); if('B' != buff[0] || 'M' != buff[1]){ printf("## Warning ## %s is not bit map file !!\n",argv[1]); return 0; } // check bitmap type biSize = *(int*)(buff + 14); if( biSize != 40){ printf("%s isn`t Windows bitmap !!\n",argv[1]); return 0; } // check the size(bit) of 1 pixel biBitCount = *(int*)(buff + 28); if(biBitCount != 24){ printf("%s isn't 24bit Windows bitmap !!\n",argv[1]); return 0; } // check the type of compression biCompression = *(int*)(buff + 30); if(biCompression != 0){ printf("%s is compressed Windows bitmap !!",argv[1]); return 0; } // check the width of image (pixel) biWidth = *(int*)(buff + 18); //printf("Width : %d\n",biWidth); // check the height of image (pixel) biHeight = *(int*)(buff + 22); //printf("Height : %d\n",biHeight); // check the file size bfSize = *(int*)(buff + 2); // check the offset to image data bfOffBits = *(int*)(buff + 10); /************************************ * reading image data * ************************************/ // the size of one line lineByte = (biWidth * biBitCount) / 8; printf("LineByte = %d\n",lineByte); for(i=0;i < biHeight ;i++){ position = bfOffBits + lineByte * (biHeight - (i + 1)); fseek(fp,position,SEEK_SET); fread(buffData,line,1,fp); printf("%d\n",*(int*)buffData); } fclose(fp); return 0; } ========================================

質問者が選んだベストアンサー

  • ベストアンサー
  • tana_y
  • ベストアンサー率41% (7/17)
回答No.2

時間ないので全て解析しきれませんでしたが、 やった成果だけでも、参考になればどぞ #include <stdio.h> #include <stdlib.h> #include <windows.h> int main(int argc, char * argv[]) { BITMAPFILEHEADER BMFH; BITMAPINFOHEADER BMIH; FILE * fp; char buffData[2560]; size_t size = 1; size_t n = 40; int lineByte; int i; if (argc != 2) { printf("Run this way !! %s [bit map image] \n", argv[0]); return 0; } fp = fopen(argv[1], "rb"); if (fp == NULL) { printf("%s No such file or directory !!\n", argv[1]); return 0; } /********************************* * check header infomation * *********************************/ // check input file type fread(&BMFH, sizeof(BMFH), 1, fp); if (memcmp((char*)&BMFH.bfType, "BM", sizeof(BMFH.bfType))) { printf("## Warning ## %s is not bit map file !!\n", argv[1]); return 0; } // check bitmap type fread(&BMIH, sizeof(BMIH), 1, fp); if (BMIH.biSize != 40) { printf("%s isn`t Windows bitmap !!\n", argv[1]); return 0; } // check the size(bit) of 1 pixel if (BMIH.biBitCount != 24) { printf("%s isn't 24bit Windows bitmap !!\n", argv[1]); return 0; } // check the type of compression if (BMIH.biCompression != 0) { printf("%s is compressed Windows bitmap !!", argv[1]); return 0; } /* // check the width of image (pixel) biWidth = *(int * )(buff + 18); //printf("Width : %d\n",biWidth); // check the height of image (pixel) biHeight = *(int * )(buff + 22); //printf("Height : %d\n",biHeight); // check the file size bfSize = *(int * )(buff + 2); // check the offset to image data bfOffBits = *(int * )(buff + 10); */ /************************************ * reading image data * ************************************/ // the size of one line lineByte = (BMIH.biWidth * BMIH.biBitCount) / 8; printf("LineByte = %d\n", lineByte); int j; FILE *output; output = fopen("output.txt", "w"); for (i = 0; i < BMIH.biHeight; i++) { fread(buffData, lineByte, 1, fp); for(j = 0; j < BMIH.biWidth; j++) { fprintf(output, "%x ", *(int * ) &buffData[j*3]); } fprintf(output, "\n"); } fclose(fp); return 0; }

その他の回答 (3)

  • tana_y
  • ベストアンサー率41% (7/17)
回答No.4

1データが24ビットなので fprintf(output, "%x ", *(int * ) &buffData[j*3]); これだとintが4バイトなので,32ビット分表示してしまうかなと。 なので、0xffffffで&を取れば24ビット分にできたなぁって。 でも深く考えていないので0xffffff00かもしれない。

  • tana_y
  • ベストアンサー率41% (7/17)
回答No.3

補足 画像ファイルなので 10進数より16進数のが分かりやすいかなと思い。%x表示しています。 また、printfだと見にくかったのでファイル(ファイル名output)に出力してしまいました。 それと24ビットなのにintで扱った為、上位8bitに前のデータが入ってしまっています。 0xffffffでマスクすればよかった(汗)

Falcon2
質問者

補足

>>それと24ビットなのにintで扱った為、上位8bitに前のデータが入ってしまっています。 >>0xffffffでマスクすればよかった(汗) の意味が分からないのですが,どういう意味なのでしょうか?

  • tana_y
  • ベストアンサー率41% (7/17)
回答No.1

中身をまだ理解出来ていませんがとりあえず。 /************************************ * reading image data * ************************************/ // the size of one line lineByte = (biWidth * biBitCount) / 8; printf("LineByte = %d\n",lineByte); for(i=0;i < biHeight ;i++){ position = bfOffBits + lineByte * (biHeight - (i + 1)); fseek(fp,position,SEEK_SET); fread(buffData,line,1,fp); printf("%d\n",*(int*)buffData); } の fread(buffData,line,1,fp); lineに値が入っていないようですよ。 freadがいくつ読み込めばいいのか困ってしまうと思います。

Falcon2
質問者

補足

回答ありがとうございます。lineByteにすべきですね。修正して試してみます。

関連するQ&A

  • ネットで落ちていた「Excelで作ったデータ(CSVファイル)の読み込

    ネットで落ちていた「Excelで作ったデータ(CSVファイル)の読み込みプログラム」をそのままコンパイルして実行しようと思ったのですが、 sample.c: In function 'main': sample2.c:9: warning: return type of 'main' is not 'int' と、表示されてしまいます。 プログラミング初心者なので、どこが間違っているのかわかりません。 回答またはアドバイスの程、よろしくお願いいたします。 ネットで落ちていたプログラムを以下に記載します。 sample2.c #include <stdio.h> #define MAX_ITEM_SIZE 100 #define MAX_LINE_SIZE 1024 char *GetCSVItem(char *wp, char *buff, int size); void main(int argc, char *argv[]) { FILE *fp; char buff[MAX_LINE_SIZE], *wp, item[3][MAX_ITEM_SIZE]; int i1, len; if(argc != 2){ printf("コマンドの入力形式が間違っています.\n"); return; } fp = fopen(argv[1], "r"); if(fp == NULL){ printf("ファイルがオープンできません[%s].\n", argv[1]); return; } for(;;){ if(fgets(buff, MAX_LINE_SIZE, fp) == NULL) break; len = strlen(buff); if(len == 0 || buff[len-1] != '\n'){ if(feof(fp) == 0){ printf("データが不正です[%s].\n", buff); return; } } buff[len-1] = '\0'; wp = buff; if((wp = GetCSVItem(wp, item[0], MAX_ITEM_SIZE)) == NULL){ printf("エラー(1)\n"); break; } if((wp = GetCSVItem(wp, item[1], MAX_ITEM_SIZE)) == NULL){ printf("エラー(2)\n"); break; } if((wp = GetCSVItem(wp, item[2], MAX_ITEM_SIZE)) == NULL){ printf("エラー(3)\n"); break; } if(*wp != '\0'){ printf("エラー(4)\n"); break; } for(i1 = 0; i1 < 3; i1++){ printf("%d:%s\n", i1+1, item[i1]); } } fclose(fp); } char *GetCSVItem(char *wp, char *buff, int size) { int i1; buff[0] = '\0'; while(*wp == ' ' || *wp == '\t') wp++; if(*wp == '\0'){ return(NULL); } for(i1 = 0; i1 < MAX_ITEM_SIZE; i1++, wp++){ if(i1 >= size) return(NULL); buff[i1] = *wp; if(*wp == '\0'){ buff[i1] = '\0'; return(wp); } if(*wp == ','){ wp++; buff[i1] = '\0'; break; } } return(wp); }

  • cygwinを使ってcsvファイルを読み込み、出力させようとしています

    cygwinを使ってcsvファイルを読み込み、出力させようとしています。 とりあえず、読み込みのみのプログラムを作成し、 実行させてみたのですが(run ファイル名.csv と入力) 「Error: could not start C:\cygwin\home\ユーザー名ファイル名.csv」 と出力され、読み込みができず、困っています。 プログラム初心者です。 恐縮ですがご回答よろしくお願いします。 以下に、読み込みプログラムとcsvファイルを記載します。 (プログラムは拾い物です。) <プログラム> #include <stdio.h> #define MAX_ITEM_SIZE 100 #define MAX_LINE_SIZE 1024 char *GetCSVItem(char *wp, char *buff, int size); void main(int argc, char *argv[]) { FILE *fp; char buff[MAX_LINE_SIZE], *wp, item[3][MAX_ITEM_SIZE]; int i1, len; if(argc != 2){ printf("comand error nyuuryoku keishiki\n"); return; } fp = fopen(argv[1], "r"); if(fp == NULL){ printf("can not open file[%s].\n", argv[1]); return; } for(;;){ if(fgets(buff, MAX_LINE_SIZE, fp) == NULL) break; len = strlen(buff); if(len == 0 || buff[len-1] != '\n'){ if(feof(fp) == 0){ printf("data error[%s].\n", buff); return; } } buff[len-1] = '\0'; wp = buff; if((wp = GetCSVItem(wp, item[0], MAX_ITEM_SIZE)) == NULL){ printf("error(1)\n"); break; } if((wp = GetCSVItem(wp, item[1], MAX_ITEM_SIZE)) == NULL){ printf("error(2)\n"); break; } if((wp = GetCSVItem(wp, item[2], MAX_ITEM_SIZE)) == NULL){ printf("error(3)\n"); break; } if(*wp != '\0'){ printf("error(4)\n"); break; } for(i1 = 0; i1 < 3; i1++){ printf("%d:%s\n", i1+1, item[i1]); } } fclose(fp); } char *GetCSVItem(char *wp, char *buff, int size) { int i1; buff[0] = '\0'; while(*wp == ' ' || *wp == '\t') wp++; if(*wp == '\0'){ return(NULL); } for(i1 = 0; i1 < MAX_ITEM_SIZE; i1++, wp++){ if(i1 >= size) return(NULL); buff[i1] = *wp; if(*wp == '\0'){ buff[i1] = '\0'; return(wp); } if(*wp == ','){ wp++; buff[i1] = '\0'; break; } } return(wp); } <csvファイル> 1,2,3 11,12,13 21,22,23

  • visual c で、ビットマップを読み込む方法

    1120.bmpというファイルをvisual c++で読み込みたいのですが、初心者のため、いまいち方法が分かりません。 ネット上にビットマップの読み込みについて、 1 BITMAPFILEHEADERを読み込む(ビットマップで無い場合はじく) 2 BITMAPINFOHEADERを読み込む(16,256で無い場合ははじく) 3 BITMAPINFOHEADER構造体とRGBQUAD構造体の配列からなるBITMAPINFO構造体の領域を動的に確保する 4 CreateDIBSectionを使って、ビットマップビット列の領域を確保する 5 実際に描画する 6 プログラムが終了したときや、上書き読み込みをする場合は確保した領域を開放する と書いてあったのですが、3から先がたぶん分からない状態で、3のところまでも合っているか分かりません。 もしも、分かる方いらっっしゃったらお願い致します。 今、以下のところまでファイルの記述が終わっています。 #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; int bfType; int bfSize; int bfReserved1; int bfReserved2; int bfOffBits; int biSize; int biWidth; int biHeight; int biPlanes; int biBitCount; int biCompression; int biSizeImage; int biXPelsPerMeter; int biYPelsPerMeter; int biClrUsed; int biClrImportant; int rgbBlue; int rgbGreen; int rgbRed; int rgbReserved; fp = fopen("1120.bmp", "rb"); if(fp == NULL) printf("ファイルオープンに失敗しました。\n"); //BITMAPFILEHEADER構造体 fread(&bfType, 14, 1, fp); fread(&bfSize, 4, 1, fp); fread(&bfReserved1, 2, 1, fp); fread(&bfReserved2, 2, 1, fp); fread(&bfOffBits, 4, 1, fp); //BITMAPINFOHEADER構造体 fread(&biSize, 4, 1, fp); fread(&biWidth, 4, 1, fp); fread(&biHeight, 4, 1, fp); fread(&biPlanes, 2, 1, fp); fread(&biBitCount, 2, 1, fp); fread(&biCompression, 4, 1, fp); fread(&biSizeImage, 4, 1, fp); fread(&biXPelsPerMeter, 4, 1, fp); fread(&biYPelsPerMeter, 4, 1, fp); fread(&biClrUsed, 4, 1, fp); fread(&biClrImportant, 4, 1, fp); fclose(fp); return 1; }

  • VC++でのメールの添付ファイル受信

    http://www.masukawa.co.jp/sdk/40.html のサイトを参考にしてソースを組んでいます。 ですが BOOL Pop3RecvDataToFile(SOCKET sock, int i, char *filename) { char *get, tmp, buff[BUFF_SIZE]; int size, pos; FILE *fp; if (!SockCmd1(sock, "RETR %d", i, buff, "+OK")) return FALSE; if ((fp = fopen(filename, "wb")) == NULL) return FALSE; tmp = '\0'; pos = 0; for (;;) { size = recv(sock, buff, BUFF_SIZE, 0); for (get=buff; get<(buff+size); get++) { if (*get=='\0' || *get=='\r') continue; if (++pos == 1) { if (*get != '\n') { tmp = *get; continue; } } else if (pos == 2) { if (tmp=='.' && *get=='\n') goto FINISH; if (tmp!='.' || *get!='.') fputc(tmp, fp); } fputc(*get, fp); if (*get == '\n') pos = 0; } } FINISH: fclose(fp); return TRUE; } のfor分で無限ループしています。 その理由がわかりません。どうすればよいでしょうか?

  • debugエラーについて

    VisualC++初心者です。 力を貸してください。 内容はDEBUG ERRORで Stack around the variable "rp" was corrupted Stack around the variable "res" was corrupted とでてしまいます。 構造体等は省略しました。 #include <stdio.h> #include <stdlib.h> #define N 8 typedef struct{ int maxi,maxj,akarusa[N][N]; unsigned char *data; }RESULT; int bunkatsu(BMP *rp,BMP *wp); int keisan(BMP *rp,BMP *wp); RESULT *max(RESULT *res); /* 画像の取込 */ int ReadHeader(BMP *p,FILE *fp){ unsigned int size; fseek(fp, 0, SEEK_END); size = ftell(fp); fseek(fp, 0, SEEK_SET); fread(&p->Bmpf.bfType, sizeof(unsigned short), 1, fp); fclose(fp); exit(1); } fread(省略) return 0; } int ReadBmp(BMP *p,FILE *fp){ int dummy, byte, i, j, pixel; unsigned char *ReadBody=0; ReadHeader(p,fp); byte = p->Bmpi.biBitCount/8; dummy = (p->Bmpi.biWidth%4)?(4-(p->Bmpi.biWidth*byte)%4) : 0; pixel = ((p->Bmpi.biWidth)*byte+dummy)*p->Bmpi.biHeight; ReadBody = (unsigned char*)calloc(pixel,sizeof(char)); p->body = (unsigned char*)calloc(pixel,sizeof(char)); p->blue = (unsigned char*)calloc((pixel/byte),sizeof(char)); p->green = (unsigned char*)calloc((pixel/byte),sizeof(char)); p->red = (unsigned char*)calloc((pixel/byte),sizeof(char)); fread(ReadBody,1,pixel,fp); if(p->Bmpi.biBitCount == 8){ printf("\n"); for(j=0;j<p->Bmpi.biHeight;j++){ for(i=0;i<p->Bmpi.biWidth;i++){ p->blue[(p->Bmpi.biWidth+dummy)*j+i] =p->Rgbq[ReadBody[(p->Bmpi.biWidth+dummy)*j+i]].rgbBlue; p->green[(p->Bmpi.biWidth+dummy)*j+i] =p->Rgbq[ReadBody[(p->Bmpi.biWidth+dummy)*j+i]].rgbGreen; p->red[(p->Bmpi.biWidth+dummy)*j+i] =p->Rgbq[ReadBody[(p->Bmpi.biWidth+dummy)*j+i]].rgbRed; } } for(j=0;j<p->Bmpi.biHeight;j++){ for(i=0;i<p->Bmpi.biWidth;i++){ p->body[(p->Bmpi.biWidth+dummy)*j+i]=ReadBody[(p->Bmpi.biWidth+dummy)*(p->Bmpi.biHeight-1-j)+i]; } } } else if(p->Bmpi.biBitCount == 24 || p->Bmpi.biBitCount == 32){ for(j=0;j<p->Bmpi.biHeight;j++){ for(i=0;i<p->Bmpi.biWidth;i++){ p->blue[(p->Bmpi.biWidth+dummy)*j+i] = ReadBody[(p->Bmpi.biWidth+dummy)*(p->Bmpi.biHeight-1-j)*byte+i*byte]; p->green[(p->Bmpi.biWidth+dummy)*j+i] = ReadBody[(p->Bmpi.biWidth+dummy)*(p->Bmpi.biHeight-1-j)*byte+i*byte+1]; p->red[(p->Bmpi.biWidth + dummy)*j+i] = ReadBody[(p->Bmpi.biWidth+dummy)*(p->Bmpi.biHeight-1-j)*byte+i*byte+2]; } } } else{ printf("失敗\n"); exit(1); } free(ReadBody); return 0; } /* 480×480にする */ int bunkatsu(BMP *rp,RESULT *res){ int x,y,a=0; for(y=0;y<rp->Bmpi.biHeight;y++){ for(x=79;x<rp->Bmpi.biWidth-80;x++){ res->data[a] = rp->blue[y*rp->Bmpi.biWidth+x]+rp->green[y* rp->Bmpi.biWidth+x]+rp->red[y*rp->Bmpi.biWidth+x]; a++; } } return 0; } /* ブロック分けして各ブロックの明るさを計算する */ int keisan(BMP *rp,RESULT *res){ int b,c,x,y,i=0,j=0; for(y=0;(y+60)<rp->Bmpi.biHeight;y+=60){ for(x=0;(x+60)<(rp->Bmpi.biWidth-160);x+=60){ for(b=0;b<60;b++){ for(c=0;c<60;c++){ res->akarusa[i][j]+=res->data[(y+b)*rp->Bmpi.biWidth+(x+c)]; } } j++; } i++; } max(res); return 0; } /* 一番明るいブロックの特定 */ RESULT *max(RESULT *res){ int MAX1=0,MAX2=0,i=0,j=0; for(i=0;i<8;i++){ for(j=0;j<8;j++){ printf("[%d][%d]=%d",i+1,j+1,res->akarusa[i][j]); if(MAX1<res->akarusa[i][j]){ MAX1=res->akarusa[i][j]; res->maxi=i; res->maxj=j; } } printf("\n"); } printf("一番明るいブロックは[%d][%d]です\n",res->maxi+1,res->maxj+1); return 0; } int main(void){ BMP rp={0}; RESULT res={0}; FILE *fp; /* 画像の取り込み */ fp=fopen("LED1.bmp","rb"); ReadBmp(&rp,fp); res.data = (unsigned char*)calloc(rp.Bmpi.biWidth*rp.Bmpi.biHeight,sizeof(char)); fclose(fp); fp=0; bunkatsu(&rp,&res); keisan(&rp,&res); return 0; } です。よろしくお願いします。

  • ファイルの内容の表示

    実行時のコマンドライン引数で指定したファイルの内容を、行番号付きで画面に表示するプログラムを作る という問題です。ヒントも与えられています。 行番号付きの表示、コマンドライン引数の利用。両者を組み合わせればできるはずだ >  main関数の引数にargcとargvを指定して、コマンドライン引数をファイル名として利用する。キーボード入力を促す文(プロンプト)や改行チェックは不要なので書かないこと >  コマンドライン引数が指定されない場合は、メッセージを表示してプログラムを終了 >  ファイルの内容を画面表示する処理は、ユーザー定義関数put_file_contentsに記述する。仮引数には文字型のポインタ変数をひとつ指定し、ファイル名を受け渡せるようにする。put_file_contents自体の型は整数型(int)で、正常終了なら返り値0を返すこと。 行番号付きのプログラム#include<stdio.h> > int put_file(char *filename); > > int main() > { > char line[50]; > char *ptr; > > printf("ファイル名を入力:"); > fgets(line,sizeof(line),stdin); > ptr = line + strlen(line) - 1; > if(*ptr == '\n') { > *ptr = '\0'; > } > > put_file(line); > > return 0; > } > > int put_file(char *filename) > { > FILE *fp; > char buf[100]; > int line_no; > > fp = fopen(filename,"r"); > if (fp == NULL){ > printf("%sを開けません\n",filename); > return 1; > } > line_no = 1; > while (fgets(buf,sizeof(buf),fp) != NULL){ > printf("%3d: ",line_no); > printf("%s",buf); > line_no++; > } > fclose(fp); > > return 0; > } で、コマンドライン引数のプログラムは#include<stdio.h> void write_key_inputs(char *filiname); int main(int argc, char *argv[1]) { write_key_inputs(argv[1]); return 0; } void write_key_inputs(char *filename) { FILE *fp; char buf[100] ; fp = fopen(filename,"w"); while(fgets(buf, sizeof(buf),stdin) != NULL) { fputs(buf, fp); } fclose(fp); return ; } です。これらを組み合わせて少しいじると出来るみたいなのですが、できていません。ちなみに私が考えたプログラムは #include<stdio.h> int put_file_contents(char *filename); int main(int argc,char *argv[]) { int i; if(argc == 1){ printf("コマンドライン引数がありません\n"); return 1; } for(i = 0;i<argc;i++) printf("argv[%d]は「%s」です\n",i,argv[i]); put_file(i); return 0; } int put_file(char *filename) { FILE *fp; char buf[100]; int line_no; fp = fopen(filename,"r"); line_no = 1; while (fgets(buf,sizeof(buf),fp) != NULL){ printf("%3d: ",line_no); printf("%s",buf); line_no++; } fclose(fp); return 0; } です。コマンドライン引数は表示されるのですが、行番号が表示されません。どうしたらいいでしょうか??

  • 「コマンドライン引数チェック」て何

    #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; char gyou[1024]; int gyousuu = 0; if ( argc < 2 ){ printf("file mei ga nai\n"); return -1; } fp = fopen(argv[1], "r"); if ( fp == NULL ){ printf("fopen dekinai\n"); return -2; } while(fgets(gyou, sizeof(gyou), fp) != NULL){ gyousuu++; } fclose(fp); printf("gyousuu=%d\n", gyousuu); return 0; }    以上のプログラムはご覧のとおり、「ファイルの行数を計算」のプログラムです。 さて以上の  if ( argc < 2 ){ printf("file mei ga nai\n"); return -1; } は「コマンドライン引数チェック」を行っています。・・・  if ( argc < 2 ){の「argcは2以上である必要がある」と参考書に書いてあります。   以上ですが意味が日光手前ですが、プログラムの行数をカウントするうえで、  「コマンドライン引数チェック」とはどんな作業を行っているとこなのでしょうか!?  よろしくお願いします。  

  • bmpファイルの解析

    Cプログラムでbmpファイルを読み込み 最大輝度(仮にbrightnessとします)とその座標(仮にx,yとします)を吐き出させるプログラムを作りたいのですが、うまくいきません。 アドバイスしていただければ助かります。 宜しくお願いします。 以下に作成したソースを載せています。 #include<stdlib.h> #include<stdio.h> #include<string.h>/*strcat関数で必要*/ unsigned char brightness; int x_size,y_size,/*imageの横画像数、縦画素数*/ x,y,/*ループ変数*/ max_brightness=0,/*最大輝度*/ max_x,/*最大輝度時のx座標*/ max_y;/*最大輝度時のy座標*/ int main(int argc,char* argv[]) { FILE *fp; char buffer[60000]; char file_name[256]; printf("ファイル名入力="); gets(file_name); strcat(file_name,".bmp"); fp = fopen(file_name, "r"); for(y=0; y<y_size; y++){ for(x=0; x<x_size; x++){ brightness=getc(fp); if(brightness>max_brightness) max_brightness=brightness; max_y=y; max_x=x; } } printf("最大輝度=%d\n",max_brightness); printf("(x,y)=(%d,%d)\n",max_x,max_y); if ( ! fp ) { printf("ファイルが開けません\n"); return 1; } fclose(fp); return 0; }

  • ファイルの出力

    コマンドラインで指定したファイルの内容を一行ずつ表示するプログラムです。一行表示するごとに次の行も表示するか尋ねます。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc, char *argv[]) {  FILE *fp;  char str[80];  char ch;  if (argc != 2){   printf("コマンドライン引数が違います\n");   exit(1);  }  if ((fp = fopen(argv[1],"r")) == NULL){   printf("ファイルが開けません");   exit(1);  }  while(!feof(fp)){   fgets(str, 79, fp);   if (!feof(fp)) printf("%s",str);   printf("追加しますか?(y/n)");   gets(str);   if ( toupper(*str) == 'N') break;   printf("\n");  }     if (fclose(fp) == EOF){   printf("ファイルを閉じれません\n");   exit(1);  }  return 0; } while文の   gets(str);  if ( toupper(*str) == 'N') break; この部分を  ch = getchar();  if ( toupper(ch) == 'N') break; でやると上手く実行できないのですが、なぜでずか?

  • C言語のfork()とpipe()の使用方法についてのサンプルを作成し

    C言語のfork()とpipe()の使用方法についてのサンプルを作成していますが、 期待通りの動作をさせる事ができないため、質問させて頂きます。 現在は、aaa.txtの1行目(てすとだよ。)のみ出力されて2行目が出力されません。 (1)実行方法:a.out aaa.txt (2)期待動作:aaa.txt の内容を出力 <aaa.txt> てすとだよ。 pipeだよ。 <ソース> #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <stdlib.h> #include <string.h> #define BUFF_SIZE 1024 /* バッファのサイズ1M */ int main(int argc, char **argv) { int pipefd[2]; int p_id; int ret; /* 関数の戻り値 */ int status; FILE *fp; char buff[BUFF_SIZE]; ret = pipe(pipefd) ; /* パイプ生成失敗 */ if(ret == -1) { perror("main"); exit(EXIT_FAILURE); } /* 子プロセス生成 */ p_id = fork(); /* 子プロ生成失敗 */ if(p_id == -1) { perror("main"); exit(EXIT_FAILURE); } if(p_id == 0) { /* 子プロセス側処理 */ printf("子プロ処理開始!!!\n"); /* 使用しないwrite側はクローズ */ close(pipefd[1]); /* パイプから読込む */ while(read(pipefd[0], &buff, BUFF_SIZE) > 0) { fputs(buff, stdout); } close(pipefd[0]); printf("子プロ処理終了!!!\n"); } else { /* 親プロセス側処理 */ printf("親プロ処理開始!!!\n"); /* 使用しないread側はクローズ */ close(pipefd[0]); printf("親プロ:読込ファイル名[%s]\n",*(argv + 1) ); if( (fp = fopen( *(argv + 1), "r" ) ) != NULL) { while(fgets(buff, BUFF_SIZE, fp) != NULL) { printf("パイプに書込む値:%s\n",&buff[0]); /* パイプに書き込む */ write(pipefd[1], buff, strlen(buff) + 1); } fclose(fp); } else { perror("親プロセス "); } close(pipefd[1]); wait(&status); } return EXIT_SUCCESS; }

専門家に質問してみよう