• ベストアンサー

sizeofについて

http://oshiete1.goo.ne.jp/kotaeru.php3?q=2416720 で、質問をさせて頂いた者です。 質問そのものは回答して頂いたお陰で 解決しました。 コードを書いて説明してくれたのですが その中で良く理解できない点が ありましたので 新しく質問をしました。 >fread(buf , sizeof(char), sizeof(char) * 3, fp); 1.どうして「sizeof(char)」は 「sizeof(buf)」ではないんでしょうか? 2.「sizeof(char) * 3」は、 どうして、ただの「3」ではいけないのでしょうか? 3. >buf[3] = '\0'; は、bufの4文字目に 0を入れると考えて宜しいでしょうか? ご面倒かと思いますが よろしくお願いします。

  • niiza
  • お礼率43% (211/486)

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

1.どうして「sizeof(char)」は「sizeof(buf)」ではないんでしょうか? これは読み込みの単位なのでchar単位で読み込むのかint単位で読み込むのか等で変わってきます。この場合はchar単位の書込ということを示しています。 2.「sizeof(char) * 3」は、どうして、ただの「3」ではいけないのでしょうか? ここはデータの個数なのでただの「3」の方が正しいと思います。 3.>buf[3] = '\0';は、bufの4文字目に0を入れると考えて宜しいでしょうか? 文字列の最後(区切り)という意味で入れてあるのだと思います。 例えば fread(buf , sizeof(int), 3, fp); ですとint型が4バイトの場合4x3の12バイト読み込まれます。

niiza
質問者

お礼

ご返事有り難うございました。 大変に参考になりました。

その他の回答 (1)

  • chirubou
  • ベストアンサー率37% (189/502)
回答No.2

1. fread() は第2引数と第3引数の値の積だけ読み込みます。ですので、もし第2引数を sizeof(buf) にすると、この値は4(char buf[4];だから)になってしまい、4×3バイト読み込んでしまいます。 2. 3でも動作は全く同じですが、こうすると文字(バイト)であることが明記され他人が読み易くなるというこです。 3. その通りです。こうするとbufの最後が必ず文字列の終端を示す'?0'(ゼロ)になりますので、デバッグ等でprintf()が簡単になります。

niiza
質問者

お礼

ご返事有り難うございました。 大変に参考になりました。

関連するQ&A

  • icon format について

    Visual Studio.NET 2003 MFC を使用しています。 View画面で、アイコンを表示しようと思いました。 アイコン読み込みようのクラスを作成しました。 class icon { public: void IconHeadRead(FILE *fp,int *width,int *height) { unsigned char uc; unsigned short us; unsigned int ui; fread(&us,sizeof(unsigned short),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&uc,sizeof(unsigned char),1,fp);*width=uc; fread(&uc,sizeof(unsigned char),1,fp);*height=uc; fread(&uc,sizeof(unsigned char),1,fp); fread(&uc,sizeof(unsigned char),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&ui,sizeof(unsigned int),1,fp); }; void IconDataRead(FILE *fp,unsigned char *red,unsigned char *green,unsigned char *blue) { unsigned char uc; fread(&uc,sizeof(unsigned char),1,fp);*red=uc; fread(&uc,sizeof(unsigned char),1,fp);*green=uc; fread(&uc,sizeof(unsigned char),1,fp);*blue=uc; }; }; このred,green,blueの値を使用して、 SetPixelでドローしようと思いましたが、 変な表示になります。 width,heightは、正しいようです。 ICON フォーマットについて教えてください。 よろしくお願いします。 同じような要領で、bitmapは保存、読み込みはできました。

  • fread()エラー

    お世話になります。 今、バイナリファイルを操作しているのですが、 fread()でエラーになってしまいます。 char buf1[256]; FILE *fp; vector<string> f1; int num; fp = fopen("hoge.txt","r"); while( fgets( buf1, sizeof(buf1),fp ){ f1.push_back( buf1 ); num ++; } fclose(fp); FILE *cfp; unsigned char data[1024]; for(int i=0; i<num; i++ ){ cfp = fopen(f1[i].c_str(), "rb"); fread( data, sizeof(char), 1024, cfp ); } hoge.txtには、コンテンツ場所(パス)が複数記載されており、 その1つずつをfread()で読み込み解析したいのですが、 fread()でセグメンテーション違反になります。 f1の中味をprintf("%s",f1[0].c_str()); で見てみると正常にコンテンツの場所が格納されています。 また、 string pp = "/home/hoge/hoge.txt"; cfp = fopen(pp.c_str(), "rb"); fread(bb,sizeof(char),1024,cfp); とすると正常に動作します。 どうぞよろしくお願い致します。

  • FILE オープンについて

    いつもお世話になります。 今ファイルデータ検索処理を検討しております。 今、search.txtには、 検索対象となるファイルパスが記載されています。 [search.txt] /home/hoge/SAMPLE1.jpg /home/hoge/SAMPLE2.jpg search.txtをfopen()し、1行ずつfgets()して、 得られるファイルパスより、そのファイルを fopen()して解析する処理がしたいですが、 fgets()より得られたファイルパスをfopen()し、 fread()するとセグメンテーションエラーになります。 どのようにしたらいいのでしょうか? 現状のコードを下記します。 FILE *fp; char *com1 = "/home/hoge/search.txt"; FILE *confp; char buf1[1024]; char buf2[1024]; int i =0; fp = fopen(com1, "r"); while( fgets(buf1, sizeof(buf1), fp )){ confp = fopen(buf1, "rb"); //*.JPGファイルをオープン //下記fread()でセグメンテーションエラー size_t size = fread( buf2, sizeof(char), 1024, confp ); for( i = 0; i<1024; i++ ){ if( (buf2[i] == 0xff) && (buf2[i+1] == 0xe0) ){ printf("%02x\n",buf[i+5]); } } } fclose(fp); fclose(confp); 上記のように、search.txtをfopen()し、読み込んだファイルパスを fopen()して、fread()読み込みをする方法を 教えて下さい。 どうぞよろしくお願い致します。

  • freadでダンプ なぜ?

    ファイルを1バイトづつfreadで読み込んで ダンプしているのですが、なぜか16進数で"1A" (10進数で"26")の文字から先をダンプできません。 原因が良くわかりません。 どなたか、わかる方お助けください。  char buf[20];  unsigned short a;  flag = 1;  while (flag == 1){   fread(buf, sizeof(char), 1, fp_in);   a = buf[0];   printf("%02x ",a);   cnt++;   if(cnt == 16){    printf("\n");    cnt = 0;   }     :     : }

  • プログラム(C)

    #include <stdio.h> #include <stdlib.h> #define FNAME "smp.bmp" #define WSIZE 256 #define HSIZE 256 #define BSIZE 1024 int main(void) { struct BMPFILEHEADER { ・   ・ }; struct BMPINFOHEADER { ・   ・ }; unsigned char img[HSIZE][WSIZE][3]; unsigned char buf[BSIZE]; struct BMPFILEHEADER lpHead; struct BMPINFOHEADER lpInfo; FILE *fp; int i; int j; int k; fp = fopen(FNAME,"rb"); if (fp==NULL) { printf("ファイルをオープンできません\n"); return 0; } fread(&lpHead.bfType, sizeof(unsigned short),1,fp); fread(&lpHead.bfSize, sizeof(unsigned int),1,fp); fread(&lpHead.bfReserved1, sizeof(unsigned short),1,fp); fread(&lpHead.bfReserved2, sizeof(unsigned short),1,fp); fread(&lpHead.bf0ffBits, sizeof(unsigned int),1,fp); fread(&lpInfo, sizeof(struct BMPINFOHEADER),1,fp); for(i=0;i<HSIZE;i++) { fread(buf,sizeof(unsigned char),WSIZE*3,fp); for(j=0;j<WSIZE;j++) { for(k=0;k<3;k++) { img[HSIZE-1-i][j][k]=buf[j*3+k]; } } } fclose; return 0; } このプログラムはBMP画像を読み込むプログラムなんですが このプログラムに画素値を出力するプログラムにしたいのですがうまくできません。 結果は(真っ白な画像の時)255255255・・・255255と出力したいのです。白黒画像なのでR=G=Bで1画素値は255だけでいいのですが。どうしても255255255や25500などとでてしまいます。 アドバイスお願いします。(800字までなので構造体の宣言は抜いてしましました) 。

  • 16進数から10進数に変換

    いつもお世話になります。 先日バイナリデータを読み込み、ある特定のデータを検索し、 そのデータを10進数に変換する処理がしたいです。 FILE *fp; char buf[1024]; fp = fopen("sample.jpg","rb"); fread(buf, siZeof(char), 1024, fp); for( int i=0; i<1024; i++ ){ if( (buf[i]==0xff) && (buf[i+1] == 0xe0) ){ //※質問詳細下記します。 } } ※ f文で、buf[i+2]buf[i+3]、例えばprintf("%02x,%02x",buf[i+2],buf[i+3]); で出力すると、所望の(11 00 )の16進数で得られています。 このbuf[i+2] buf[i+3]の値を10進数に変換して得るには、 どうしたらいいでしょうか? 0x1100→4352 どうぞよろしくお願い致します。

  • freadの最後

    100文字くらいのファイルのファイルポインタfpがあるとして、 char ch[200]; fread(ch,sizeof(char),sizeof(ch),fp) とした場合にchの中で、ファイルの最後っていうのを判断するにはどうすればいいですか?

  • ファイルサイズを変更したい

    visualstudio2010を使用しています。 c言語で書いているのですが、 test.txt ←abcdefg ファイルサイズ1KB Wtest.txt←書き込み用ファイル 上記のようなファイルがあり、バイナリでtest.txtを読み込みWtest.txtに書き込みたいと思っています。 その際に、1KBのtest.txtを5KBになるまでバイナリで「abcdefg」の後に0を代入したいのですがどう書けば良いのかわかりません。 FILE *fp, *fpw; char *fname = "test.txt"; char *fname_w = "Wtest.txt"; unsigned char buf[10000]; int size; fp = fopen( fname, "rb" ); if( fp == NULL ){ printf( "%sファイルが開けません\n", fname ); return -1; } fpw = fopen(fname_w, "wb"); if(fpw == NULL){ printf( "%sファイルが開けません\n", fname_w ); return -1; } size = fread( buf, sizeof( unsigned char ), sizeof (fp), fp ); /*ここに処理を追加したい*/ fwrite( buf, sizeof( unsigned char ), size, fpw);

  • ファイナンシャル・プランナーは専門家?

    この回答見ていると、FPさんが、専門家とは思えないですが、人にもよるのでしょうか。セルサイドの専門家なら、理解できますが、、、。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2190274

  • 恋愛依存症とは???

    こんにちは!! いつもお世話になってます。。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=629254 http://oshiete1.goo.ne.jp/kotaeru.php3?q=630879 http://oshiete1.goo.ne.jp/kotaeru.php3?q=633725 http://oshiete1.goo.ne.jp/kotaeru.php3?q=644351 ↑↑↑↑↑ 今まで質問してきたものですが これを見て私は恋愛依存症だと思いますか?? 自分でもそうなのかな??と思ったりしますが どうなんでしょう?? そしてどうしたら恋愛依存症から立ち直ることが できますか?? やっぱり趣味とか見つけたり仕事に打ち込んだりするのが一番なんでしょうか?? 私は、今の彼のことで悩んでいますが、 なんとか立ち直りたいんです!! 今の自分がいやでいやで堪らないんです。。 彼だけのことを考えている自分が情けないんです。。 恋愛依存症になったことがある方、そうでなくても構いませんが何かいい方法はないでしょうか?? よろしくお願いします!!

専門家に質問してみよう