popen の応用例です.popen により gnuplot をプロセス中で呼び出し,入力されたデータを画像化,指定したファイルへ保存します.
この例題を実行すると,引数により指定されたデータファイルを gnuplot によりグラフ化し,出力ファイル(.png or .gif or .jpg or .eps)が指定されているとその画像形式に合わせて保存を行います.
#include <stdio.h> //----------------------------------------------------------------- void usage(char* cmd); void gnu_output(char* in_file,char* out_file); //----------------------------------------------------------------- int main(int argc,char* argv[]) { int i; char *in_file=NULL,*out_file=NULL; // read argument for(i=1;i<argc;i++){ if(argv[i][0] == '-'){ switch(argv[i][1]){ case 'o': i++; if(argv[i] == NULL){ fprintf(stderr,"Output file not specified.\n"); usage(argv[0]); return 0; } out_file = argv[i]; break; default: fprintf(stderr,"Unknown option '%c'\n",argv[i][1]); usage(argv[0]); return 0; } } else { in_file = argv[i]; } } if(in_file == NULL){ usage(argv[0]); return 0; } gnu_output(in_file,out_file); return 0; } void usage(char* cmd) { printf("usage: %s in_file [option]\n",cmd); printf("[option]:\n"); printf(" -o out_file: specify output file[.png, .gif, .jpg, .eps]\n"); } char* getext(char* out_file) { int i; static char ext[10]; for(i=strlen(out_file)-1;i>=0;i--){ if(out_file[i]=='.') break; } if(i==-1) return NULL; strcpy(ext,out_file+i+1); return ext; } void gnu_output(char* in_file,char* out_file) { FILE* gfp = popen("gnuplot","w"); char* ext = NULL; if(out_file != NULL){ ext = getext(out_file); if(ext == NULL){ fprintf(stderr,"please specify file type:\n"); fprintf(stderr," supported type -> .png, .gif, .jpg, .eps\n"); fclose(gfp); return; } if(!strcmp(ext,"png")) fprintf(gfp,"set term png\n"); else if(!strcmp(ext,"gif")) fprintf(gfp,"set term gif\n"); else if(!strcmp(ext,"jpg")) fprintf(gfp,"set term jpeg\n"); else if(!strcmp(ext,"eps")) fprintf(gfp,"set term postscript color\n"); else { fprintf(stderr,"%s: not supported.\n",ext); fclose(gfp); return; } fprintf(gfp,"set output \"%s\"\n",out_file); } fprintf(gfp,"plot \"%s\" with lines\n",in_file); fflush(gfp); if(out_file == NULL){ printf("Hit return to finish gnuplot: "); getchar(); } pclose(gfp); } |
Gami[265]% ./gnugraph.exe usage: ./gnugraph in_file [option] [option]: -o out_file: specify output file[.png, .gif, .jpg, .eps] Gami[266]% |