Skip to content

C言語メモ

C言語からgnuplotを操作する

C言語からgnuplotを操作して、グラフを描きます。


#include <stdio.h>
#include <stdlib.h>

#define GNUPLOT_PATH "/usr/local/bin/gnuplot"

int main(int argc, const char *argv[]) {
	FILE *gp;
	
	gp = popen(GNUPLOT_PATH, "w");
	if (gp == NULL) {
		fprintf(stderr, "%s: No such file.", GNUPLOT_PATH);
		exit(1);
	}
	fprintf(gp, "plot sin(x)\n");
	fflush(gp);

	fprintf(gp, "pause 3\n");
	//sleep(3000);
	//getchar();

	pclose(gp);

	return 0;
}

参考:CのプログラムからGNUPLOTを動かす方法

C言語からgnuplotを操作する(バイナリデータを読み込んで描画)

C言語からgnuplotを操作して、バイナリで書き出したデータを、読み込んでグラフを描きます。

            
#include <stdio.h>
#include <stdlib.h>

#define GNUPLOT_PATH "/usr/local/bin/gnuplot"

int main(int argc, const char *argv[])
{
    int i;
    double data[256];
    FILE *fp, *gp;
                
    for (i = 0; i < 256; i++) {
        data[i] = 2.0 * ((double)rand() / (double)RAND_MAX) - 1.0;
    }
    if ((fp = fopen("data.dat", "w")) == NULL) {
        fprintf(stderr, "Can't open!\n");
        exit(1);
    }
    fwrite(data, sizeof(double), 256, fp);
    fflush(fp);    // バッファフラッシュする
    fclose(fp);
    
    gp = popen(GNUPLOT_PATH, "w");
    if (gp == NULL) {
        exit(1);
    }
                    
    fprintf(gp, "set term pdf\n");
    fprintf(gp, "set output \"data.pdf\"\n");
    fprintf(gp, "plot \"data.dat\" binary array=256 format=\"%%double\" with lines\n");
    fflush(gp);    // ファイルに出力する場合は不要?
                    
    pclose(gp);
                    
    return 0;
}
            
        

ファイルサイズを調べる

開いたファイルのサイズを調べます。


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, const char *argv[]) {
	//size_t file_size;
	fpos_t file_size;
	char ifn[FILENAME_MAX];
	FILE *fp;
	
	/* Input file name */
	if (argc > 1) {
		strcpy(ifn, argv[1]);
	} else {
		printf("Input File Name : ");
		scanf("%s", ifn);
	}
	
	/* File open */
	if ((fp = fopen(ifn, "r")) == NULL) {
		fprintf(stderr, "%s: No such file.", ifn);
		exit(1);
	}
	fseek(fp, 0L, SEEK_END); 
	//file_size = ftell(fp); 
	fgetpos(fp, &file_size); 
	fseek(fp, 0L, SEEK_SET);
	fclose(fp);
	
	fprintf(stdout, "%ld Byte\n", (long)file_size);

	return 0;
}


参考:

PNM形式の画像を出力する

グレースケールとカラーのランダムパターンをPNM形式で出力します。

P1(PBM) アスキー 2値画像
P2(PGM) アスキー グレースケール
P3(PPM) アスキー カラー
P4(PBM) バイナリ 2値画像
P5(PGM) バイナリ グレースケール
P6(PPM) バイナリ カラー

#include <stdio.h>

#define WIDTH  64
#define HEIGHT 64

int main(int argc, char *argv[])
{
	int x, y;
	unsigned char image_buf[HEIGHT][WIDTH][3];
	FILE *fp;

	for (y = 0; y < HEIGHT; y++) {
		for (x = 0; x < WIDTH; x++) {
			image_buf[y][x][0] = rand() % 255; // R
			image_buf[y][x][1] = rand() % 255; // G
			image_buf[y][x][2] = rand() % 255; // B
		}
	}

	/* Grayscale Image - ASCII */
	fp = fopen("ascii.pgm", "wt");
	fprintf(fp, "P2\n%d %d\n%d\n", WIDTH, HEIGHT, 255);
	for (y = 0; y < HEIGHT; y++) {
		for (x = 0; x < WIDTH; x++) {
			fprintf(fp, "%d ", image_buf[y][x][0]);
		}
		fprintf(fp, "\n");
	}
	fclose(fp);

	/* Color Image - Binary */
	fp = fopen("binary.ppm", "w");
	fprintf(fp, "P6\n%d %d\n%d\n", WIDTH, HEIGHT, 255);
	fwrite(image_buf, sizeof(unsigned char), WIDTH * HEIGHT * 3, fp);
	fclose(fp);

	return 0;
}


参考:

小ネタ

●与えられたサイズ以上で最小の2のべき乗となる値を求めます。


#include <math.h>

pow(2.0, ceil(log2((double)N)));

●メモリ確保とエラー処理。


unsigned char *image1, *image2;

image1 = (unsigned char *)malloc(sizeof(unsigned char) * width * height);
image2 = (unsigned char *)malloc(sizeof(unsigned char) * width * height);
if (image1 == NULL || image2 == NULL) {
    fprintf(stderr, "Unable to allocate image buffer.\n");
    exit(1);
}