2014年9月7日日曜日
行数を指定してファイルを逆順に取得
・ファイルの内容を一行ずつ読み取る
・その結果を配列として保存
・配列の結果を逆から取得する
という手順となります。 その際、確保するメモリの量が行数分+最終的な結果の分となるためメモリの確保に困りますが、以下の例題では一時的に確保するメモリの代わりにファイルポインタの位置、行の長さのメモリだけを確保するようにしています。 その結果、一時的に確保するメモリの量が格段に少なくなります。 行数を指定できるため、最後から何行分の結果が必要と言う際に利用できます。 実行結果
2013年10月27日日曜日
ファイルのカット:複数のファイルオープンを行わない方法
そこで、本例題ではファイルディスクリプタを用いて、同一ファイル上の操作を行っています。 本来はこの例題にて 64bit 長のファイルサイズにも対応したものを準備したかったのですが、開発環境側の準備も必要になりますのでそちらが準備できれば両環境に対応した例題に修正して再度掲載すると言う形になります(OSX ではこのままでも 64bit 対応可能のようです)。
※ 64bit 版として利用する場合には、off64_t/lseek64 への置き換えが必要(Linux etc.)
・64bitファイル対応に関して この例題では、ftruncate にてファイルサイズを切り詰めて保存しているのですが、この関数はファイルの後半部を切り詰めたり伸長することしか対応しておらず、while 分のようにファイルの後半部分を前半に移動し直すと言う作業が必要となっています。
後半部分だけをカットする場合にはこの関数のみでも対応は可能ですが、前半部分をカットできないために下記のような例題となります。
実行結果
2011年9月19日月曜日
html2txt: HTML ファイルからテキスト文章の抽出
html2txt により抽出されたテキストの例:
- sample.html → sample.txt
- symbols.html(HTML記号一覧) → symbols.txt (UTF-8)
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: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
2011年9月7日水曜日
MD5 によるハッシュ値の計算
コマンドラインから openssl コマンドや、ハッシュ計算ソフト等でも計算可能ですので、計算値が正しいかどうか確認することができます。
例では、libcrypto に含まれるハッシュ値計算用の API を利用し、ファイルのハッシュ値を計算しています(コンパイルには -lcrypto が必要)。
int MD5_Init(MD5_CTX *c);
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
int MD5_Final(unsigned char *md, MD5_CTX *c);
実行結果
2011年9月6日火曜日
SHA-1 によるハッシュ値の計算
コマンドラインから openssl コマンドや、ハッシュ計算ソフト等でも計算可能ですので、計算値が正しいかどうか確認することができます。
例では、libcrypto に含まれるハッシュ値計算用の API を利用し、ファイルのハッシュ値を計算しています(コンパイルには -lcrypto が必要)。
int SHA1_Init(SHA_CTX *c);
int SHA1_Update(SHA_CTX *c, const void *data, size_t len);
int SHA1_Final(unsigned char *md, SHA_CTX *c);
実行結果
2011年4月3日日曜日
バイナリファイル対応の tail コマンド/ファイルのメモリマッピング
tail コマンドは、ファイルの最終行を表示するものですが、バイナリファイルの場合、改行が含まれないためにファイルの先頭から最後まで表示されてしまったりするため、非常に困ったことになる場合があります。
そこで、折り返すバイト数を指定したり、表示できない文字が含まれる場合には '*' や 16進数で表示したりすることができるようにしています。
ファイルの読み込みには、メモリマッピングを利用しています。
メモリマッピング (メモリマップドファイル: memory mapped file とも呼ばれる) は、ファイルの内容にアクセスする方法で、ファイルをアドレス空間にマップしファイル内容を配列のように扱うことができます。
ファイルサイズが大きいファイルにて読み込みを行う場合には、こちらの方がアクセスが早くなったりする場合があります。
実行結果
バイナリファイル対応の head コマンド/ファイルのメモリマッピング
head コマンドは、ファイルの先頭行を表示するものですが、バイナリファイルの場合、改行が含まれないためにファイルの先頭から最後まで表示されてしまったりするため、非常に困ったことになる場合があります。
そこで、折り返すバイト数を指定したり、表示できない文字が含まれる場合には '*' や 16進数で表示したりすることができるようにしています。
ファイルの読み込みには、メモリマッピングを利用しています。
メモリマッピング (メモリマップドファイル: memory mapped file とも呼ばれる) は、ファイルの内容にアクセスする方法で、ファイルをアドレス空間にマップしファイル内容を配列のように扱うことができます。
ファイルサイズが大きいファイルにて読み込みを行う場合には、こちらの方がアクセスが早くなったりする場合があります。
実行結果
2011年4月1日金曜日
バイナリファイル対応の tail コマンド
tail コマンドは、ファイルの最終行を表示するものですが、バイナリファイルの場合、改行が含まれないためにファイルの先頭から最後まで表示されてしまったりするため、非常に困ったことになる場合があります。
そこで、折り返すバイト数を指定したり、表示できない文字が含まれる場合には '*' や 16進数で表示したりすることができるようにしています。
実行結果
