feof

int feof( FILE *fp )

ファイルfpがファイルエンドなら非0を返す。


while ( !feof( fp ) ) {
 c = getc( fp );
 ・・・
}


ファイルfpがファイルエンドでない間、処理を続ける。
C > 標準関数 > ファイル入出力関数 | comments (0) | trackbacks (0)

ファイル入出力主要関数一覧

FILE *fi;
FILE *fo;
int a, c;
char str[256];
とした場合

putc1文字書き出しputc( c, fo )
fputc同上fputc( c, fo )
getc1文字読み込みc = getc( fi )
fgetc同上c = fgetc( fi )
fputs1行書き出しfputs( str, fo )
fgets1行読み込みfgets( str, 256, fi )
fprintf書式付き書き出しfprintf( fo, "%d\n", a );
fscanf書式付き読み込みfscanf( fi, "%d", &a );

fgetsの場合、文字列の最後に"\0"が付加されなければならないので
上記の例では読み込めるのは255文字までとなる。
C > 標準関数 > ファイル入出力関数 | comments (0) | trackbacks (0)

コマンドライン引数の取得

コマンドラインからの引数を確認するプログラム

#include <stdio.h>

void main( int argc, char *argv[] )
{
 printf( "argc:%d\n", argc );
 for ( int i = 0; i < argc; i++ )
  printf( "argv[ %d ]:%s\n", i, argv[ i ] );
}


以下のような内容の起動用バッチも作成しておきます。

適当.exe 第1引数 第2引数
pause


実行結果

argc:3
argv[ 0 ]:適当.exe
argv[ 1 ]:第1引数
argv[ 2 ]:第2引数


argcはコマンドラインからmain関数へ渡されたすべての引数の数です。
argv[0]はコマンド名そのものを示しています。
"適当.exe"から見た場合、第1引数はargv[1]、第2引数はargv[2]に入ります。

これを利用してファイル入出力処理をコマンドラインから行う事ができます。

ファイルから1文字ずつリードしてディスプレイに表示していくプログラム

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

void main( int argc, char *argv[] )
{
 FILE *fp;
 int c;

 if ( argc != 2 ) {
  printf( "引数の数が違います\n" );
  exit( 1 );
 }
 if ( ( fp = fopen( argv[1], "r" ) ) == NULL ) {
  printf( "入力ファイルがオープンできません\n" );
  exit( 1 );
 }

 while ( ( c = getc( fp ) ) != EOF )
  putchar( c );

 fclose( fp );
}

C > 標準関数 > ファイル入出力関数 | comments (0) | trackbacks (0)

条件付きコンパイル


#include <stdio.h>

#define DEBUG

void main()
{
 printf( "処理開始\n" );

#ifdef DEBUG
 printf( "%s\n", __TIME__ );
 printf( "%s\n", __DATE__ );
 printf( "%s\n", __FILE__ );
 printf( "%d\n", __LINE__ );
#endif

 printf( "処理終了\n" );
}


出力結果

処理開始
11:56:29
Oct 19 2006
C:\xxx\xxx\xxx\tekito.cpp
13
処理終了




#include <stdio.h>

//#define DEBUG

void main()
{
 printf( "処理開始\n" );

#ifdef DEBUG
 printf( "%s\n", __TIME__ );
 printf( "%s\n", __DATE__ );
 printf( "%s\n", __FILE__ );
 printf( "%d\n", __LINE__ );
#endif

 printf( "処理終了\n" );
}

出力結果

処理開始
処理終了

C > プリプロセッサ | comments (0) | trackbacks (0)

処理系が定義しているマクロ

C言語の処理系は次の4種類のマクロを標準マクロとして定義しています。
__TIME__コンパイル時刻を「時:分:秒」の書式で表す文字列
__DATE__コンパイル日付を「月 日 年」の書式で表す文字列
__FILE__処理中のソースプログラムの名前を表す文字列
__LINE__処理中のソースプログラムの行番号を表す10進数(先頭行は1)
C > プリプロセッサ | comments (0) | trackbacks (0)

関数のポインタ配列

構文
戻り値型 (*識別子)(パラメータ型リスト)


#include <stdio.h>

int func1( int, int );
int func2( int, int );

void main()
{
 int ( *funcp[] )( int, int ) = { func1, func2 };
 printf( "%d\n", funcp[0]( 1, 2 ) );
 printf( "%d\n", funcp[1]( 1, 2 ) );
}

int func1( int i, int j )
{
 return i + j;
}

int func2( int i, int j )
{
 return i - j;
}


実行結果

3
-1

C > 関数 | comments (0) | trackbacks (0)

関数の再帰呼び出し


#include <stdio.h>

int loopA( int );
void loopB( int );

void main()
{
 int i = 3;
 loopA( i );
 printf( "\n" );
 loopB( i );
}

int loopA( int n )
{
 printf( "loopA-out1:%d\n", n );
 if ( !n ) {
  printf( "出力終了\n" );
  return 0;
 }
 return loopA( --n );
 printf( "loopA-out2:%d\n", n );
}

void loopB( int n )
{
 printf( "loopB-out1:%d\n", n );
 if ( !n ) {
  printf( "出力終了\n" );
  return;
 }
 loopB( --n );
 printf( "loopB-out2:%d\n", n );
}


出力結果

loopA-out1:3
loopA-out1:2
loopA-out1:1
loopA-out1:0
出力終了

loopB-out1:3
loopB-out1:2
loopB-out1:1
loopB-out1:0
出力終了
loopB-out2:0
loopB-out2:1
loopB-out2:2

C > 関数 | comments (0) | trackbacks (0)