当日のOHP資料です。
構造体の続き( Text p.280-289 )
Download : sample-001.c ( SJIS 版 )
/* * [参考] list 8-11 (text p.204) */ /* * キーボード(標準入力)からの入力を画面(標準出力)にコピーする */ #include <stdio.h> /* * main */ int main ( void ) { int ch; /* 入力した文字の文字コードを保持 */ /* getchar が EOF を返すので char 型では駄目 */ while ( ( ch = getchar() ) != EOF ) { /* getchar で文字を入力し、 ch に入れ * それが EOF でなければ.. */ putchar ( ch ); /* putchar で出力 */ } return 0; }
sample-001 This is a pen. I am a boy. How are you ?
C:\usr\c\> sample-001 sample-001 This is a pen. I am a boy. How are you ? C:\usr\c\>
Download : sample-002.c ( SJIS 版 )
/* * ファイル(in002.txt)からの入力を画面(標準出力)にコピーする */ #include <stdio.h> #include <stdlib.h> /* * */ #define IN_FILE "in002.txt" /* 入力するファイルの名前 */ /* * main */ int main ( void ) { FILE *ifp; /* ファイル扱う為には「ファイルポインタ」必要 */ int ch; /* 入力した文字の文字コードを保持 */ /* getchar が EOF を返すので char 型では駄目 */ if ( ( ifp = fopen ( IN_FILE, "r" ) ) != NULL ) { /* ファイルポインタは fopen 関数を使って、 * 実際のファイル「in002.txt」と結び付ける必要がある。 * 入力に利用する場合は "r" ( read : 読込 ) を指定する。 * ファイルが存在しないなどで結び付けに失敗すると NULL * が返るので、その場合は、処理を続けられない。 */ while ( ( ch = fgetc ( ifp ) ) != EOF ) { /* fgetc で ifp (に結び付けられたファイル ) から * 一文字を入力し、ch に入れ * それが EOF でなければ.. */ putchar ( ch ); /* putchar で出力 */ } fclose ( ifp ); /* ファイルの利用が終ったら後始末が必要 !! */ } else { /* ファイルのオープンに失敗したので.. */ printf ( "読込みファイル(%s)のオープンに失敗しました\n", IN_FILE ); /* エラーメッセージを出力し .. */ exit ( -1 ); /* プログラムを終了 */ } return 0; }
C:\usr\c\> sample-002 sample-002 This is a pen. I am a boy. How are you ? C:\usr\c\>
Download : sample-003.c ( SJIS 版 )
/* * キーボード(標準入力)からの入力をファイル(out003.txt)にコピーする * */ #include <stdio.h> #include <stdlib.h> /* * */ #define OUT_FILE "out003.txt" /* 出力するファイルの名前 */ /* * main */ int main ( void ) { FILE *ofp; /* ファイル扱う為には「ファイルポインタ」必要 */ int ch; /* 入力した文字の文字コードを保持 */ /* getchar が EOF を返すので char 型では駄目 */ if ( ( ofp = fopen ( OUT_FILE, "w" ) ) != NULL ) { /* ファイルポインタは fopen 関数を使って、 * 実際のファイル「out003.txt」と結び付ける必要がある。 * 出力に利用する場合は "w" ( write : 書き出し ) を指定する。 * ファイルが書けないなどで結び付けに失敗すると NULL * が返るので、その場合は、処理を続けられない。 */ while ( ( ch = getchar() ) != EOF ) { /* getchar で文字を入力し、 ch に入れ * それが EOF でなければ.. */ fputc ( ch, ofp ); /* fputc で ofp (に結び付けられたファイル ) へ * 一文字を出力する */ } fclose ( ofp ); /* ファイルの利用が終ったら後始末が必要 !! */ } else { /* ファイルのオープンに失敗したので.. */ printf ( "書き出しファイル(%s)のオープンに失敗しました\n", OUT_FILE ); /* エラーメッセージを出力し .. */ exit ( -1 ); /* プログラムを終了 */ } return 0; }
sample-003 This is a pen. I am a boy. How are you ?
C:\usr\c\> sample-003 C:\usr\c\>
Download : sample-004.c ( SJIS 版 )
/* * [参考] list 13-7 (text p.304) */ /* * ファイル(in004.txt)からの入力をファイル(out004.txt)にコピーする * */ #include <stdio.h> #include <stdlib.h> /* * */ #define OUT_FILE "out004.txt" /* 出力するファイルの名前 */ #define IN_FILE "in004.txt" /* 入力するファイルの名前 */ /* * main */ int main ( void ) { FILE *ofp; /* ファイル扱う為には「ファイルポインタ」必要 */ FILE *ifp; /* ファイル扱う為には「ファイルポインタ」必要 */ int ch; /* 入力した文字の文字コードを保持 */ /* getchar が EOF を返すので char 型では駄目 */ if ( ( ifp = fopen ( IN_FILE, "r" ) ) != NULL ) { /* ファイルポインタは fopen 関数を使って、 * 実際のファイル「in004.txt」と結び付ける必要がある。 * 入力に利用する場合は "r" ( read : 読込 ) を指定する。 * ファイルが存在しないなどで結び付けに失敗すると NULL * が返るので、その場合は、処理を続けられない。 */ if ( ( ofp = fopen ( OUT_FILE, "w" ) ) != NULL ) { /* ファイルポインタは fopen 関数を使って、 * 実際のファイル「out004.txt」と結び付ける必要がある。 * 出力に利用する場合は "w" ( write : 書き出し ) を指定する。 * ファイルが書けないなどで結び付けに失敗すると NULL * が返るので、その場合は、処理を続けられない。 */ while ( ( ch = fgetc ( ifp ) ) != EOF ) { /* fgetc で ifp (に結び付けられたファイル ) から * 一文字を入力し、ch に入れ * それが EOF でなければ.. */ fputc ( ch, ofp ); /* fputc で ofp (に結び付けられたファイル ) へ * 一文字を出力する */ } fclose ( ofp ); /* ファイルの利用が終ったら後始末が必要 !! */ } else { /* ファイルのオープンに失敗したので.. */ printf ( "読込みファイル(%s)のオープンに失敗しました\n", IN_FILE ); /* エラーメッセージを出力し .. */ exit ( -1 ); /* プログラムを終了 */ } fclose ( ifp ); /* ファイルの利用が終ったら後始末が必要 !! */ } else { /* ファイルのオープンに失敗したので.. */ printf ( "書き出しファイル(%s)のオープンに失敗しました\n", OUT_FILE ); /* エラーメッセージを出力し .. */ exit ( -1 ); /* プログラムを終了 */ } return 0; }
C:\usr\c\> sample-004 C:\usr\c\>
Download : sample-005.c ( SJIS 版 )
/* * [参考] list 8-11 (text p.204) */ /* * キーボード(標準入力)からの入力を画面(標準出力)にコピーする * (stdin/stdout, fgetc, fputc を利用) */ #include <stdio.h> /* * main */ int main ( void ) { int ch; /* 入力した文字の文字コードを保持 */ /* getchar が EOF を返すので char 型では駄目 */ while ( ( ch = fgetc( stdin ) ) != EOF ) { /* fgetc で文字を入力し、 ch に入れ * それが EOF でなければ.. */ fputc ( ch, stdout ); /* fputc で出力 */ } return 0; }
sample-005 This is a pen. I am a boy. How are you ?
C:\usr\c\> sample-005 sample-005 This is a pen. I am a boy. How are you ? C:\usr\c\>
Download : sample-006.c ( SJIS 版 )
/* * キーボード(標準入力)からの入力を画面(標準出力)にコピーする * 「コピーの機能」を stream_copy に集約 */ #include <stdio.h> /* * stream_copy * in で指定されたストリームの内容を out で指定したストリームに書き出す * */ void stream_copy ( FILE *in, FILE *out ) { int ch; /* 入力した文字の文字コードを保持 */ while ( ( ch = fgetc( in ) ) != EOF ) { /* fgetc で in から文字を入力し、 ch に入れ * それが EOF でなければ.. */ fputc ( ch, out ); /* fputc で out 出力 */ } } /* * main */ int main ( void ) { stream_copy ( stdin, stdout ); /* ファイルポインタを指定するだけ */ return 0; }
sample-006 This is a pen. I am a boy. How are you ?
C:\usr\c\> sample-006 sample-006 This is a pen. I am a boy. How are you ? C:\usr\c\>
Download : sample-007.c ( SJIS 版 )
/* * ファイル(in007.txt)からの入力をファイル(out007.txt)にコピーする * 「コピーの機能」を stream_copy に集約 */ #include <stdio.h> #include <stdlib.h> /* * */ #define OUT_FILE "out007.txt" /* 出力するファイルの名前 */ #define IN_FILE "in007.txt" /* 入力するファイルの名前 */ /* * stream_copy * in で指定されたストリームの内容を out で指定したストリームに書き出す * */ void stream_copy ( FILE *in, FILE *out ) { int ch; /* 入力した文字の文字コードを保持 */ while ( ( ch = fgetc( in ) ) != EOF ) { /* fgetc で in から文字を入力し、 ch に入れ * それが EOF でなければ.. */ fputc ( ch, out ); /* fputc で out 出力 */ } } /* * main */ int main ( void ) { FILE *ofp; /* ファイル扱う為には「ファイルポインタ」必要 */ FILE *ifp; /* ファイル扱う為には「ファイルポインタ」必要 */ /* main では、ファイルの open/close に専念 * ファイルコピーの機能は、stream_copy に分出 */ if ( ( ifp = fopen ( IN_FILE, "r" ) ) != NULL ) { if ( ( ofp = fopen ( OUT_FILE, "w" ) ) != NULL ) { stream_copy ( ifp, ofp ); fclose ( ofp ); /* ファイルの利用が終ったら後始末が必要 !! */ } else { /* ファイルのオープンに失敗したので.. */ printf ( "読込みファイル(%s)のオープンに失敗しました\n", IN_FILE ); exit ( -1 ); /* プログラムを終了 */ } fclose ( ifp ); /* ファイルの利用が終ったら後始末が必要 !! */ } else { /* ファイルのオープンに失敗したので.. */ printf ( "書き出しファイル(%s)のオープンに失敗しました\n", OUT_FILE ); exit ( -1 ); /* プログラムを終了 */ } return 0; }
C:\usr\c\> sample-007 C:\usr\c\>
Download : sample-008.c ( SJIS 版 )
/* * キーボードから入力される整数の総和を計算 * 「総和の機能」を stream_sum に集約 */ #include <stdio.h> /* * stream_sum * in で指定されたストリームから整数値を読み出し、その総和を計算する * */ int stream_sum ( FILE *ifp ) { int num; /* 入力した数値を保持 */ int sum; /* 全体の総和を保持 */ sum = 0; while ( !feof ( ifp ) ) { if ( fscanf ( ifp, "%d", &num ) > 0 ) { // printf ( "%d\n", num ); sum += num; } } return sum; } /* * main */ int main ( void ) { int sum; sum = stream_sum ( stdin ); printf ( "総和 = %d\n", sum ); return 0; }
43 123 232 29 849 29 382 438 13
C:\usr\c\> sample-008 総和 = 2138 C:\usr\c\>
Download : sample-009.c ( SJIS 版 )
/* * ファイル(in009.txt)からされる整数の総和を計算 * 「総和の機能」を stream_sum に集約 */ #include <stdio.h> #include <stdlib.h> /* * */ #define IN_FILE "in009.txt" /* 入力するファイルの名前 */ /* * stream_sum * in で指定されたストリームから整数値を読み出し、その総和を計算する * */ int stream_sum ( FILE *in ) { int num; /* 入力した数値を保持 */ int sum; /* 全体の総和を保持 */ sum = 0; while ( !feof ( in ) ) { if ( fscanf ( in, "%d", &num ) > 0 ) { // printf ( "%d\n", num ); sum += num; } } return sum; } /* * main */ int main ( void ) { FILE *ifp; /* ファイル扱う為には「ファイルポインタ」必要 */ int sum; if ( ( ifp = fopen ( IN_FILE, "r" ) ) != NULL ) { sum = stream_sum ( ifp ); fclose ( ifp ); /* ファイルの利用が終ったら後始末が必要 !! */ } else { /* ファイルのオープンに失敗したので.. */ printf ( "読込みファイル(%s)のオープンに失敗しました\n", IN_FILE ); exit ( -1 ); /* プログラムを終了 */ } printf ( "総和 = %d\n", sum ); return 0; }
C:\usr\c\> sample-009 総和 = 2138 C:\usr\c\>
Download : sample-010.c ( SJIS 版 )
/* * テキストファイル(in010.txt)からバイナリファイル(out010.bin)を作る */ #include <stdio.h> #include <stdlib.h> /* * */ #define IN_FILE "in010.txt" /* 入力するファイルの名前 */ #define OUT_FILE "out010.bin" /* 出力するファイルの名前 */ /* * to_bin */ void to_bin ( FILE *ifp, FILE *ofp ) { int num; /* 入力した数値データ */ while ( !feof ( ifp ) ) { if ( fscanf ( ifp, "%d", &num ) > 0 ) { // printf ( "%d\n", num ); fwrite ( &num, sizeof(int), 1, ofp ); /* binary なので fwrite で出力 */ } } } /* * main */ int main ( void ) { FILE *ofp; /* ファイル扱う為には「ファイルポインタ」必要 */ FILE *ifp; /* ファイル扱う為には「ファイルポインタ」必要 */ int ch; /* 入力した文字の文字コードを保持 */ /* getchar が EOF を返すので char 型では駄目 */ if ( ( ifp = fopen ( IN_FILE, "r" ) ) != NULL ) { if ( ( ofp = fopen ( OUT_FILE, "wb" ) ) != NULL ) { to_bin ( ifp, ofp ); fclose ( ofp ); /* ファイルの利用が終ったら後始末が必要 !! */ } else { /* ファイルのオープンに失敗したので.. */ printf ( "読込みファイル(%s)のオープンに失敗しました\n", IN_FILE ); exit ( -1 ); } fclose ( ifp ); /* ファイルの利用が終ったら後始末が必要 !! */ } else { /* ファイルのオープンに失敗したので.. */ printf ( "書き出しファイル(%s)のオープンに失敗しました\n", OUT_FILE ); exit ( -1 ); } return 0; }
C:\usr\c\> sample-010 C:\usr\c\>
Download : sample-011.c ( SJIS 版 )
/* * ファイル(in010.bin)からされる整数の総和を計算 * 「総和の機能」を stream_sum に集約 */ #include <stdio.h> #include <stdlib.h> /* * */ #define IN_FILE "out010.bin" /* 入力するファイルの名前 */ /* * stream_sum * in で指定されたストリームから整数値を読み出し、その総和を計算する * */ int stream_sum ( FILE *in ) { int num; /* 入力した数値を保持 */ int sum; /* 全体の総和を保持 */ sum = 0; while ( !feof ( in ) ) { if ( fread ( &num, sizeof(int), 1, in ) > 0 ) { // printf ( "%d\n", num ); sum += num; } } return sum; } /* * main */ int main ( void ) { FILE *ifp; /* ファイル扱う為には「ファイルポインタ」必要 */ int sum; if ( ( ifp = fopen ( IN_FILE, "rb" ) ) != NULL ) { sum = stream_sum ( ifp ); fclose ( ifp ); /* ファイルの利用が終ったら後始末が必要 !! */ } else { /* ファイルのオープンに失敗したので.. */ printf ( "読込みファイル(%s)のオープンに失敗しました\n", IN_FILE ); exit ( -1 ); /* プログラムを終了 */ } printf ( "総和 = %d\n", sum ); return 0; }
C:\usr\c\> sample-011 総和 = 2138 C:\usr\c\>
ファイルの読み書きを行うプログラムの作成