破壊的変更 @mono_shoo D言語には独自I/Oがない › C言語のFILE*を使うしか無い › ポインタェ › Streamは? あるけどdeprecatedなんだってよ by Andrei ぶっちゃけ一つの解ではあるけど 短いモジュール名! import std.io, std.stdio; RAIIによる開放! void main() { auto fport = FilePort(“path/to/file”); foreach (line; fport.byLine) { writeln(line); } Rangeによるアクセス! } 独自I/Oの要件 › C言語の資産(FILE*)を使えにゃいかん by Walter › まずインターフェースはRangeに… by Andrei › テンプレート+構造体で… by 最近のPhobos 1. FILE*との互換性はどこまでもつ? › ノンブロッキングは? › バッファは? 2. バッファはどの層が持つべき? › Handle/Buffer/Port › Handle⊇Buffer/Port › Handle/Buffer=Range/Port→Range 3. Handleのインターフェース › プリミティブなメソッド/プロパティ read/write/seek/end/close/… 4. Bufferのインターフェース › プリミティブなメソッド/プロパティ › Handle⊇Bufferな場合 seekは? 管理大変… 5. Portのインターフェース › byLine/byChunk/byPacket/… ノンブロッキングとは? › 読み込みのある無しにかかわらず、 即座に処理が戻ってくるI/O import std.stdio; void main() { auto src = stdin; auto buf = new ubyte[](10); if (fread(buf.ptr, 1, 10, src) < 10) throw new Exception("I/O error"); } throw が呼ばれるのはエラーの時だけ。 例)標準入出力で1文字しか入力しなかったら もう一度入力を求める。 何が問題? › FILE*を使う場合、一旦読み込みすると › 中身をいじれば出来なくもないが、 DのI/Oにノンブロッキングを含めない › CのFILE*は普通にHandleだのなんだの で定義可能 › ⇒Unbufferedの問題 › ⇒Handleのインターフェースの問題 DのI/Oでノンブロッキングは オプションにする › CのFILE*を使うHandleは ノンブロッキングに出来ない › ⇒Unbufferedの問題 › ⇒Handleのインターフェースの問題 CのFILE*を使ってバッファ処理の 冗長性を可能な限り取り除くには? › CのFILE*はデフォルトでバッファ有効 › Dが独自にバッファを持つと冗長な 場合がある HandleがFILE*にデータを読み込めと命令 Port (CStdioPort) Buffer Handle FILE* メモリ メモリ データ Bufferがバッファリングしろと命令 Port (CStdioPort) Buffer メモリ Handle FILE* メモリ データ Portによるバッファからの読み込み Port (CStdioPort) Buffer Handle FILE* データ メモリ メモリ 一つにまとめたい!!! Port (CStdioPort) Buffer Handle FILE* メモリ メモリ Buffer=Handleにすれば解決 › Handle・Bufferのインターフェース の問題 › もちろんオプション Port Handle=Buffer FILE* メモリ
© Copyright 2024 ExpyDoc