Powered by SmartDoc

ソフトウェア概論B (2010/01/15)
Ver. 1.0

2010年1月15日
栗野 俊一
kurino@math.cst.nihon-u.ac.jp
http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/2009/soft/soft.html
ソフトウェア概論 B2010年1月15日 の資料

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

本日の概要

構造体の続き( Text p.280-289 )

講義で利用するサンプルプログラム

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * [参考] 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 ?
sample-001.c の実行結果
C:\usr\c\> sample-001
sample-001
This is a pen.
I am a boy.
How are you ?
C:\usr\c\> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * ファイル(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;
}
sample-002.c の実行結果
C:\usr\c\> sample-002
sample-002
This is a pen.
I am a boy.
How are you ?
C:\usr\c\> 

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * キーボード(標準入力)からの入力をファイル(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 ?
sample-003.c の実行結果
C:\usr\c\> sample-003
C:\usr\c\> 

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * [参考] 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;
}
sample-004.c の実行結果
C:\usr\c\> sample-004
C:\usr\c\> 

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * [参考] 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 ?
sample-005.c の実行結果
C:\usr\c\> sample-005
sample-005
This is a pen.
I am a boy.
How are you ?
C:\usr\c\> 

sample-006

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * キーボード(標準入力)からの入力を画面(標準出力)にコピーする
 * 「コピーの機能」を 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 ?
sample-006.c の実行結果
C:\usr\c\> sample-006
sample-006
This is a pen.
I am a boy.
How are you ?
C:\usr\c\> 

sample-007

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * ファイル(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;
}
sample-007.c の実行結果
C:\usr\c\> sample-007
C:\usr\c\> 

sample-008

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * キーボードから入力される整数の総和を計算
 * 「総和の機能」を 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
sample-008.c の実行結果
C:\usr\c\> sample-008
総和 = 2138
C:\usr\c\> 

sample-009

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * ファイル(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;
}
sample-009.c の実行結果
C:\usr\c\> sample-009
総和 = 2138
C:\usr\c\> 

sample-010

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * テキストファイル(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;
}
sample-010.c の実行結果
C:\usr\c\> sample-010
C:\usr\c\> 

sample-011

Download : sample-011.c ( SJIS 版 )

sample-011.c
/*
 * ファイル(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;
}
sample-011.c の実行結果
C:\usr\c\> sample-011
総和 = 2138
C:\usr\c\> 

課題

ファイルの入出力

ファイルの読み書きを行うプログラムの作成

課題20100115-01 ( text p.305 :演習13-9 )
全ての英小文字を英大文字に変換しながらコピーするプログラムを完成せよ。
課題20100115-02 ( text p.297 :演習13-3 )
ファイルから読み込んだ個人データを身長順にソートした上で表示するプログラムを作成せよ。