• ベストアンサー

fread関数の使い方がわかりません。

以下のプログラムで試しているのですが、コンパイルはできても各配列の要素が表示されません。なぜなんでしょうか? #include<stdio.h> main() { FILE *fp; int i,b[10]; char a[10]; gets[a]; //ファイル名を指定 fp = fopen(a,"rb"); //バイナリモードでオープン fread(b,3,10,fp);   //配列に3byteづつ書き込んだつもり for(i=0;i>=9;i++){ printf("%02x\n",b[i]); //この部分の表示がされない。 } fclose(fp); } レベルの低い質問ですいませんがよろしくお願いします。

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>ちなみに3バイトづつ配列に入れていくことはfreadをつかってできますでしょうか? 下の2通りが普通ですかね? ただし、両方ともb[]の初期化をあらかじめしておかないと 4バイト目にごみが残っていますので注意してください。 方法1 3バイトずつ複数回に分けて読む。 for(i=0;i<=9;i++){ fread(b,3,1,fp); printf("%02x\n",b[i]); } 方法2 まとめて読んで、切り分ける char buf[30]; fread(b,1,30,fp); for(i=0;i<=9;i++){ memcpy(&b[i], &buf[i*3],3); printf("%02x\n",b[i]); } でしょうかね? で、それって本当に整数値なんですか? そもそも、もとのデータはどのようにファイルに書き込まれたのですか? 普通は3バイトずつなんて整数値はファイルに書かないんですけど。

jimihenn
質問者

お礼

どうもありがとうございました。 その方法でやってみたいと思います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

intは、32bitOSなら4バイトです。 3バイトずつ読んでもint配列にはちゃんと入らないような・・・

jimihenn
質問者

お礼

ありがとうございます。 確かにint型なのできちんと表示されませんでした。 ちなみに3バイトづつ配列に入れていくことはfreadをつかってできますでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • HogePiyo
  • ベストアンサー率57% (24/42)
回答No.2

> for(i=0;i>=9;i++){ for( i = 0; i <= 9; i++ ){ それと、 > gets[a]; gets(a); ですよね?

jimihenn
質問者

お礼

ありがとうございます。(恥。。。)

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

> for(i=0;i>=9;i++){       ~~~~ 煮詰まったら一腹して頭をスッキリさせるのが良いかと。

jimihenn
質問者

お礼

ありがとうございます。(恥。。。)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • fread処理がうまくいかない!!

    バイナリエディタでfwriteで書き込んだデータは確認できたのですがfread後のデータがきちんと表示されません。 どうしてでしょうか? #include <stdio.h> void main(void) { char i[] = {'a','b'}; char j[2]; FILE *fpbin; fpbin = fopen("data","wb+"); fwrite(&i,sizeof(char),2,fpbin); fpbin = fopen("data","rb"); fread(&j,sizeof(char),2,fpbin); printf("j = %c\n", j[0]); fclose(fpbin); }

  • fread(),fwrite()等について

    私は現在、C言語のストリームというところを勉強中で、その中でfopen()やfread(),fwrite()といった関数の使い方の例が参考書に書いてあるのですが、結果が上手く表示されず困っています。次にプログラムの説明と、ソースを載せています。 <説明> 10個の要素を持つ配列を浮動小数点数で埋め、それらをファイルに書き込み再び読み込みます。このプログラムは配列の要素を1つずつ書き込みます。 #include <stdio.h> #include <stdlib.h> double d[10] = { 10.2, 5.3, 7.91, 1.23, 7.7, 6.4, 89.12, 6.43, 5.55, 2.5 }; int main(void) { FILE *fp; int i; if((fp = fopen("myfile", "wb")) == NULL){ printf("ファイルを開くことが出来ません\n"); exit(1); } if(fwrite(d, sizeof d, 1, fp) != 1){ printf("書き込みエラー\n"); exit(1); } fclose(fp); if((fp = fopen("myfile", "rb")) == NULL){ printf("ファイルを開くことが出来ません\n"); exit(1); } for(i = 0; i < 10; i++) d[i] = -1.0; if(fread(d, sizeof d, 1, fp) != 1){ printf("読み込みエラー\n"); exit(1); } fclose(fp); for(i = 0; i < 10; i++) printf("%f\n", d[i]); return 0; } これを実行後、myfileをテキスト形式で開くと ffffff$@333333@、p= ラ」@ョG痙ョ・ヘフフフフフ@囮劔劔@H痙ョGV@ク・Qク@333333@ @ と文字化けして表示されてしまいます。 プログラミング自体勉強するのは今回が初めてで、何がダメなのか見当が付きません。 実行時にエラーが出るわけでもありません。 長くなりましたが、解決策がお分かりの方よろしくお願いします。

  • 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); とすると正常に動作します。 どうぞよろしくお願い致します。

  • fread関数でわかりません。

    fread関数で次のようにソースを記述しました。 FILE *fp; char c[10]; int i; fp = fopen ("./aaa.txt", "rb"); fread(c, sizeof(char)-1, 10, fp); for(i = 0; i < 10; i++) printf("%02x ", *(c+i)); fclose(fp); return 0; aaa.txtの中には 0x1~0xAの10個の数字が記入されています。 cをint 型にすると正常に読み込めるのですが、char型だと 01 00 00 00 02 00 00 00 03 00 となってしまい、正常に読み込めません。 どうも、int型で読み込み、さらに引数 cにはchar *でキャストして渡しているように見受けられます。 Q1 どのようにしたら、char型で 10個一度に読み込めるようになるのでしょうか? Q2 int型(32bit)なら、一度に4文字読み込むと思いますが、何故一文字ずつ読み込むことになるのでしょうか? //getc で一文字ずつ読み込めば済む話ですが、気になり質問いたしました。

  • fread

    freadで、a.txtの内容を画面出力するものです。 コピーした結果、 実際のテキストにある、 !  が書き込まれませんでした。 どこが、間違っているか教えてください。 FILE *fp; char str[20];   fp=fopen("a.txt","rb");   while(!feof(fp)){      fread(&str,(sizeof(str)-1),1,fp);      if(feof(fp))            break;      printf("%s",str); }      return 0; }

  • 添削おねがいします

    初心者ですいませんが添削お願いできますでしょうか? jpegのファイルをバイナリとして表示したいのですができません。 以下のプログラムではどこがだめなんですか? #include<stdio.h> main() { int a[100],i; FILE *fp; fp=fopen("test.jpg","rb"); for(i=1;i<=100;i++){ fscanf(fp,"%x",&a[i]); printf("%x",a[i]); } fclose(fp); }

  • fopen関数について

    ----------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; char filename[80],ss[256]; printf("ファイル名="); gets(filename); if((fp=fopen(filename,"r"))==NULL){ printf("ファイルをオープンできません.\n"); exit(1); } while(fgets(ss,256,fp)!=NULL){ printf("%s",ss); } puts(""); fclose(fp); return 0; } ----------------------------------------- 初心者な内容の質問ですいません。 以上のプログラムでまず、「gets(filename);」により、「filename[80]」の配列に「aaa.txt」という文字列を格納し、そのファイルをfopenで読もう込もうとしています。 そこで、 if((fp=fopen(filename,"r"))==NULL) の部分に疑問があるのですが、「filename」という配列名だけで中身の「aaa.txt」と何故認識できるのでしょうか? 配列名ということで、先頭アドレスのみの情報しかないと思いました。 教えていただければ嬉しいです。

  • fread

    fread関数を使用し、下記のように 同じファイルに上書きしているのですが。。。。 freadで取得したデータの全角コロンを半角コロンに置き換える。 その後、全角空白を半角空白におきかえる。 そのおきかえたデータを同じファイルの上書きする。 どうもコロン(:)のところがうまく書き変えられていません。。。。 おきかえた後に、print文で出力すると置き換えられているのですが、、、 この現象がわかる方教えていただけませんか?? $body=fread(fopen($fileName, "r"),filesize($fileName)); $txt=str_replace(":", ":",$body); $txt=mb_convert_kana($txt, "s","SJIS"); $fp = fopen($fileName, "w"); chmod($fileName,0777); flock($fp, LOCK_EX); fputs ($fp, $txt); flock($fp, LOCK_UN); fclose($fp);

    • ベストアンサー
    • PHP
  • Cで出力したバイナリをPythonから読みたい

    C言語でバイナリファイルに出力した配列データを、Pythonで使えるように読み込みたいです。 具体的な状況は以下の通りです。 ①以下のCプログラムを実行してdata.binを作った ``` #include <stdio.h> #include <complex.h> int main(){ int N = 256; double complex a[N]; FILE *fp; for(int i=0; i<N; i++){ /* a[N]に値を代入 */ } fp = fopen("data.bin", "rb"); fwrite(a, sizeof(a), 1, fp); fclose(fp); return 0; } ``` ②Pythonからこのdata.binファイルにアクセスして複素数の配列を得たい、が良い方法がわからない という感じになります。 現状やりかたがわからないので、一旦Cでバイナリファイルをfreadで読み込んでからfprintf等で10進数表記のテキストデータとしてファイル出力して、それをPythonから普通に文字として読み込んでから数値に変換して処理しています。 一回中間ファイルが挟まるので処理が面倒です。Pythonから直接バイナリが読めれば便利かと思い質問させていただきました。

  • fread関数および動的なメモリ確保について

    こんにちは。 ファイルオープンし、fread関数にて1バイトずつ1024個をPktBuf配列へ格納し、sendto(winsock関数でUDPソケットの関数です)で1024Byteずつ送信しています。 #define DATA 1024 FILE *fp; char PktBuf[1024] fp = fopen(SEND_FILE_NAME,"rb+"); while((n = fread(PktBuf,1,DATA,fp)) != 0) {   sendto } fread(PktBuf,1,DATA,fp)の第2引数で、1と指定しているのですが・・・HPを参考にしているとsizeof(int)やsizeof(char)などが明記されている場合があるのですが、これは移植性を気にする場合に必要なことなのでしょうか? もし、第2引数のところを1から2へ変更した場合、2Byte×1024個=2048Byteとなり、配列[1024]に格納できないことを意味するのでしょうか? 最後に、fread関数およびmallocまたはcalloc関数を用いた、動的なメモリ確保について勉強しているのですが、記述方法がわからない状態です・・・現在の記述方法で問題はないのですが、動的なメモリ確保をすることが定説?と書かれていましたので、そちらも知りたいと思っています。 よろしくお願いします。