2011年9月25日日曜日

基数値を指定し、x 進数の文字列として出力

2進数、8進数、10進数、16進数等の基数値を指定し、与えられた値を x 進数の文字列として出力する例題です。

例題では、4095 = 0xFFF(16進数)のように 0 から 9 の文字列で表現できない部分はアルファベット A から Z で表現していますので、基数の最大値は 36 となります。

実行結果

結果を文字列として取得する例

コンソールからの安全な数値入力

コンソール入力からの文字列を確認し、atoi や atof 関数により安全に数値へと変換する例です。 実行結果

最大値、最小値の計算例

ファイルからデータを読み取り、データの最大値、最小値を計算する例です。

最大/最小値を計算する際、データを読み取る度に値を比較し、比較した値が大きい/小さい場合に値を格納する変数(maxv/minv)が必要となりますが、この変数の初期化には注意が必要です。
読み取るデータの全ての値より大きい/小さい場合には、正しく最大値/最小値が計算されませんので、想定されるデータの値より大きい/小さい値にて初期化する必要があります。
例題では、変数タイプに合わせた最大値/最小値(float.h: DBL_MAX)にて初期化を行なっています。

また、データを比較する際、(a < minv) や (a > maxv) のように直接値を計算すると、ただしく大小の比較が行われない場合があります。
そこで、下記のように差分値が 0 より大きいか、小さいかを調べることにより改善を図っています。

実行結果

関数ポインタを利用した文字列の入出力

関数ポインタを利用した文字列の入出力の例です。

関数ポインタ(int (*func_p)(char **, int *);)により、文字列を入力する関数、出力する関数を交互に呼び出し、文字列の入出力を行なっています。

実行結果

2011年9月24日土曜日

メモリマップドファイルを利用したデータの読み込み、編集、書き出し

メモリマップドファイルを利用し、ファイルからのデータの読み込み、編集、書き出しを行う例です。

メモリにファイルの内容をマッピングする際には、仮想メモリのページサイズ毎にマップされるので、出力されるファイルのサイズもページサイズの整数倍に合わせています(今回の例では、ページサイズは 4kByte)。

以下の例では、

MapFile が存在しない場合に実行: ページサイズの整数倍に合わせたサイズでファイルを作成しデータの出力
MapFile が存在する場合に実行: MapFile の内容を読み込んで編集しデータの出力
という形で MapFile の出力内容が変更されます。

出力されるデータは、"abcd .. xyz" のテキストを実行する度に "zyx ... cba" というように並びを反転させて出力しています。

実行結果

2011年9月23日金曜日

メッセージキューによるプロセス間通信

メッセージキューによるプロセス間通信の例です。

メッセージキューに文字列を格納し、親子プロセス間にて文字列の送受/受信を行なっています。

実行結果

プロセスを起動し結果を文字列として取得 (popen/pclose)

プロセスを起動し結果を文字列として取得する例です。

popen / pclose を利用したプロセスの起動では、"cat makefile | wc" のようなシェル上で利用するパイプによるコマンドを渡すことも可能です。

リダイレクションによる実装例は こちら

実行結果

プロセスを起動し結果を文字列として取得 (fork,pipe,dup,execlp)

プロセスを起動し結果を文字列として取得する例です。

リダイレクションにより子プロセスから出力される文字列を親プロセスへと渡しています。

ping コマンド等、C言語などにて実装が困難な処理を外部コマンドとして呼び出し、その結果にて処理を分岐する用途に使う際に便利になります。

実行結果

環境変数を取得

SHELL に設定されている環境変数を取得し、表示する例です。 実行結果

2011年9月21日水曜日

ホスト名からIPアドレスの取得

ホスト名からIPアドレスを取得する例です。 実行結果

2011年9月20日火曜日

CSV ファイルのデータ内容に合わせて3次元文字配列の動的確保 (char 型)

CSV ファイルのデータ内容に合わせて3次元文字配列を動的に確保し、表示する例題です。

char 型のデータを動的に確保し、確保した文字列の表示、行と列を入れ替えて文字列の表示を行なっています。

実行結果

2011年9月19日月曜日

CSV ファイルのデータ内容に合わせて2次元配列の動的確保 (int, double 型)

CSV ファイルのデータ内容に合わせて2次元配列を動的に確保し、表示する例題です。

前回 の例では、int 型のデータ構造にしか対応していませんでしたが、今回の例では double 、指数表示(ex. 5.3766714e-01)型のデータにも対応し、データの表示、編集を行なっています。

指数表示型のデータは実質 double 型で扱って良いもので、DispData で表示される形式が異なるのみとなります。

実行結果

html2txt: HTML ファイルからテキスト文章の抽出

html2txt: HTML ファイルからテキスト文章を抽出する例です。

html2txt により抽出されたテキストの例:

html2txt コマンドに与えられる引数(#define USE_LIB 0 としてビルド):

USAGE: html2txt htmlfile [-disp] [-link] [-out textfile] [-url baseurl]
-disp: ファイルに出力される HTML を標準出力(stdout)へ出力するように変更
-link: リンク部のタグを残したまま出力
-out textfile: 出力するファイル名を .txt 等から指定のファイル名に変更
-url baseurl: リンクを出力する際、ベースとなる URL を設定することにより相対参照を絶対参照に変更

ソース等をまとめたもの:DL(html2txt.zip)

html2txt.cpp(HTML 記号をテキストに変換する処理の部分が記号として変換されて表示されているため、上の html2txt.zip に含まれるソースをDLしてご利用ください)

html2txt.h 実行結果

2011年9月18日日曜日

cpp2html クラスを利用した HTML 出力フォーマットの変更

cpp2html クラスを利用した HTML 出力のフォーマットを変更する例です。

例題により変換された HTML の例:exp1.cpp / samp.html

ソース等をまとめたもの:DL(cpp2html.zip)

exp1.cpp 実行結果 exp2.cpp

cpp2html:C言語ソースファイルからHTMLファイルへの変換

cpp2html:C言語ソースファイルからHTMLファイルへの変換を実装する例です。

以下の例では、ソースファイルからHTMLファイルに変換するクラスを cpp2html.cpp/cpp2html.h に記述し、そのクラスを利用し対応するソースファイル(.c,.cc,.cpp,.h,.hh,.hpp)を一括してHTMLに変換するためのコマンドラインアプリを作成する例(src2html.cpp)を掲載しています。

src2html により変換された HTML の例:cpp2html.cpp / cpp2html.h / src2html.cpp

cpp2html コマンドに与えられる引数(#define USE_LIB 0 としてビルド):

USAGE: cpp2html srcfile [-disp] [-plain] [-out htmlfile] [-t n] [-no]
-disp: ファイルに出力される HTML を標準出力(stdout)へ出力するように変更
-plain: HTML ヘッダを省き、ソース部分のみ HTML 化したコードを出力
-t n: タブを空白に置き換える際の空白数を n で与える
-out htmlfile: 出力するファイル名を _cpp.html 等から指定のファイル名に変更

ソース等をまとめたもの:DL(cpp2html.zip)

cpp2html.cpp

cpp2html.h

src2html.cpp 実行結果

Makefile