解答例17-1

【問1】

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
	FILE *fin, *fout;
	char infile[40], outfile[40];
	int c;

	printf( "入力ファイル名 = " );
	gets( infile );
	printf( "出力ファイル名 = " );
	gets( outfile );
	if( ( fin=fopen( infile, "r" ) ) == NULL ) {
		printf( "入力ファイルがオープンできません\n" );
		exit( EXIT_FAILURE );
	}
	if( ( fout=fopen( outfile, "w" ) ) == NULL ) {
		printf( "出力ファイルがオープンできません\n" );
		exit( EXIT_FAILURE );
	}
	while( ( c=getc( fin ) ) != EOF ) {
		putc( c, fout );
	}
	fclose( fin );
	fclose( fout );
	return 0;
}

getc()関数の入力終了チェックをNULLで行うと・・・。

getc()関数が NULL を返すことはないので無限ループになってしまいます。 無限ループでファイルに文字を書き続け、メモリを使いつづけるという恐ろしい事態になってしまいます。 お気を付け下さいね。

【問2】

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( void )
{
	FILE *fw;
	char maker[10], name[12];
	int cc;

	if( ( fw=fopen( "car.dat", "a" ) ) == NULL ) {
		printf( "ファイルがオープンできません\n" );
		exit( EXIT_FAILURE );
	}

	while( 1 ) {
		printf( "メーカー名を入力して下さい(終了条件:end) " );
		scanf( "%s", maker );
		if( strcmp( maker, "end" ) == 0 )
			break;
		printf( "車種を入力して下さい " );
		scanf( "%s", name );
		printf( "排気量を入力して下さい " );
		scanf( "%d", &cc );

		fprintf( fw, "メーカー名:%s ", maker );
		fprintf( fw, "車種:%s ", name );
		fprintf( fw, "排気量:%d\n", cc );
	}
	fclose( fw );
	return 0;
}

【問3】

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main( int argc, char *argv[] )
{
	int i, j, k;
	char buf[256], wkbuf[256], fname[50], fname2[50];
	FILE *fp;		/* 読み込みファイルポインタ */
	FILE *fp2;	/* 書き込みファイルポインタ */
	char *bp=buf;	/* 読み込みエリアのポインタ */
	char *wp=wkbuf;	/* 作業用エリアのポインタ */

	if ( argc != 2 ) {
		printf( "読み込みファイル名を指定してください\n" );
		exit( EXIT_FAILURE );
	}

	/* ファイルオープン */
	if ( ( fp = fopen( argv[1], "r" ) ) == NULL ) {
		printf( "読み込みファイルがオープンできません\n" );
		exit( EXIT_FAILURE );
	}
	strcpy( fname, argv[1] );	/* ※1 */
	strcat( fname, ".BAT" );	/* ※1 */
	if ( ( fp2 = fopen( fname, "w" ) ) == NULL ) {
		printf( "書き込みファイルがオープンできません\n" );
		exit( EXIT_FAILURE );
	}

	/* ファイルから1行読み込み */
	while ( fgets( bp, 256, fp ) != NULL ) {
		for ( i = 0; *( bp+i ) != '\0'; i++ ) {
			/* "." があったら */
			if ( *( bp+i ) == '.' && isalpha( *( bp+i+1 ) ) != 0 ) {
				/* ポインタを戻す */
				k = i;
				while ( k >= 0 && isgraph( *( bp+k ) ) != 0 ) {
					k--;
				}
				/* "COPY fname fname.BAK" 編集 */
				k++;
				for ( j = 0; isgraph( *( bp+k ) ) != 0; j++, k++ ) {
					fname[j] = *( bp+k );
				}
				fname[j] = '\0';
				for ( j = 0; fname[j] != '.'; j++ ) {
					fname2[j] = fname[j];
				}
				fname2[j] = '\0';
				strcpy( wp, "COPY " );	/* ※2 */
				strcat( wp, fname );	/* ※2 */
				strcat( wp, " " );		/* ※2 */
				strcat( wp, fname2 );	/* ※2 */
				strcat( wp, ".BAK\n" );	/* ※2 */
				/* 編集行を書き込み */
				fputs( wp, fp2 );
			}
		}
	}

	fclose( fp );	/* ファイルクローズ */
	fclose( fp2 );

	return 0;
}

この解答例を作成した時点では、sprintf()関数の説明をしていなかったので、上記のような解答例 になっていますが、sprintf( )関数を使うと、

1の個所は sprintf( fname, "%s.BAT", argv[1] );

2の個所は sprintf( wp, "COPY %s %s.BAK\n", fname, fname2 );

に書き直すことが出来ます。(2002.04.02追記)

戻る


banner初心者のためのポイント学習C言語」
Copyright(c) 2000-2004 TOMOJI All Rights Reserved