計算機科学のブログ

C - 小さなツール - 1つのことだけをうまくやる - 標準出力, リダイレクト, データの検証

Head First C ―頭とからだで覚えるCの基本David Griffiths(著)、 Dawn Griffiths(著)、 中田 秀基(監修)、 木下 哲也(翻訳)、 O’Reilly Media)の3章(小さなツール - 1つのことだけをうまくやる)、p.115(エクササイズ)の解答を求めてみる。

Makefile

all: a.out
	./a.out

a.out: main.c
	cc main.c

コード

main.c

#include <stdio.h>
#include <stdbool.h>

int main()
{
    float latitude;
    float longitude;
    char info[80];
    int started = false;
    puts("data=[");
    while (scanf("%f,%f,%79[^\n]", &latitude, &longitude, info) == 3)
    {
        if (started)
        {
            puts(",");
        }
        else
        {
            started = true;
        }
        if (latitude < -90 || 90 < latitude)
        {
            printf("invald latitude: %f\n", latitude);
            return 2;
        }
        if (longitude < -180 || 180 < longitude)
        {
            printf("invald longitude: %f\n", longitude);
            return 2;
        }
        printf("{latitude:%f, longitude: %f, info: '%s'}",
               latitude, longitude, info);
    }
    puts("\n]");
}

CSVファイル

gpsdata_err1.csv

42.363400,-71.098465,Speed = 21
42.363327,-71.096588,Speed = 23
90.363327,-71.096588,Speed = 23
42.363255,-71.096710,Speed = 17

gpsdata_err2.csv

42.363400,-71.098465,Speed = 21
42.363327,-180.096588,Speed = 23
42.363255,-71.096710,Speed = 17

JSONファイル

output1.json

cc main.c
./a.out
data=[
{latitude:42.363400, longitude: -71.098465, info: 'Speed = 21'},
{latitude:42.363327, longitude: -71.096588, info: 'Speed = 23'},
invald latitude: 90.363327

output2.json

data=[
{latitude:42.363400, longitude: -71.098465, info: 'Speed = 21'},
invald longitude: -180.096588

入出力結果(Terminal, Zsh)

% make < gpsdata_err1.csv > output1.json
make: *** [all] Error 2
% ./a.out < gpsdata_err2.csv > output2.json
% echo $?
2
%