ファイルから1行ずつ読み込む/書き込む


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

void main( int argc, char *argv[] )
{
 FILE *fpIn, *fpOut;
 char str[256];

 // 引数チェック
 if ( argc != 3 ) {
  printf( "引数の数が違います\n" );
  exit( 1 );
 }

 // ファイルオープン
 if ( ( fpIn = fopen( argv[1], "r" ) ) == NULL ) {
  printf( "入力ファイルがオープンできません\n" );
  exit( 1 );
 }
 if ( ( fpOut = fopen( argv[2], "w" ) ) == NULL ) {
  printf( "出力ファイルがオープンできません\n" );
  exit( 1 );
 }

 // メイン処理
 while ( ( fgets( str, 256, fpIn ) ) != NULL )
  fputs( str, fpOut );

 // ファイルクローズ
 fclose( fpIn );
 fclose( fpOut );
}


fgetsは改行を取り除かずに入力し、
fputsは改行を付けずに出力します。

改行文字を削除するには

str[ strlen( str ) - 1 ] = '\0';
または
*( str + strlen( str ) -1 ) = '\0';


とします。
C > 標準関数 > ファイル入出力関数 | comments (0) | trackbacks (0)

ファイルから1データずつ読み込む/書き込む


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

void main( int argc, char *argv[] )
{
 FILE *fpIn, *fpOut;
 int data, sum = 0;

 // 引数チェック
 if ( argc != 3 ) {
  printf( "引数の数が違います\n" );
  exit( 1 );
 }

 // ファイルオープン
 if ( ( fpIn = fopen( argv[1], "r" ) ) == NULL ) {
  printf( "入力ファイルがオープンできません\n" );
  exit( 1 );
 }
 if ( ( fpOut = fopen( argv[2], "w" ) ) == NULL ) {
  printf( "出力ファイルがオープンできません\n" );
  exit( 1 );
 }

 // メイン処理
 while ( ( fscanf( fpIn, "%d", &data ) ) != EOF )
  sum += data;

 fprintf( fpOut, "合計:%d", sum );

 // ファイルクローズ
 fclose( fpIn );
 fclose( fpOut );
}

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

ファイルから1文字ずつ読み込む/書き込む


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

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

 // 引数チェック
 if ( argc != 3 ) {
  printf( "引数の数が違います\n" );
  exit( 1 );
 }

 // ファイルオープン
 if ( ( fpIn = fopen( argv[1], "r" ) ) == NULL ) {
  printf( "入力ファイルがオープンできません\n" );
  exit( 1 );
 }
 if ( ( fpOut = fopen( argv[2], "w" ) ) == NULL ) {
  printf( "出力ファイルがオープンできません\n" );
  exit( 1 );
 }

 // メイン処理
 while ( ( c = getc( fpIn ) ) != EOF )
  fputc( c, fpOut );

 // ファイルクローズ
 fclose( fpIn );
 fclose( fpOut );
}

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

atoi/atol/atof

int atoi( const char *str )
long atol( const char *str )
double atof( const char *str )

atoi関数は文字列strをint型に変換して返す。
atol関数は文字列strをlong型に変換して返す。
atof関数は文字列strをdouble型に変換して返す。

i = atoi( str )

文字列strをint型に変換してint型変数iに代入する

l = atol( str )

文字列strをlong型に変換してlong型変数lに代入する

d = atof( str )

文字列strをdouble型に変換してdouble型変数dに代入する


#include <stdio.h>
#include <stdlib.h>
void main()
{
 int d;
 printf( "%d\n", d = atoi( " 100" ) );
 printf( "%d\n", d = atoi( " 100 234" ) );
 printf( "%d\n", d = atoi( "-200" ) );
 printf( "%d\n", d = atoi( "+200" ) );
 printf( "%d\n", d = atoi( "- 200" ) );
 printf( "%d\n", d = atoi( "300abc4" ) );
}


実行結果

100
100
-200
200
0
300


・先行する空白は無視される。
・'+'または'-'がある時は符合とされる。
・符号指定が省略された場合は'+'とみなされる。
・文字列に数字でない文字が現れたら、そこで変換を終了する
C > 標準関数 > 一般ユーティリティ | comments (0) | trackbacks (0)

abs/labs/fabs

int abs( int n )
long labs( long n )
double fabs( double x )

abs関数はint型数値nの絶対値を返す。
labs関数はlong型数値nの絶対値を返す。
fabs関数はdouble型数値xの絶対値を返す。


printf( "%d\n", abs( -321 ) );
printf( "%ld\n", labs( -987654321 ) );
printf( "%4.2f\n", fabs( -23.4 ) );


実行結果

321
987654321
23.40

C > 標準関数 > 数学関数 | comments (0) | trackbacks (0)

div/ldiv

div_t div( int numer, int denom )
ldiv_t ldiv( long int numer, long int denom )

int型の引数を使用してdivを呼び出すと、
numer を denom で割り、商および剰余を求める。
商int quotおよび剰余int remで構成されるdiv_t型の構造体が返される。

ldiv関数は、引数および返される構造体のメンバがすべて
long int型である点を除いて、div関数と同じである。


div_t d;
d = div( 20, 6 );
printf( "商:%d 剰余:%d\n", d.quot, d.rem );


実行結果
商:3 剰余:2
C > 標準関数 > 一般ユーティリティ | comments (0) | trackbacks (0)

fmod

double fmod( double x, double y )

浮動小数点数の剰余を計算する。

z = fmod( 10.5, 3.2 );

zは0.9になる。
C > 標準関数 > 数学関数 | comments (0) | trackbacks (0)

ceil/floor

double ceil( double x )
double floor( double x )

ceil関数は数値を切り上げる。
floor関数は数値を切り下げる。


printf( "%4.2f\n", ceil(12.11) );
printf( "%4.2f\n", ceil(-5.68) );


実行結果

13.00
-5.00




printf( "%4.2f\n", floor(12.11) );
printf( "%4.2f\n", floor(-5.68) );


実行結果

12.00
-6.00

C > 標準関数 > 数学関数 | comments (0) | trackbacks (0)

rand/srand

int rand( void )
void srand( unsigned int seed )

rand関数は0〜32767までの整数乱数値を発生させる。

単純にrand関数を使うと毎回同じ乱数列になる為
毎回異なる乱数列を得たい場合は
時間関数timeと乱数系列初期値設定関数srandを使い
次のように記述する。

srand( ( unsigned )time( NULL ) );


サンプル

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

void main()
{
 int i;
 srand( ( unsigned )time( NULL ) );

 // 0〜32767の整数乱数
 for ( i=0; i<=10; i++ ) printf( "%d\n", rand() );
 // 0〜1の実数乱数
 for ( i=0; i<=10; i++ ) printf( "%f\n", rand() / 32767.0 );
 // 0〜1未満の実数乱数
 for ( i=0; i<=10; i++ ) printf( "%f\n", rand() / 32767.1 );
 // このように書いているのもある
 for ( i=0; i<=10; i++ ) printf( "%f\n", rand() / 32768.0 );
 // 1〜6の整数乱数
 for ( i=0; i<=10; i++ ) printf( "%d\n", ( int )( ( rand() / 32767.1 * 6 ) + 1 ) );
 // これだと商が1.0の場合に7がでてしまう
 for ( i=0; i<=10; i++ ) printf( "%d\n", ( int )( ( rand() / 32767.0 * 6 ) + 1 ) );
}


以下のような式もあったりします。
( rand() % ( 上限 - ( 下限 ) + 1 ) ) + 下限

・0〜9の値
rand() % 10

・1〜6の値
( rand() % 6 ) + 1

・-3〜3の値
( rand() % 7 ) - 3
C > 標準関数 > 一般ユーティリティ | comments (0) | trackbacks (0)

strcmp

int strcmp( const char *str1, const char *str2 )

文字列str1と文字列str2を比較し、以下の値を返す。
str1 と str2 の関係
< 0str1 は str2 より小さい
0str1 と str2 は等しい
> 0str1 は str2 より大きい



if ( strcmp( str, "aaa" ) == 0 ) {
 ・・・
}


もし文字列strが"aaa"なら処理をする
C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)

strcpy

char *strcpy( char *dest, const char *source )

文字列destに文字列sourceをコピーする

strcpy( s, "strcpy test" );

文字配列sに"strcpy test"をコピーする
C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)

qsort

void qsort( void *base, size_t num, size_t width
, int ( __cdecl *compare )( const void *, const void * ) )


widthに指定したバイト数の要素num個から成る配列baseを並べ替える。
base引数は、並べ替える配列のベースへのポインタである。
引数compareは、比較関数へのポインタである。
qsort 関数は、並べ替えの間に次のcompareルーチンを1回または複数回呼び出し、
そのたびに2つの配列要素へのポインタを渡す。
qsort関数は、並べ替えた後の要素で、この配列を上書きする。

比較関数はユーザーが自作する。
また、qsort関数の第4引数に示された仕様でなければならない。

比較関数は、要素を比較し、次のいずれかの値を返すこと。
< 0昇順:elem1はelem2より小さい、降順:elem1はelem2より大きい
0elem1 は elem2 に等しい
> 0昇順:elem1はelem2より大きい、降順:elem1はelem2より小さい



#include
#include // qsort用
#include // strcmp用

int intcmp( const void *, const void * );
int intrcmp( const void *, const void * );
int dblcmp( const void *, const void * );
int mystrcmp( const void *, const void * );

void main()
{
 int id[10] = { 45, 65, 23, 87, 53, 67, 32, 19, 73, 66 };
 double dd[10] = { 3.56, 7.43, 5.76, 3.67, 9.65, 5.64, 2.75, 4.55, 6.32, 4.78 };
 char *pstr[5] = { "apple", "orange", "banana", "lemon", "peach" };
 int i;

 printf( "--int昇順--\n" );
 qsort( id, 10, sizeof( int ), intcmp );
 for ( i=0; i<10; i++ ) printf( "%d ", id[i] );
 puts( "\n" );

 printf( "--int降順--\n" );
 qsort( id, 10, sizeof( int ), intrcmp );
 for ( i=0; i<10; i++ ) printf( "%d ", id[i] );
 puts( "\n" );

 printf( "--double昇順--\n" );
 qsort( dd, 10, sizeof( double ), dblcmp );
 for ( i=0; i<10; i++ ) printf( "%4.2f ", dd[i] );
 puts( "\n" );

 printf( "--文字列昇順--\n" );
 qsort( pstr, 5, sizeof( char* ), mystrcmp );
 for ( i=0; i<5; i++ ) printf( "%s ", pstr[i] );
 puts( "\n" );

}

int intcmp( const void *a, const void *b )
{
 return( *(int*)a - *(int*)b );
}

int intrcmp( const void *a, const void *b )
{
 return( *(int*)b - *(int*)a );
}

int dblcmp( const void *a, const void *b )
{
 if ( *(double*)a < *(double*)b )
  return -1;
 else if ( *(double*)a == *(double*)b )
  return 0;
 else
  return 1;
}

int mystrcmp( const void *a, const void *b )
{
 return strcmp( *(char**)a, *(char**)b );
}


実行結果

--int昇順--
19 23 32 45 53 65 66 67 73 87

--int降順--
87 73 67 66 65 53 45 32 23 19

--double昇順--
2.75 3.56 3.67 4.55 4.78 5.64 5.76 6.32 7.43 9.65

--文字列昇順--
apple banana lemon orange peach


自作する比較関数ですが、古いテキストの記述方法だと蹴られまくりました。
恐るべし。
C > 標準関数 > 一般ユーティリティ | comments (0) | trackbacks (0)

sprintf

int sprintf( char *buffer, const char *format[, argument] ... )

対応する

#include <stdio.h>
void main()
{
 char str[256];
 sprintf( str, "%c%d", 65, 123 );
 puts( str );
}


実行結果
A123
C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)

strcat

char *strcat( char *dest, const char *source )

文字列destの後ろに文字列sourceを連結する。

strcat( str, "xyz" );

文字列strに"xyz"をつなぐ
C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)

strchr

char *strchr( const char *str, int c )

文字列strの先頭から文字cを探し、その位置を返す。
見つからない時はNULLを返す。


char *p;
char s[] = "strchr test";
p = strchr( s, 'c' );
puts( p );


ポインタpに文字列s内の文字'c'のあるアドレスが返る。

出力結果
chr tst
C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)