リダイレクトとは コマンドプロンプト操作 (2) リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system() 今日のポイン リダイレクトとパイプを使いこなそう 標準入力 標準出力 標準エラー出力を " デフォルト " から別のファイルに割り当てる操作 " デフォルト " は CON ( コンソール ) で 実際の入力はキーボード 出力はディスプレイ 標準入力は 0< ファイル名 < ファイル名 標準出力は 1> ファイル名 > ファイル名 標準エラー出力は 2> ファイル名 追加出力は >> ファイル名 2>> ファイル名 リダイレクトの練習 (1) リダイレクトの練習 (2) Z: nyumon2>dir > foo.txt Z: nyumon2>dir /f 2> err.txt Z: nyumon2>more < foo.txt Z: nyumon2>more < err.txt Z: nyumon2>dir /w >> foo.txt Z: nyumon2>dir /v 2>> err.txt Z: nyumon2>more < foo.txt Z: nyumon2>more < err.txt foo.txt に出力 err.txt にエラー出力 foo.txt の内容を表示 foo.txt に追加出力 err.txt に追加エラー出力 foo.txt の内容を再表示 Z: nyumon2>dir > con Z: nyumon2>dir /f 2> con Z: nyumon2>more < con > goo.txt abcdefghijklmnopqrstuvwxyz<enter> Ctrl-z<Enter> Z: nyumon2>more < goo.txt 先週作った Z: nyumon2 hello に行き コンソールに出力 キーボード入力を goo.txt に保存 ファイルの終わりを表す記号 ( 教科書 p.139 問題 14.3) Z: nyumon2 hello>hello > hello.txt Z: nyumon2 hello>more < hello.txt
パイプとは ファイル保存をせずに直接 次のプログラムにデータを受け渡す方法 縦棒 を使って連結する 標準入力 標準出力のコマンド プログラム に用いる 並べ替えのコマンド Z: nyumon1>dir /s /b sort more 標準入力 標準出力のコマンド more: ページごとの出力 sort: 並べ替え find: 文字列検索 Z: nyumon1>dir /s find "hello" findstr: 高度な文字列検索 Z: nyumon1>findstr /s "fopen" *.c 標準出力標準入力 / 標準出力 標準入力 / 標準出力 help コマンドで調べてみよう 編集用コマンド 標準エラー出力を用いたプログラム notepad ( メモ帳 ) Z: nyumon2 hello>notepad hello.c write ( ワードパッド ) Z: nyumon2 hello>write Z: nyumon2 hello>write hello.c devenv ( 開発環境 ) Z: nyumon2 hello>devenv hello.c Z: nyumon2 hello>hello.c 新規のとき hello.c を編集し hello2.c に名前を変えて保存 CL コマンドを用いてコンパイル (cl hello2.c) /* hello world program 2 */ printf("hello world! n"); fprintf(stderr,"error message! n"); この行を追加 fprintf: ファイルへの出力 ( 教科書 p.130) stderr: 標準エラー出力
標準エラー出力を用いたプログラムの実行 リダイレクトを用いて実行してみる Z: nyumon2 hello>hello2 Z: nyumon2 hello>hello2 > hello2.txt Z: nyumon2 hello>hello2 2> err2.txt または Z: nyumon2 hello>hello2 >hello2.txt 2>err2.txt Z: nyumon2 hello>more < hello2.txt Z: nyumon2 hello>more < err2.txt 標準入力 標準出力を用いたプログラム 以下のプログラムを typ.c と名づけて保存し コンパイルせよ ( 自作コマンドのための第 1 歩 ) /* typ.c: stdin type */ stdin から変数 c に1 文字分入力 int c; while ((c=fgetc(stdin))!= EOF) fputc(c,stdout); ファイルの終わりまで続ける stdout に1 文字出力 fgetc(): ファイルから 1 文字入力 fputc(): ファイルに 1 文字出力 CL コマンドを用いること stdin: 標準入力 EOF: ファイル終端 標準入力表示プログラムの実行 Z: nyumon2>typ < typ.c... Z: nyumon2>typ abc... abc... 123... 123... ^Z Ctrl-z を入力 Z: nyumon2>dir typ type コマンドや more コマンドと動作を比べてみよ 教科書 p.139 問題 14.3 参照 万一 プログラムが終われなくなったら Ctrl-c で強制終了 コマンド行引数 プログラムの後にオプションを付けられるようにする ( 自作コマンドのための第 2 歩 ) main(void) main(int argc, char *argv[ ]) int argc: コマンド行の文字列数 char *argv[ ]: コマンド行の文字列配列例 : Z: nyumon2>mainarg 1.2345 abcde!"#$%&'() argc=4 argv[0]="mainarg" argv[1]="1.2345" argv[2]="abcde" argv[3]="!#$%&'()"
コマンド行確認プログラム mainarg.c を作成し コンパイル 実行せよ /* mainarg.c: main argument test */ int main(int argc, char *argv[]) int i; printf("argc = %d n", argc); for (i = 0; i < argc; i++) printf("argv[%d] = "%s " n", i, argv[i]); エスケープ系列 ( 教科書 p.180) 関数 system( ) 関数 system( ) を用いると プログラム内からコマンドプロンプトのコマンドが利用できる stdlib.h ヘッダが必要 /* hello world program 3 */ #include <stdlib.h> system("cls"); printf("hello world! n"); hello.c にこの行を追加 この行も追加 hello3.c cls について調べてみよう 制御コード 2 " 2 重引用符 教科書 p.180 表 A.2 ' 単一引用符 t 水平タブ 円マーク ( ハ ックスラッシュ ) /* hello world program 4 */ hello4.c #include <syslib.h> system("cls"); printf(" 'hello world! ' n"); この部分を追加 Office アプリケーションを開く Excel の実行ファイル (Excel.exe) のありかを確認し 直接実行するプログラムを作る /* Excel exec program */ #include <stdlib.h> system(" "C: Program Files " "Microsoft Office " "Office11 Excel.exe ""); excel2.c Word(Winword.exe) や PowerPoint(Powerpnt.exe) を開くプログラムも作ってみよ 文字列を途中で改行するときは必ずダブルクォートで区切る コマンドにスペースがあるときは全体をダブルクォート ( ") でくくる
スキルアップタイム ~ コマンド行引数を用いた自作コマンドの作成 ~ コマンド行で指定した文字の数をカウントする chc.c を完成させよう /* chc.c: char counter */ int main(int argc, char *argv[]) int c, cnt=0; while ((c=fgetc(stdin))!= EOF) if ( ) ; printf(" ", ); 文字数カウンタ chc の実行例 chc のソースファイルで試した例 Z: nyumon2>chc i < chc.c i: 10 Z: nyumon2>chc abc < chc.c a: 6 万一 プログラムが終われなくなったら Ctrl-c で強制終了 argc = 2 argv[0] = "chc" argv[1] = "i < chc.c" argc = 2 argv[0] = "chc" argv[1] = "abc < chc.c" スキルアップタイム ( オフ ション ) excel2.c を改良し ファイル名を指定できるようにせよ (excel3.c) コマンド行でファイル名を指定 excel 実行用文字列に argv[1] を連結 strcat 関数の利用 excel 実行用文字列は初期値で与える argc = 1 のときは連結しない 連結された文字列を system 関数に渡す