解法その3:一時バッファ + read & write
も一つだけ.某所で指摘された解法.
bool is_in_good, is_out_good; const size_t buf_sz = 8; char buf[buf_sz]; size_t count = 0; for(; count < sz && (is_in_good = !!ifs.read(buf, min<size_t>(sz - count, buf_sz))) && (is_out_good = !!ofs.write(buf, ifs.gcount())); count += ifs.gcount()); if(!is_in_good || !is_out_good){ throw exception(""); }
(buf_sz = 8は実験環境での最適解)
結果:56s
よくよく考えたらIOみたいなのをちゃんとやろうとするとどんどん低水準な領域に足踏み入れないといけなくなるんだから,ここら辺でやめないと何やりたいのかさっぱり分からなくなってくるにゃ〜.もともとのモチベーションは「C++標準のiostreamでどうやれるか・どこまでやれるか」を知りたかっただけだからここら辺が引き際と見た.そもそも環境変わったら結果が劇的に変わる可能性だって十分あるんだし.( ´ω`)ふみゅん
っていうか,自分っていまだにまともにiostreamを知らなかったことを痛感したにゅ.どこでどんな例外が飛んでくるのか?とか,sentryって何?とか全然分かってねー.というかiostreamに関する詳しい記述少なすぎ.TC++PLのiostreamの記述すら全然足りにゃいよ.
あー
よー考えたらわざわざエラーフラッグ取らなくても状態ビット見ればよいんじゃ・・・.本当に真剣に何も分かってないのな・・・.
うー
ストリームバッファに直接書き込んでいるとストリームの状態ビット変更されないのね・・・.よくよく考えてみれば当たり前じゃん.つーことはエラーフラッグ明示的に取るのが正解?
おー
basic_istream::get, basic_ostream::putって毎回flushするのね.そりゃ遅いに決まってる.sentryのコンストラクタにflushのコードが隠蔽されているからそりゃパッと読んでも違いが分からないわけだ.っていうかsentryとは何か?を少しだけ理解.