popen の応用例(gnuplot による画像化,保存)

popen の応用例です.popen により gnuplot をプロセス中で呼び出し,入力されたデータを画像化,指定したファイルへ保存します.

この例題を実行すると,引数により指定されたデータファイルを gnuplot によりグラフ化し,出力ファイル(.png or .gif or .jpg or .eps)が指定されているとその画像形式に合わせて保存を行います.

popen の応用例(gnuplot による画像化,保存) (list_79.c)
#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);
}

usage
Gami[265]% ./gnugraph.exe
usage: ./gnugraph in_file [option]
[option]:
  -o out_file: specify output file[.png, .gif, .jpg, .eps]
Gami[266]%
inserted by FC2 system