[C/C++][programming] パスからファイル名を取得する / [programming]INIファイルの保存ディレクトリを取得する

パスからファイル名を取得する

MFCの場合、適当にやるとこんな感じ

filename = path.Mid( path.ReverseFind( '\\' ) + 1 );

もっと正確にやる場合は_splitpath(or _tsplitpath)を使う。

INIファイルの保存ディレクトリを取得する

アプリケーションと同じディレクトリにiniファイルを作成したい場合、GetCurrentDirectory()を使うとカレントディレクトリが変更されたときにまずいことになってしまう。ので、実行中のアプリケーションと同じディレクトリを取得して、そこにINIファイルを作成したい。

実行されている自分のプログラムのフルパス名を取得する

を参考に作ってみたのが下のコード

CString appdir;
//splitpath用
TCHAR drive[ _MAX_DRIVE ];
TCHAR dir[ _MAX_DIR ];
TCHAR filename[ _MAX_FNAME ];
TCHAR ext[ _MAX_EXT ];
TCHAR path[ MAX_PATH ];

// 実行中のプロセスのフルパス名を取得する
::GetModuleFileName(NULL, path, sizeof path / sizeof path[0] );

// フルパス名を分割する
_tsplitpath( path, drive, dir, filename, ext );
// アプリケーションディレクトリ文字列を作成
_tmakepath( appdir.GetBuffer( MAX_PATH ), drive, dir, "", "" );
appdir.ReleaseBuffer();
return appdir;

GetModuleFileName()の使い方を探していたときに見つけたページ

http://hp.vector.co.jp/authors/VA000092/win32/misc.html

正確なコードで参考になる。

http://www14.plala.or.jp/TMatTMnet/programming/tips.htm

明日から使えるTipsが現在12個。

  1. ファイル選択ダイアログ(複数選択)を表示
  2. フォルダ選択ダイアログを表示
  3. Esc、Enterキーで閉じなくするには
  4. 実行ファイル(自分自身)のフルパス取得
  5. ファイル・フォルダ検索関数
  6. ゴミ箱へ削除する関数
  7. ボタンを有効・無効にする
  8. ポップアップメニューを表示する
  9. UTF-8からShift_JISに変換する関数
  10. ファイルのプロパティダイアログを表示
  11. 特定のアプリケーションが起動中かどうか調べる関数
  12. ファイルサイズ数値を変換する関数

追記: http://home.att.ne.jp/banana/akatsuki/doc/mfc/mfc04/にほぼ同じコードが載ってた。

最終更新時刻: 2008年09月01日

MakeSureDirectoryPathExists関数のバグ / [xyzzy] リージョンをコメントアウト / [todo]本棚の整理 / 地図ビューアを作る講義のテキスト / フリーのメッシュデータ / A9を使ってみた

MakeSureDirectoryPathExists関数のバグ

MSDNより

DirPath で指定されたすべてのディレクトリを作成します。ディレクトリの記述は、ルートから開始します。

この関数は自前で再帰的にディレクトリを作らなくても済むとっても便利な関数ではあるが気をつけなきゃいけないバグがあるらしい。

http://www.mtakahashi.com/old/10975.html

の10970あたり。

MakeSureDirectoryPathExistsで使用不可文字を使ったとき

2004 03/26 20:15 ofen

環境はWin2000、VC6SP5、MFC使用しています。  パス指定したフォルダを同時に作成する関数を調べていて、MakeSureDirectoryPathExists というAPIを見つけました。こちらの過去ログでも少し情報があり、便利そうでしたので 使ってみたところ、気になることがありますので質問します。  ファイル、フォルダに使えない文字を引数に指定したところ、そのフォルダ以外は作成 してしまいます。どういうことかというと、

 C:\Test\one\two\ → C:\Test\one\twoを作成。返り値はTRUE
 C:\Test\one\*<>/\ → C:\Test\oneを作成。返り値はTRUE
 C:\Test\one\*<>/\two → C:\Test\one を作成。返り値はFALSE

といった具合です。今回はどこか一箇所が作成できないときはFALSEが返ってきて、フォルダは 作成してほしくないのですが、そういった場合はCreateDirectry()でひとつづつ作成して いくしかないのでしょうか?(もしくは作成されたフォルダを下の階層から削除していく??)

他に簡単な方法やアイディアがありましたらご教授ください。

2004 03/26 20:17 ofen すみません、書き間違えました。

C:\Test\one\*<>/\ → C:\Test\oneを作成。返り値はTRUE

この場合、返り値はFALSEです。

2004 03/27 13:26 PHOENIX

PHOENIXです。 _tcschr関数か、_tcspbrk関数なりで使用できない文字が存在するか調べてから MakeSureDirectoryPathExists関数を呼び出せばいいかと思いますが。

_tcspbrk

....以下略

リージョンをコメントアウト

http://diary.noasobi.net/0308a.html#diary_030809d

便利。でもそもそもリージョンとかセレクションを使ってなかったので、これを機にこちらも覚えることにした。

といってもそんなに構えるほどのものでもなく、

  • リージョンはC-SPCでマークした行からカーソル行まで
  • セレクションはF6を押した行からスタート

を選択するだけのものだった。かなり大雑把な理解だけど、とりあえずリージョンが使えればよし。

本棚の整理

昔Windowsプログラミングをやろうとして本だけを集めてた愚かしい時期があった。今実際にWindowsプログラミングをかじってみて、多分もう読まないと思う本が結構ある。(しかも結構値段が高い)

それに加えてWeb関係の本も結構並んでるけど今は優先度的に低い。というわけで優先度をつけて並べ替えよう。

地図ビューアを作る講義のテキスト

東京大学情報基盤センター内 計算機プログラミングⅠのテキスト

フリーのメッシュデータ

上の地図ビューアで使うようなメッシュデータがどこかにないものかと調べてみたら、国土数値情報ダウンロードサービスというのを見つけた。

A9を使ってみた

http://a9.com/

ベータテストのとき(多分半年くらい前)に一度使ったときは興味なかったけど、今回正式版を使ってみて驚いた。インターフェースが面白い。検索結果にImage Resultというスクリーンショットがある。

Googleとは違った感じ。インターフェースはJavaScriptバリバリで重たいけど、これはこれでいい。シンプルなのがよければGoogle使うし。

ん、よく見たらサイトのスクリーンショットじゃなくてそのサイトで使ってる画像を並べてるだけっぽい。GoogleのImage検索と同じじゃん。

最終更新時刻: 2008年09月01日

imagehlp.dllとdbghelp.dll

最終更新時刻: 2008年11月20日

Sunbird プロジェクト / SVGについて調査

Sunbird プロジェクト

Sunbird プロジェクト

Mozilla Calendar から独立したプロジェクトらしい。単体のカレンダーが欲しいと思ってたから期待したい。

想定しているユーザは、Mozilla Firefox (または他のブラウザ) を自分のブラウザとして、 Mozilla Thunderbird (または他のメールクライアント) を自分のメールクライアントとして使っており、 Mozilla に基づいたカレンダーアプリケーションを欲しがっているような人です。

なんか昔のNetscape Communicatorみたい。なんでセットにしたがるんだろう。FirefoxやThunderbirdがいいとか悪いとかではなく、なんか依存しあってる印象がある。とはいえ

カレンダー単体に的を絞って、不必要なコンポーネントや chrome を取り除けば、カレンダーアプリケーションの全体的なフットプリントやパフォーマンスに、多少なりとも影響を及ぼせるのではないかと私たちは考えています。

とも書かれてるのでむしろこっちのほうに発展して欲しい。

SVGについて調査

数値データを画像として画面に表示しようと思ってどんな実装が簡単か考えてみた。

  • VCなりVBなり使ってWindowsプログラムで画面に表示。
    • 面倒、時間かかる、汎用性なし
    • 勉強用としては悪くない。無駄にDirectX使ってみても良いし。
  • 数値データからBMPなりJPEGへの書き出しツールを作る。
    • 面倒、つまらん、汎用性はそこそこ。

どっちもいまいちだし何より手間をかけたくない。

というわけでSVGを使ってみるのはどうかと思った。SVGならテキストデータだからperlで組めば多分数十分かからずに形になるだろう。表示はプラグインが面倒見てくれるから楽。

MozillaのSVG部分取り出して画面に表示してみるのも面白そうだけど多分やらない。

最終更新時刻: 2008年08月02日

INIファイルの保存ディレクトリを取得する(2) / PNGけっこういいかも / 危険なコーディング / TCHARはchar? / CStringとマルチバイト / 文字列操作

INIファイルの保存ディレクトリを取得する(2)

http://techtips.belution.com/ja/vc/0027/より

_tsplitpathの引数で必要ないところはNULLにすればいいからfilenameとextは必要なかった。

CString appdir;

//splitpath用
TCHAR drive[ _MAX_DRIVE ];
TCHAR dir[ _MAX_DIR ];
TCHAR path[ MAX_PATH ];

// 実行中のプロセスのフルパス名を取得する
::GetModuleFileName(NULL, path, sizeof path / sizeof path[0] );

// フルパス名を分割する
_tsplitpath( path, drive, dir, NULL, NULL );

// アプリケーションディレクトリ文字列を作成
_tmakepath( appdir.GetBuffer( MAX_PATH ), drive, dir, NULL, NULL );
appdir.ReleaseBuffer();

return appdir;

PNGけっこういいかも

昨日のSVGの調査のメモに関して、libpngを使ってはどうかとツッコミをもらった。

libpngだとjpegとかgifとかと手間とか手順とか一緒かなー、と思ってて気づいたんだけど大事なことを書くのを忘れてた。「数値データ」は座標データのことで、本来の目的では画像にしたいというのはグラフ化したいのではなくて、実際に座標から点なり線を描画して視覚化したかったのである。

ツッコミの方の名前欄はGDだったのでおそらくグラフにすることを考えて、GDとlibpngを使ってはどうかということだと思う(違ったらごめんなさい)。ていうか昨日の書き方(数値データ)だとそう思うのが普通かも。

で、グラフについては考えてなかったんだけど、統計情報も取るのでグラフを出すのはそれはそれでやってみたい。グラフライブラリに関してもGDに限らず他にもありそう。

今かいてて思ったんだけど、座標データから点/線を描画してSVGなどのベクタ画像じゃなくてラスタ画像作るときのフォーマットとしてはjpegは妥当じゃないな。にじんだりするとまずいし。gifについても256色だと線に色とかつけてくとちょっと心許ない。pngなら劣化も無いしlibpngで手軽に扱えそうだし色も十分。アルファチャンネルも利用できるし、レイヤーの概念はあるんだっけ?SVGよりは枯れてるし案外良いのでは・・・。もちろん他にも山ほどラスタ画像フォーマットはあるけど、TIFFとか枯れすぎててつまらないし。WEB方面では性能を活かしきれてないPNGだけどゲームやらこういうときにはとても便利なフォーマットだ。Thanks gdさん。

相変わらず思考そのままメモってるから話がとびとびになってるけどそのまま発行。

危険なコーディング

if( a == 0 )
{
}

こう書くつもりで、下のように書いてしまった。

if( a == 1 );
{
}

VCのワーニングですぐに気づいたけどあやうかった。

TCHARはchar?

TCHARって_UNICODEを宣言してない限りcharだと思ってたんだけどどうもちがうっぽい動作が・・・。

CStringとマルチバイト

CStringについて今までかなり誤解していた。

  • CString::GetLength()は文字数を取得する関数だと思っていたらバイト数を取得する関数だった。
  • CString::GetAt()は1文字を取得する関数だと思っていたら1バイトのcharを返す関数だった。
  • CString::Left()の引数は文字数だと思っていたらバイト数だった。
  • CString::TrimRight()の引数にスペースを指定したら全角スペースのトリミングができると思っていたらできなかった。

うぉい!全然マルチバイト対応してないじゃん!ちなみにこれら1バイト(char)といってもTCHARなので_UNICODE指定すると2バイトになるんだろう。多分。っていっても単位が変わるだけだけど。

マルチバイト対応というより、文字エンコーディングか。マルチバイトに関してはTCHAR使うことで対応しているわけだし。

つまり、CStringはあたりまえのことだけど文字エンコーディングには一切関知しないクラスではないのだと今更ながらに気づいた。

文字列操作

今日は一日文字の比較とかチェックのコードを書いていた。久々にビット演算とかがちょこちょこ。お、ポインタとかビット演算とかだいぶ慣れてきたんじゃないか?という感じでちょっとうれしい。

しかしCで文字列を操作するプログラム、というとよほど気をつけていてもバグが出そうというイメージがある。どっかに綺麗なコードがないかなー。今度PHPのマルチバイト文字列操作関数のコードを見てみよう。確かmbfilterだったけどライセンス関係でライブラリ化するとかしないとかMLで議論されてた気が。

mbfilterで検索していたらこんな記事発見。

http://www.textfield.net/gtext/archives/000004.html

PHP関数のmb_convert_kanaをJavaに移植したサンプルです。mb_系の関数群はC言語で記述されたUnicode対応の非常に賢いコード群で覗くと非常に参考になります。

良いコードに出会えました。

最終更新時刻: 2008年10月26日

installed Windows XP SP2 Platform SDK

最終更新時刻: 2008年07月30日

PearPC - PowerPC Architecture Emulator / [todo] いろいろ

PearPC - PowerPC Architecture Emulator

PearPC

WindowsやLinux上でMac OS Xが走るエミュレータ。

いろいろ

勉強したい。ということで環境を整える。

  • xyzzy用に英語辞書を用意する。
  • cvsを使えるようにして最新のコードを追いかける。
  • MLに入っとく。
  • 本棚の整理。

追いかけるソースはPHPとRubyにしようと思う。

最終更新時刻: 2008年07月26日

世間は三連休らしいですが / @Freed / 配列の拡張サイズ

世間は三連休らしいですが

月9も見ずに会社に居て、しかも午前様。ナチュラルハイになってきますた。

@Freed

ここ三ヶ月ほど使ってないから解約or従量プランに切り替えようと思ったけど、これから外に出る機会がでてきそうなのでこのままにしておくことにする。

配列の拡張サイズ

reallocするときに確保するサイズ。あるいはCArrayのSetSizeの第2引数で指定するnGrowByの値。最適な拡張サイズは無いと思うけど、大体の状況でそこそこのパフォーマンスが出る増やし方を調べる。

ちなみにstd::vectorでは

vectorは領域の拡張が必要なとき、元の領域の2倍のメモリを確保する (実装によっては違うかもしれない)。

http://www.wakhok.ac.jp/~sumi/stl/header/vector.htmlより。

となっているらしい。ちょっと大雑把過ぎる気が・・・。

感覚的にはperlとかPHPの配列みたいに多少無茶してもそれなりのパフォーマンスが出る配列が使いたい。けど多分見てもわかないくらい複雑な実装なんだろうな〜。と思いつつPHPのソースからarrayを検索。

  • Zend/zend_dynamic_array.c
  • ext/standard/array.c

が臭い。と思ったらzend_dynamic_array.cは実質50行程度のソースだった。眠いので今日はここまで。

最終更新時刻: 2008年06月04日

サーバダウン / 動的配列の実装あれこれ / C/C++はconst/enumがいい

サーバダウン

今回は復旧が遅れてしまって、丸2日ほどダウン。いい加減このパソコン、というかHDDが限界かも。

一応熱を冷ましてから起動したら復活したので安心・・・はできないけどとりあえずOK。

今のところWebサービス自体は2台構成で、バックエンドのファイルサーバ(NFS)とフロントエンドのApacheサーバにわかれてるんだけども、フロントエンド側が熱を持ちやすいマシンなのでしょっちゅう落ちる。今回はディスプレイを閉めて木のラックに収めたのが原因。熱が逃げない上に木が保温性を発揮してフリーズ。

バックエンド側はRAID構成+UPSでほぼ常時稼動が可能だからこっち一本にしても良いかも。将来を見越してフロントエンド側をディスクレスマシンにしてもう1台追加しようと思ってたけど最近そんな余裕もないし。

動的配列の実装あれこれ

C言語でint型の動的配列を作るとするとデータ構造は

int* array;     // 配列先頭ポインタ
int  array_cnt; // 配列サイズ
int  array_max; // 配列確保数

こんな感じ。これだと管理しづらいので構造体にしてみたりする。

struct Array{
  int* data;
  int  cnt;
  int  max;
};

これらに要素を追加するときはreallocする。

C++だとまずはclass化してみる。

class Array
{
public:
  int* data;
  int  cnt;
  int  max;
};

必要なメソッドを追加してみる

class Array
{
private:
  int* data;
  int  cnt;
  int  max;
public:
  int  GetSize() const;
  bool SetSize(int);
  int  Get(int) const;
  bool Add(int);
};

飲んでるのでこの辺で。テンプレート化とか実際のAddの方法とかAllocateはmalloc/reallocかnew/deleteかとかCArrayの実装がどうとか次回。(覚えてたら)

C/C++はconst/enumがいい

最終更新時刻: 2008年10月22日

Google Desktop Search / mylab Webサーバ / 旅行予定 / サーバ入れ替え

Google Desktop Search

最近流行っているらしいのでダウンロードしてインストール。最初はGoogle Deskbarのこと?と思ったけど全然違って、ローカルのファイルをGoogleの検索アルゴリズムで検索してくれるソフトだと思う(想像)。

インストールして長い時間かけて作るわけでもなく、すぐに検索していきなり正確な検索結果が出たことに驚き。さすがGoogle。毎度いい意味でこちらの予想を裏切ってくれます。

mylab Webサーバ

先日復旧(というかただリブートしただけ)のHDDはすこぶる調子が悪く、案の定sector errorでまくり。多分ログを書くタイミングごとにエラー出てるんだろう。

旅行予定

来週土曜日(10/23)は九州。11月は松山へ行く予定。

九州は観光してる暇が無いけど、松山へは観光で。

サーバ入れ替え

最終更新時刻: 2008年09月01日

白髪が増えた・・・

今日久しぶりに会った友人に「白髪があるぞ」と言われ、数えてもらったところ10本も!春にはなかったのに!!燃えつき始めてる!?

最終更新時刻: 2008年09月02日

referer spam

今までもたまに来てたんだけど、今回のは大量すぎる。まだ続くようならいやな日記さんのスクリプトで掃除しようかな。

最終更新時刻: 2008年11月12日

[wish][book] Hacker’s Delight

最終更新時刻: 2008年11月04日

福岡空港 / 宮崎空港

福岡空港

福岡空港ではいつも手荷物検査でThinkPadがひっかかってたので、今回は出したら無事OK。名古屋空港ではとめられたことないんだけど。といっても、いつも出すべきなんだけどね。

宮崎空港

宮崎空港は海が近くていいんだけど歩ける距離ではないんだよね。今回も時間が無くて海までいけない・・・。

最終更新時刻: 2008年07月30日

サーバーダウン / [todo]伝言版設置

サーバーダウン

原因不明でLinuxがフリーズ。やばげ。日曜日から丸一日ほどダウン。復旧時刻 10/26 01:15

ついでにapacheの自動起動の設定をしておく

ln -s /usr/local/apache2/bin/apachectl /etc/init.d/apache
update-rc.d apache defaults

iptablesの設定も更新したので改めてセーブ

/etc/init.d/iptables save active

伝言版設置

トップページに一言メッセージを書くイメージ。ただしそのサーバーはCGIが動かせないので別のCGIサーバにスクリプトを設置してトップページからはインラインフレームを使って表示するのがいいかな。とメモしておく。

最終更新時刻: 2008年10月28日

G-XML

SVGで地図データを表現したいと思ってて見つけたのがG-XML。要調査。

最終更新時刻: 2008年10月31日

巨大ファイルを扱えるバイナリエディタ / Stirlingの構造体エディット機能 / [MFC] CListCtrlの仮想リスト

巨大ファイルを扱えるバイナリエディタ

700MBくらいのファイルの中身を確認したくて、普段使ってるStirlingでは多分つらいだろうと思って(試してない)探してみた。

で、見つけたのがFile Mapping対応バイナリエディタ「bz」。700MBのファイルが一瞬で開けて中身を確認できました。すごい。

作者の方のサイト:c.mosのホームページ

ちなみに今回の700MBのファイルは一応テキストファイルなのでNT版UNIX-like toolsに含まれるtailコマンドでも確認。tailの使い方がLinuxのとちょっと違って戸惑ったのでメモ。ファイル末尾から100行を表示したい場合はハイフンに続けて行数を指定する。

tail -100 file.txt

linux(Debian Linux Woody)についてるtailだと

tail -n 100 file.txt

だと思ったんだけど上の渡し方でもいけるのかも?

Stirlingの構造体エディット機能

vectorの紹介ページより

データを構造体とみなし、メンバーを参照しながら直接編集できる「構造体編集」機能

固定長レコードのデータのとき有用。

CListCtrlの仮想リスト

要調査。情報少なめ。

表示はClistCtrlにまかせてデータの管理をアプリケーションでしましょうという機能。リストに表示するデータが量が多いときに使うと効果的。

http://www.codeguru.com/Cpp/controls/listview/advanced/article.php/c4151/

最終更新時刻: 2008年07月30日