研究室向けシリーズその2
使う場面を考えてパイプはほぼ省略するけど興味あったら調べてください。
リダイレクト
リダイレクト is 何
いつも通りにプログラムを普通に書いて普通にprintfとかすると普通にコマンドプロンプトに表示されると思います。
printfしたときの出力先は、標準では端末のディスプレイ*1となっていますが、実は出力先を変更することができます。この出力先を変更する機能のことをリダイレションといいます。リダイレクションを行うことをリダイレクトすると言います。だいたいリダイレクトって言っておけば通じますきっと。
変更先としてa.txtなど、適当なファイルを指定するとa.txtにプログラムの出力*2が保存されます。
何の役に立つの
リダイレクトを行うことでプログラムの出力を保存することができるので、重要な実験や時間のかかる実験の諸条件*3などを、いちいちコピペせずに保存することができます。あとfopenとかいちいち面倒というときに使えます。
how to リダイレクト
(プログラムの実行ファイル) > (変更先のファイル名)
のように">"を使って実行ファイルと結果をつないであげます。
例として、printf("( ´_ゝ`)\n");が含まれたa.cをコンパイルしたa.exeを考えます。*4
a.exe > test.txt
のようにすると
type test.txt ( ´_ゝ`)
となります。*5
標準出力とか
標準の出力はstdoutで指定することが出来ます。
- 標準入力(キーボード): stdin
- 標準出力(ディスプレイ) : stdout
- 標準エラー出力(ディスプレイ) : stderr
stderrはリダイレクトによって変わらないのでエラーなど
リダイレクト中でも画面に出力したいときは
fprintf(stderr, "aaa\n");
のように書きましょう。
余談ですが、下記の二行は等価です。
printf("aaa\n"); fprintf(stdout, "aaa\n");
fprintfの普段の使い方と比べながらどういう仕組みなのか考えると、なんとなく分かると思います。
補足
- visual studioのデバック引数のところでも同様に">"を使ったリダイレクトが可能です。
- 単に">"とするとファイルを必ず新規作成(既存の内容を破棄)しますが、">>"としてリダイレクトを行うとファイルへの追加(既存の内容を保持)が行えます。
パイプ
パイプ is 何
パイプはプログラムの出力を別のプログラムの入力にする仕組みです。色々なwindowsのコマンドを覚えると組み合わせ次第で強力な効果を発揮するといいな。
how to パイプ
(コマンド1) | (コマンド2)
のようにコマンド(exe等の実行ファイル含む)とコマンドの間を"|"でつなげます。
便利な使い方
研究室内で普通に便利だなと思うものを二つ挙げます
clip
出力結果をクリップボードにコピー(全選択してコピーするのと同じ効果) a.exe | clip
tee
teeを使うと、出力をファイルにリダイレクトしつつ、コマンドプロンプトにも表示というまさかの両立ができます。
ちなみにTの字に出力が分岐するからteeっていうらしいです*6
teeは残念ながら標準搭載では無いのですが、便利なので入れておくと幸せです。
使い方はこんな感じ
出力をtest.txtにリダイレクトしつつ、コマンドプロンプトにも表示 a.exe | tee test.txt
導入方法は↓
1. ここからntuxtl014.lzhをダウンロードして解凍
1. ntuxtl014\binにあるtee.exeをどこかにコピー(my document\etcを作ってその中に入れたりしてます。)
1. pathを通す。(通し方はググってください。)
おまけ
windowsの地味に便利な機能