ラベル ファイル操作 の投稿を表示しています。 すべての投稿を表示
ラベル ファイル操作 の投稿を表示しています。 すべての投稿を表示

2014年9月7日日曜日

行数を指定してファイルを逆順に取得

行数を指定してファイルを逆順に読み取り、その結果を取得し表示する例題です。

逆順に取得する方法は従来であれば、
・ファイルの内容を一行ずつ読み取る
・その結果を配列として保存
・配列の結果を逆から取得する
という手順となります。

その際、確保するメモリの量が行数分+最終的な結果の分となるためメモリの確保に困りますが、以下の例題では一時的に確保するメモリの代わりにファイルポインタの位置、行の長さのメモリだけを確保するようにしています。 その結果、一時的に確保するメモリの量が格段に少なくなります。

行数を指定できるため、最後から何行分の結果が必要と言う際に利用できます。 実行結果

2013年10月27日日曜日

ファイルのカット:複数のファイルオープンを行わない方法

ファイルの一部分をカットし、保存し直す例題です。

ファイルの分割や、一部を切り出して別のファイルに書き出す等の例題では、fopen にてファイルポインタを複数用いて別ファイルとして書き出すことが考えられますが(例題を準備するまでもなくいくらでも検索にヒットするでしょう)、ファイルポインタの操作では、追加書き込みしかできないため、同一ファイル上で一部分をカットし保存し直すことが不可能です。
そこで、本例題ではファイルディスクリプタを用いて、同一ファイル上の操作を行っています。

本来はこの例題にて 64bit 長のファイルサイズにも対応したものを準備したかったのですが、開発環境側の準備も必要になりますのでそちらが準備できれば両環境に対応した例題に修正して再度掲載すると言う形になります(OSX ではこのままでも 64bit 対応可能のようです)。
※ 64bit 版として利用する場合には、off64_t/lseek64 への置き換えが必要(Linux etc.)
・64bitファイル対応に関して

この例題では、ftruncate にてファイルサイズを切り詰めて保存しているのですが、この関数はファイルの後半部を切り詰めたり伸長することしか対応しておらず、while 分のようにファイルの後半部分を前半に移動し直すと言う作業が必要となっています。
後半部分だけをカットする場合にはこの関数のみでも対応は可能ですが、前半部分をカットできないために下記のような例題となります。
実行結果

2011年9月19日月曜日

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: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

2011年9月7日水曜日

MD5 によるハッシュ値の計算

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 によるハッシュ値の計算

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 コマンドの例題です。

tail コマンドは、ファイルの最終行を表示するものですが、バイナリファイルの場合、改行が含まれないためにファイルの先頭から最後まで表示されてしまったりするため、非常に困ったことになる場合があります。

そこで、折り返すバイト数を指定したり、表示できない文字が含まれる場合には '*' や 16進数で表示したりすることができるようにしています。


ファイルの読み込みには、メモリマッピングを利用しています。

メモリマッピング (メモリマップドファイル: memory mapped file とも呼ばれる) は、ファイルの内容にアクセスする方法で、ファイルをアドレス空間にマップしファイル内容を配列のように扱うことができます。
ファイルサイズが大きいファイルにて読み込みを行う場合には、こちらの方がアクセスが早くなったりする場合があります。

実行結果

バイナリファイル対応の head コマンド/ファイルのメモリマッピング

バイナリファイルにも対応した head コマンドの例題です。

head コマンドは、ファイルの先頭行を表示するものですが、バイナリファイルの場合、改行が含まれないためにファイルの先頭から最後まで表示されてしまったりするため、非常に困ったことになる場合があります。

そこで、折り返すバイト数を指定したり、表示できない文字が含まれる場合には '*' や 16進数で表示したりすることができるようにしています。


ファイルの読み込みには、メモリマッピングを利用しています。

メモリマッピング (メモリマップドファイル: memory mapped file とも呼ばれる) は、ファイルの内容にアクセスする方法で、ファイルをアドレス空間にマップしファイル内容を配列のように扱うことができます。
ファイルサイズが大きいファイルにて読み込みを行う場合には、こちらの方がアクセスが早くなったりする場合があります。


実行結果

2011年4月1日金曜日

バイナリファイル対応の tail コマンド

バイナリファイルにも対応した tail コマンドの例題です。

tail コマンドは、ファイルの最終行を表示するものですが、バイナリファイルの場合、改行が含まれないためにファイルの先頭から最後まで表示されてしまったりするため、非常に困ったことになる場合があります。

そこで、折り返すバイト数を指定したり、表示できない文字が含まれる場合には '*' や 16進数で表示したりすることができるようにしています。


実行結果