#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