出力はリングバッファ

リングバッファ処理を書き上げ、暫定的に直接出力していた部分をリングバッファ関数に迂回するように処理を変更した。

取り敢えず、文字u_charと、フラグu_charを合わせたstructを一つとし、これを暫定的に64個確保して、この中で回すようにした。

リングバッファなので読んだり書いたりも高速、管理する変数も3つだけでよい。
・バッファの先頭アドレスを格納するポインタ変数
・読むインデックス
・書くインデックス

今回は、structの配列としてポインタ変数を宣言したため、二つのインデックスはintとした。
別にこの二つをポインタにしても何ら問題はないが、今回はintで処理できるので、見やすく、処理も書きやすかった。

今のところ用意した関数は次の三つ。


格納関数


ofstreamの参照と、格納したいデータが入ったバッファへのポインタや長さを含むstructへのポインタを引数とする。返却値はvoidである。
バッファ格納長を見ながら、1バイトずつ丁寧にリングバッファに入れる。先頭の1バイトはフラグを立て、後は下ろす。

もし書きながらリングバッファが一杯になったら(つまり、次に書くインデックスが、次に読むインデックスと同じになったら)、次のフラグまで(つまり1文字分)を吐き出し、空きを作って格納を続ける。

この辺が、いかにもリングバッファという感じです。


フラッシュ関数


リングバッファに入っているものを、全部ofstreamに吐き出す。
アプリケーション終了時に呼ぶ。

要するに、読みインデックスが、書きインデックスに一致するまで1バイトずつ丁寧に吐き出します。


キャンセル関数


リングバッファに最後に格納された文字を、削除する。

読みインデックスと書きインデックスが不一致の間、書きインデックスを減算して先頭フラグを探し、そのポインタを次に使う書きインデックスとする。

この関数は、書きインデックスが通常と違い、逆走することになりますね。

おまけで、決定した書きインデックスにある1バイトを返却する。



さて、実際のファイル管理はDLLではなくアプリケーション側ですから、DLLが「キャンセルして欲しい」と判断した場合、DLLはアプリケーションに返す構造体中のフラグで通知する。
この用途のために、1ビットのフラグを用意した。

2008/11/17(月)01:16 |Comments(0) |Trackback(0)

製造開発 | プログラミング | コンピュータ | [編集]

▲ページトップ

コメント

コメントの投稿

シフトJISの入出力 ホーム 出力まわりの改善
トラックバック

この記事にトラックバックする(FC2ブログユーザー)
▲ページトップ

カレンダー

03 | 2017/04 | 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -

プロフィール

miraicorp

Author:miraicorp
未来情報産業(株) 社長

主として「ICカードこれひとつ」や「文字、文字コード」処理、時々C++などについて記述しています。

twitterツイッター

管理用

検索フォーム

お知らせ

コメント等お気軽にどうぞ。

気に入ったら拍手して頂けると、今後の記事を書く際の参考や励みになります。

■お仕事を募集しております
ソフトウェア製造の仕事や、原稿執筆の仕事などを随時受け付けております。
お気軽にご相談下さい

■初めての方へ
こまごまと更新しているため、他にも関連する記事があるかもしれません。
「月別アーカイブ」「検索フォーム」「カテゴリ」などをお試し下さい。
トップページはこちら

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

広告枠

メール

メールはこちら

リンク

このブログをリンクに追加する

RSSリンクの表示

QRコード

QR