プログラムは汚かったけど、達成感があってちょっと嬉しいです。
Cランクを解いたら、はまってしまいました。
アルゴリズムは頭の体操になりました。
これで、スキルは全部クリアしました。
JSONの処理は、picojsonを使っていましたが、いろいろ悩むことがあり、janssonに変更中です。
janssonは、APIのドキュメントがあるのが良いです。
■ヘッダ
#include <jansson.h>
■ライブラリ
jansson.lib
■ファイルを開く
json_t *result = json_load_file("json.db", 0, &error);
if (result == NULL) {
fputs(error.text, stderr);
return 0;
}
■オブジェクトを開く
json_t *JO1 = json_object_get(result, "roots");
if (JO1 == NULL) {
printf("JO1 is NULL\n");
return 0;
}
■オブジェクトの確認
//オブジェクトの判定test
if (json_is_null(JO2) == 1){
printf("NULL\n");
}
if (json_is_object(JO2) == 1){
printf("object\n");
}
if (json_is_integer(JO2) == 1){
printf("integer\n");
}
if (json_is_array(JO2) == 1){
printf("array\n");
}
if (json_is_string(JO2) == 1){
printf("string\n");
}
■Arrayの値の読み出し
json_t *JO3;
JO3 = json_object_get(JO2, "children");
if (JO3 == NULL) {
printf("JO3 is NULL\n");
return 0;;
}
json_t *JO4;
json_array_foreach(JO3, i, JO4) {
printf("%s/%s: %s\n",
json_string_value(json_object_get(JO4, "name")),
json_string_value(json_object_get(JO4, "url")));
}
■オブジェクトの一覧をループ
keyに名前が入り、valueが新しいオブジェクト
json_t *value;
const char *key;
json_object_foreach(JObj,key,value){
printf("key:%s\n",key);
}
JSONのデータを扱うことがあり、調べました。
JSONについては、ここに書いています。
http://www.json.org/json-ja.html
C++に処理するにあたり、ヘッダファイルだけで扱えるとのことで、調べてみました。
ライブラリは動作させるまでが大変だっりします。
ここから、picojson.hをダウンロードします。
https://github.com/kazuho/picojson
このようなツールが作れることに尊敬します。
■使い方
色々なサイトを参考にさせてもらいました。
// 変数
stringstream ss;
ifstream f;
unsigned int i;
// Jsonファイルの読み込み
f.open("Books", ios::binary);
if (!f.is_open()){
return 1;
}
ss << f.rdbuf();
f.close();
// Parse Json data
value v;
ss >> v;
string err = get_last_error();
if(!err.empty()) {
cerr << err << endl;
return -1;
}
■オブジェクトの読み込み
object &o = v.get<object>();
rootsを読む例
object o = v.get<object>()["roots"].get<object>();
■オブジェクトの抽出
object o = v.get<object>()["roots"].get<object>();
for (object::const_iterator it = o.begin(); it != o.end(); it++) {
char buf[4096];
sprintf_s(buf, "%s", it->first.c_str());
MessageBoxA(NULL,buf,"first",MB_OK);
}
it-firstは文字列
it-secondは値
文字列への変換には、to_str()を使用
c_str()で、stringをcharにします。
it-second.to_str().c_str()
■Arrayの読み込み
barの下にchildがある例
object& o2 = o["bar"].get<object>();
array& aAry = o2["child"].get<array>();
for (i = 0; i < aAry.size(); i++){
object& o3 = aAry[i].get<object>();
strcpy(buf,(char *)o3["name"].get<string>().c_str());
}
■型の確認例
型の確認は、getの代わりにisを使います。
//バッファの型を確認
if (o[buf].is<string>() == TRUE){
}else if (o[buf].is<array>() == TRUE){
}else if (o[buf].is<object>() == TRUE){
まだ、勉強中なのでここまでです。
HPDFでの画像関係のメモです。
HPDF_Doc pdf;
HPDF_Page page = HPDF_GetCurrentPage (pdf);
//PDFやpageは、なんやかんやする。
HPDF_Image image;
//png画像のをimageに読み込む、filenameは、ファイル名
image = HPDF_LoadPngImageFromFile (pdf, filename);
//横幅を取得
int GetWSize = HPDF_Image_GetWidth(image);
//縦幅を取得
int GetHSize = HPDF_Image_GetHeight(image);
//PDFに画像を書き込み
HPDF_Page_DrawImage (page, image, x, y,横幅,縦幅);
Rubyで、ロードしていないWindowsのレジストリファイルを確認するソースです。これなら、Linuxからでも動作できます。
入手先
Volatile Minds: Reading offline registry hives in pure ruby