ユーザバッファを使用した場合としなかった場合の消費時間の差とユーザバッファの役割

このQ&Aのポイント
  • ユーザバッファを使用すると、プログラムの消費時間が短縮されることがわかりました。
  • 特にサイズが小さい場合には、ユーザバッファを使用することでより効果的にプログラムの高速化が実現されます。
  • ユーザバッファは、ディスク上のデータとメモリ上のデータを同期させる役割を持ちます。
回答を見る
  • ベストアンサー

ユーザバッファを使用した場合としなかった場合では何が違うのか

以下のプログラムのサイズを変えて消費時間を測定しました。 ユーザバッファを使用した場合としなかった場合では(特にサイズが小さい場合)消費時間に差が出たのですが何故でしょうか? プログラムの高速化に対してのユーザバッファの役割を教えていただきたいです。 よろしくお願いします。 測定結果 W_BYTE(サイズ)___ユーザバッファ使用(秒)___ユーザバッファ使用なし(秒) 10_______________0:02.75_____________________2:54.40 100______________0:01.55_____________________0:18.75 1000_____________0:01.40_____________________0:03.11 10000____________0:01.27_____________________0:01.33 100000___________0:01.12_____________________0:01.13 1000000__________0:01.11_____________________0:01.11 3000000__________0:01.10_____________________0:01.10 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/time.h> #include <unistd.h> typedef unsigned char UCHAR; #define DIM1 1000 #define DIM2 1000 #define DIM3 3 #define MAX_REPEAT 100 //出力繰り返し回数 void write_ppm_cip(UCHAR [][DIM2][DIM3],char *,int ,int ); UCHAR org[DIM1][DIM2][DIM3]; int main(void) { int i; int dim1,dim2,dim3; /***** 配列の初期化 *****/ for(dim1=0;dim1<DIM1;dim1++) for(dim2=0;dim2<DIM2;dim2++) for(dim3=0;dim3<DIM3;dim3++) org[dim1][dim2][dim3]=(UCHAR)((dim1*200+dim2*dim2+dim3*dim3)%256); for(i=0;i<MAX_REPEAT;i++) { write_ppm_cip(org,"/tmp/img.ppm",DIM1,DIM2); // sleep(1); /* 一定時間待つ */ //system("/bin/sync"); /* ディスク上のデータをメモリと同期 */ } return 0; } /* 一度に書き込むサイズ(バイト) */ //#define W_BYTE DIM1*DIM2*DIM3 #define W_BYTE 10 /* CIP形式の画像データよりPPMファイル作成 */ void write_ppm_cip(UCHAR data_buf[][DIM2][DIM3],char *fname,int width,int height) { FILE *fp; /* ファイルを開く */ if((fp = fopen(fname, "wb")) == NULL) { fprintf(stderr, "file(%s) can't open\n", fname) ; exit(1) ; } setvbuf(fp,NULL,_IONBF,0); /* ユーザバッファを使用しない場合,有効にする */ fprintf(fp, "P6\n") ; /* カラー画像かつバイナリーデータの記号 */ fprintf(fp, "%d %d\n", width, height) ; /* 画像の幅(列数)と高さ(行数) */ fprintf(fp, "255\n") ; /* 最大値 */ { /* 画像データをrepeat(+1)個に分割して書き込み */ int i; int repeat=(DIM1*DIM2*DIM3)/(W_BYTE); /* 分割数 */ int rest=DIM1*DIM2*DIM3-repeat*(W_BYTE); /* 余りデータ量 */ UCHAR *pt=(UCHAR *)&data_buf[0][0][0]; /* 書き込むデータの位置を持つポイ ンタ */ for(i=0;i<repeat;i++) { fwrite(pt, sizeof(UCHAR), W_BYTE, fp); pt += W_BYTE; } if(rest > 0) fwrite(pt, sizeof(UCHAR), rest, fp); } fclose(fp); /* ファイルを閉じる.fflush()と同じ効果がある. */ }

noname#61460
noname#61460

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

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

fwrite関数は、何も指定しないと一度バッファ(メモリ)に貯めて、バッファが一杯になったらファイルを書き出します。 これは、メモリに比べて低速なハードディスクにアクセスする回数を減らすためにバッファリングしているわけです。 アクセス回数が増えるとどういう問題があるかというと、ハードディスクにアクセスしている間、プログラムは低速な処理が終わるのを待たされることになります。例えばアクセスで10ms待たされるとすると、10バイトx100回で1000バイトを書き出した場合1秒かかります。 これが100バイトx10回だと0.1秒しか必要ありません。 ですので、setvbufでバッファを無効にするとfwriteの毎にファイルを書き出すので小さいサイズほど遅くなります。

noname#61460
質問者

お礼

大変参考になりました。ありがとうございます。

関連するQ&A

  • 式を変更して画像を作りたいです

    以下のプログラムはカラー画像を作成し、MAX_REPEAT回コピーした後、PPMファイルとして出力するものです。 画像作成部分の式を変更し、画像を作ろうと思いますが、アイディアがあれば参考にしたいので教えてください。 簡単でけっこうですから是非お願いします。 gcc -Wall -O2 -DCIP ファイル名でコンパイルします。 PPMファイルはdisplay tmp.ppmで表示します。 convert tmp.ppm tmp.jpgでjpg形式に変換できます。 #include <stdio.h> #include <stdlib.h> #include <math.h> //mathライブラリを利用する場合はコンパイル時に -lm #define MAX_REPEAT 1 //コピー繰り返し回数 #define SIZE 500 //画像サイズ(行=列) #ifdef CSQ #define DIM1 3 #define DIM2 SIZE #define DIM3 SIZE #endif #ifdef CIP #define DIM1 SIZE #define DIM2 SIZE #define DIM3 3 #endif typedef unsigned char UCHAR; void write_ppm_csq(UCHAR [][DIM2][DIM3],char *,int ,int); void write_ppm_cip(UCHAR [][DIM2][DIM3],char *,int ,int); void error1(char *); /* 画像のコピー */ void copy3dimg(UCHAR res[][DIM2][DIM3],UCHAR org[][DIM2][DIM3],int dim1,int dim2,int dim3) { int i,j,k; for(i=0;i<dim1;i++) for(j=0;j<dim2;j++) for(k=0;k<dim3;k++) res[i][j][k]=org[i][j][k]; } int main(void) { int repeat; UCHAR org[DIM1][DIM2][DIM3]; /* 作成画像 */ UCHAR res[DIM1][DIM2][DIM3]; /* コピー先画像 */ /* 画像の作成 */ { int i,j,k; for(i=0;i<DIM1;i++) for(j=0;j<DIM2;j++) for(k=0;k<DIM3;k++) org[i][j][k]=(UCHAR)((i*j+10*j+k*k)%256); } /* 画像のコピー */ for(repeat=0;repeat<MAX_REPEAT;repeat++) copy3dimg(res,org,DIM1,DIM2,DIM3); /* ファイルへの出力 */ #ifdef CSQ write_ppm_csq(res,"./tmp.ppm",DIM3,DIM2); #endif #ifdef CIP write_ppm_cip(res,"./tmp.ppm",DIM2,DIM1); #endif return 0; } /* ファイルへの出力(CSQ) */ void write_ppm_csq(UCHAR data_buf[][DIM2][DIM3],char *fname,int width,int height) { FILE *fp; int m, n; if((fp = fopen(fname, "wb")) == NULL) { fprintf(stderr, "file(%s) can't open\n", fname) ; exit(1) ; } fprintf(fp, "P6\n") ; /* カラー画像かつバイナリーデータの記号 */ fprintf(fp, "%d %d\n", width, height) ; /* 画像の幅(列数)と高さ(行数) */ fprintf(fp, "255\n") ; /* 最大値 */ for(m=0;m<height;m++) for(n=0;n<width;n++) { fwrite(&data_buf[0][m][n], sizeof(UCHAR), 1, fp); fwrite(&data_buf[1][m][n], sizeof(UCHAR), 1, fp); fwrite(&data_buf[2][m][n], sizeof(UCHAR), 1, fp); } fclose(fp) ; } /* ファイルへの出力(CIP) */ void write_ppm_cip(UCHAR data_buf[][DIM2][DIM3],char *fname,int width,int height) { FILE *fp; if((fp = fopen(fname, "wb")) == NULL) { fprintf(stderr, "file(%s) can't open\n", fname) ; exit(1) ; } fprintf(fp, "P6\n") ; /* カラー画像かつバイナリーデータの記号 */ fprintf(fp, "%d %d\n", width, height) ; /* 画像の幅(列数)と高さ(行数) */ fprintf(fp, "255\n") ; /* 最大値 */ fwrite(&data_buf[0][0][0], sizeof(UCHAR), width*height*3, fp); fclose(fp) ; } /* エラー処理 */ void error1(char *message) { printf("%s\n",message); exit(1); }

  • なぜCSQとCIP形式ではコピーの時間が違うのか?

    以下のプログラムは値を3倍し、また画像サイズを変えてコピーする時間を測定するというものです。 測定方法はgcc -Wall -o2 -DCSQ(DCIP) ファイル名でコンパイルし、time a.outで消費時間を測定しました。 画像サイズは10,20,50,100,200,500,1000,2000,5000,10000と変えていきました。 データ形式をCSQ(Channel Sequential)とCIP(Channel Interleaved)のそれぞれについて実行してみたのですが、 なぜ実行結果に違いがでたのか解りません。ネットで調べてみましたが、見つかりませんでした。 キャッシュ(書き換え)やスワップ領域などが関係しているのでしょうか?また他にも疑問がありますので回答してくだされば幸いです。 (1)CSQとCIP形式ではなぜ違いが出るのか? (2)ループの順番を最も内側(k)のfor文を一番外側に移動(k,i,j)した場合はなぜ違いが出るのか? (3)ポインタを利用したコピーではなぜ違いが出るのか? #include <stdio.h> #include <stdlib.h> #include <math.h> //mathライブラリを利用する場合はコンパイル時に -lm #define MAX_REPEAT 1000 //コピー繰り返し回数 #define SIZE 500 //画像サイズ(行=列) #ifdef CSQ #define DIM1 3 #define DIM2 SIZE #define DIM3 SIZE #endif #ifdef CIP #define DIM1 SIZE #define DIM2 SIZE #define DIM3 3 #endif typedef unsigned char UCHAR; void write_ppm_csq(UCHAR [][DIM2][DIM3],char *,int ,int); void write_ppm_cip(UCHAR [][DIM2][DIM3],char *,int ,int); void error1(char *); /* 画像のコピー */ void copy3dimg(UCHAR res[][DIM2][DIM3],UCHAR org[][DIM2][DIM3],int dim1,int dim2,int dim3) { int i,j,k; for(i=0;i<dim1;i++) for(j=0;j<dim2;j++) for(k=0;k<dim3;k++) res[i][j][k]=org[i][j][k]*3; } int main(void) { int repeat; UCHAR org[DIM1][DIM2][DIM3]; /* 作成画像 */ UCHAR res[DIM1][DIM2][DIM3]; /* コピー先画像 */ /* 画像の作成 */ { int i,j,k; for(i=0;i<DIM1;i++) for(j=0;j<DIM2;j++) for(k=0;k<DIM3;k++) org[i][j][k]=(UCHAR)((i*j+10*j+k*k)%256); } /* 画像のコピー */ for(repeat=0;repeat<MAX_REPEAT;repeat++) copy3dimg(res,org,DIM1,DIM2,DIM3); /* ファイルへの出力 */ #ifdef CSQ write_ppm_csq(res,"./tmp.ppm",DIM3,DIM2); #endif #ifdef CIP write_ppm_cip(res,"./tmp.ppm",DIM2,DIM1); #endif return 0; } /* ファイルへの出力(CSQ) */ void write_ppm_csq(UCHAR data_buf[][DIM2][DIM3],char *fname,int width,int height) { FILE *fp; int m, n; if((fp = fopen(fname, "wb")) == NULL) { fprintf(stderr, "file(%s) can't open\n", fname) ; exit(1) ; } fprintf(fp, "P6\n") ; /* カラー画像かつバイナリーデータの記号 */ fprintf(fp, "%d %d\n", width, height) ; /* 画像の幅(列数)と高さ(行数) */ fprintf(fp, "255\n") ; /* 最大値 */ for(m=0;m<height;m++) for(n=0;n<width;n++) { fwrite(&data_buf[0][m][n], sizeof(UCHAR), 1, fp); fwrite(&data_buf[1][m][n], sizeof(UCHAR), 1, fp); fwrite(&data_buf[2][m][n], sizeof(UCHAR), 1, fp); } fclose(fp) ; } /* ファイルへの出力(CIP) */ void write_ppm_cip(UCHAR data_buf[][DIM2][DIM3],char *fname,int width,int height) { FILE *fp; if((fp = fopen(fname, "wb")) == NULL) { fprintf(stderr, "file(%s) can't open\n", fname) ; exit(1) ; } fprintf(fp, "P6\n") ; /* カラー画像かつバイナリーデータの記号 */ fprintf(fp, "%d %d\n", width, height) ; /* 画像の幅(列数)と高さ(行数) */ fprintf(fp, "255\n") ; /* 最大値 */ fwrite(&data_buf[0][0][0], sizeof(UCHAR), width*height*3, fp); fclose(fp) ; } /* エラー処理 */ void error1(char *message) { printf("%s\n",message); exit(1); } /***ポインタ利用コピーの場合***/ /* 画像のコピー */ void copy3dimg_point(UCHAR res[][DIM2][DIM3],UCHAR org[][DIM2][DIM3],int dim1,int dim2,int dim3) { int i; int imax=dim1 * dim2 * dim3; UCHAR *pres=&res[0][0][0]; UCHAR *porg=&org[0][0][0]; for(i=0;i<imax;i++)  *pres++ = *porg++; } /* 画像のコピー */ for(repeat=0;repeat<MAX_REPEAT;repeat++) copy3dimg_point(res,org,DIM1,DIM2,DIM3);

  • ppmについて

    縦120横160のppm方式の画像sample01.ppmを改めてout.ppmとして出力するプログラム、 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef unsigned char uchar; typedef struct _rgb_ { uchar r, g, b; } RGB; #define WIDTH 160 #define HEIGHT 120 int main(int argc, char **argv) { char s[16]; int i, j; RGB image[HEIGHT][WIDTH]; FILE *fp; fp = fopen("sample01.ppm", "r"); fgets(s, 16, fp); fgets(s, 16, fp); fgets(s, 16, fp); for(j = 0; j < HEIGHT; j++){ for(i = 0; i < WIDTH; i++){ image[j][i].r = (uchar)getc(fp); image[j][i].g = (uchar)getc(fp); image[j][i].b = (uchar)getc(fp); } } fclose(fp); fp = fopen("out.ppm", "w"); fprintf(fp, "P6\n"); fprintf(fp, "%d %d\n", WIDTH, HEIGHT); fprintf(fp, "255\n"); for(j = 0; j < HEIGHT; j++){ for(i = 0; i < WIDTH; i++){ (void)putc(image[j][i].r, fp); (void)putc(image[j][i].g, fp); (void)putc(image[j][i].b, fp); } } fclose(fp); return(EXIT_SUCCESS); } を学校のPCでコンパイルし、実行した時は普通に表示されたのですが、いざ家に持ち帰り、コンパイルし、実行したところ、画像が最初の方で途中できれてしまいます。 学校のコンパイラーはよくわからないのですが、 gcc xx.c のコマンドでコンパイルします。unix 自宅のPCはWINDOWS XPで、コンパイラはborland を使っています 。 bcc32 xx.c とコマンドするやつです。 どうすれば正常に表示されるのでしょうか、助けてください。

  • バッファオーバーランの危険性検出について

    下に示すmsg_file.txtの内容を読み込んで表示するプログラムを使ってバッファオーバーランの危険性を検出するプログラムを作りたいのですが、どのように書き換えたら良いでしょうか。 プログラムソース 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define FILEPATH "msg_file.txt" 6 7 int main(); 8 void vuln(const char* line); 9 void stack_dump(void* ptr, int counts); 10 void hello(); 11 12 int main() 13 { 14 char linebuf[1024]; 15 FILE *fp; 16 long mark1 = 0x11111111; 17 memset(linebuf, 0, sizeof(linebuf)); 18 19 fp = fopen(FILEPATH, "r"); 20 fgets(linebuf, sizeof(linebuf)-1, fp); 21 fclose(fp); 22 23 vuln(linebuf); 24 25 printf("------------- end of main() -------------\n"); 26 } 27 28 void vuln(const char* line) 29 { 30 char msg[20]; 31 long mark2 = 0x22222222; 32 memset(msg, 0, sizeof(msg)); 33 34 strcpy(msg, line); 35 36 stack_dump(&mark2, 13); 37 38 printf("INPUT[%s]\n", msg); 39 } 40 41 void stack_dump(void* ptr, int counts) 42 { 43 int i; 44 unsigned long *ulong_ptr = (unsigned long *)ptr; 45 unsigned char uchar_buf[4]; 46 47 printf("-----------------------------------------\n"); 48 printf(" address | long var | +0 +1 +2 +3 | 0123\n"); 49 printf("-----------------------------------------\n"); 50 for(i=0; i<counts; i++) { 51 printf(" %08x| %08x", &ulong_ptr[i], ulong_ptr[i]); 52 memcpy(uchar_buf, &ulong_ptr[i], sizeof(uchar_buf)); 53 printf(" | %02x %02x %02x %02x", 54 uchar_buf[0], uchar_buf[1], uchar_buf[2], uchar_buf[3]); 55 if(uchar_buf[0]<32 || uchar_buf[0]>126) uchar_buf[0] = '.'; 56 if(uchar_buf[1]<32 || uchar_buf[1]>126) uchar_buf[1] = '.'; 57 if(uchar_buf[2]<32 || uchar_buf[2]>126) uchar_buf[2] = '.'; 58 if(uchar_buf[3]<32 || uchar_buf[3]>126) uchar_buf[3] = '.'; 59 printf(" | %c%c%c%c\n", 60 uchar_buf[0], uchar_buf[1], uchar_buf[2], uchar_buf[3]); 61 } 62 printf("-----------------------------------------\n"); 63 } 64 65 void hello() 66 { 67 printf("+----------+\n"); 68 printf("| HELLO! |\n"); 69 printf("+----------+\n"); 70 exit(0); 71 }

  • ファイル

    c言語初心者です。 どなたか教えていただけませんか? これだとiが定義されないことになってしまいます。 #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; fp=fopen("monai", "w"); if(fp==NULL){ fprintf(stderr,"ファイルのオープンに失敗しました。\n"); exit(0); } int i; for(i=1;i<=30;i++) { if(i<=9){ fprintf(fp," %d ",i); } else if(i%10==0) { fprintf(fp,"%d\n",i); } else { fprintf(fp,"%d ",i); } } fclose(fp); return 0; } ビルドもできません。

  • Cプログラミングの質問なのですが,

    Cプログラミングの質問なのですが, 以下のプログラムで正規乱数を発生させたいのですが,どこがおかしいのでしょうか? fp1のransuuはきちんとtxtで作成されています。 至急お助けください。 #include <stdio.h> #include<stdlib.h> #include<math.h> #define PI 3.141592653589793238 int main (void) { FILE *fp1,*fp2; int i,n; unsigned int x1,x2; double y1,y2; fp1=fopen("ransu.txt","r"); fp2=fopen("seikiransu.txt","w"); for(i=0;i<n;i++) { fscanf(fp1,"%lf",&x1); fscanf(fp1,"%lf",&x2); y1=sqrt(2)*sqrt(-2*log(x1))*cos(2*PI*x2); fprintf(fp2,"%lf\n",y1); } fclose(fp1); fclose(fp2); return 0; }

  • fgets, sscanf, バッファ、ストリーム について

    ファイルからデータを入力するのに、fscanf の代わりに fgets と sscanf を用いようと考えています。 そこで、sscanf に与えるバッファ文字列を、ファイルストリームのように扱う方法は無いものでしょうか。 例えば以下のデータファイルに対して、以下のプログラムをうまく動作させるには、どのようにすればよいでしょうか。 どうぞ、よろしくお願いします。 (データファイル test.dat) n_data 4 1 3 8 4 (プログラム) #include <stdio.h> main() { int i, n_data, *data; char buf[100]; FILE *fp; fp = fopen ( "test.dat", "r" ); fgets(buf, 100, fp); sscanf( buf, "n_data %d\n", &n_data ); data = (int *)malloc( n_data * sizeof(int) ); for( i=0; i<n_data; i++ ){ fgets(buf, 100, fp); sscanf( buf, "%d", &(data[i]) ); } sscanf( buf, "\n" ); close( fp ); printf( "n_data %d\n", n_data ); for( i=0; i<n_data; i++ ) printf( " %d", data[i] ); printf( "\n" ); } ちなみに、2行の fgets(buf, 100, fp); をコメントアウトして、 "sscanf( buf," を "fscanf( fp," に変更するとうまく動作します。

  • テキストファイルの出力について

    今、学校の課題でC言語を使ってプログラムを作っています。 20000個のデータを読み込んで、200個ずつに区切り、別々のテキストファイルで出力するというものです。 最初につくったのは、以下の通りです。 *********************************************** FILE *fp; { int b,i=0; data[0][i]=trend_data[0][i]; data[1][i]=trend_data[1][i]; fp = fopen("D1.txt","w"); for(i=0;i<=199;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); } fclose(fp); fp = fopen("D2.txt","w"); for(i=200;i<=399;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); } fclose(fp); ・・・ ***************************************** これだと20000まで繰り返し記述しなければならずかなり困難だと思いました。そこで、ループを作ろうとしたのですが、テキストファイルをループを使って複数作成する方法がわかりません。 以下のようなプログラムを作ったのですが、テキストファイルが一つしか作られませんでした。 どのように記述すればよいのでしょうか? **************************************** FILE *fp; { int a,i=0; int b=1; int c=199; data[0][i]=trend_data[0][i]; data[1][i]=trend_data[1][i]; start: fp = fopen("D[1+b].txt","w"); for(i=a;i<=c;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); if(i > c) c = c+200; a = a+200; b++; goto start; fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); fclose(fp); } } ****************************************** よろしくお願い致します。

  • 複数テキストファイルを読み込み、複数テキストファイルの出力

    質問は100個のテキストファイル(それぞれ10個のデータを含む)を読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するというプログラムについての質問です。 以下が僕の作ったファイル出力部分のプログラムです。 /************/ void ecg_rr(fp,data_max) FILE *fp; { int b,i=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i=0;i<100;i++) sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0]); fprintf(fp,"%8.8f\n",data[0][2]); fprintf(fp,"%8.8f\n",data[0][4]); fprintf(fp,"%8.8f\n",data[0][6]); fclose(fp); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1]); fprintf(fp,"%8.8f\n",data[0][3]); fprintf(fp,"%8.8f\n",data[0][5]); fprintf(fp,"%8.8f\n",data[0][9]); fclose(fp); } 複数ファイルの読み込み方がわからず、自分のプログラムだと1つのテキストファイルしか読み込めないので、16_4.batを作り、その中身を 16_4 読み込むテキストファイル名1.txt ss[1] 16_4 読み込むテキストファイル名1.txt sk[1] 16_4 読み込むテキストファイル名2.txt ss[2] 16_4 読み込むテキストファイル名2.txt sk[2] ・・・ とやったのですが、うまくいきませんでした。 どうすればよいのでしょうか。

  • 同時にファイル読み込み 書き込み

    現在、ヒストグラムのプログラムを作成しています。 まず0~255の1000個の乱数ファイルdata.txtを読み込み、 ヒストグラムは出来たのですが、 エクセルでグラフを作りたいので、 data1.txtに書き込みたいので、下のソースでやってみましたが、 0~255のカウントが全部0になってしまします。 fp = fopen("data1.txt","w");が無ければ正常に処理されます。 どうか教えてください。よろしくお願いします。 #include <stdio.h> #define BUF 10 #define MAX 256 void count(FILE *fp , int* counter); int main(void) { FILE *fp; fp = fopen("data.txt","r"); fp = fopen("data1.txt","w"); int counter[MAX]; int i; for(i=0 ; i<MAX ; i++) { counter[i] = 0; } count(fp , counter); for(i=0 ; i<MAX ; i++) { printf("%d %d\n" , i, counter[i]); } fclose(fp); return 0; } void count(FILE* p_file , int* counter) { char buf[BUF]; while (fgets(buf , BUF , p_file) != NULL) { int n; sscanf(buf , "%d" , &n); counter[n]++; } }

専門家に質問してみよう