#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 を返すことはないので無限ループになってしまいます。 無限ループでファイルに文字を書き続け、メモリを使いつづけるという恐ろしい事態になってしまいます。 お気を付け下さいね。
#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; }
#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追記)
▼戻る▼
「初心者のためのポイント学習C言語」 Copyright(c) 2000-2004 TOMOJI All Rights Reserved