内容

文字列操作関数

ファイル入出力


文字列操作関数

C言語には、文字列操作関数と呼ばれる文字列を取り扱う関数が用意されている。これらの文字列操作関数を使用する場合はstring.hをインクルードする必要がある

 

#include <string.h>

 

strcpy関数

strcpy関数は文字列をchar型の配列にコピーする。関数の形式は以下の通りである。

 

strcpy(アドレス1, アドレス2)

 

アドレス1はコピー先(コピーされる)の文字列の先頭アドレス、アドレス2にはコピー元(コピーする)の文字列の先頭アドレスを指定する。

 

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

main()

{
  char a[] = "abcd";
  char b[5];

  strcpy(b, a);

  printf("%s\n", b);
}

 

strcat関数

strcat関数は2つの文字列を連結して、1つの文字列を作り出す。strcat関数の形式は次の通りである。

 

strcat(アドレス1, アドレス2)

 

アドレス1は連結先(連結される)の文字列の先頭アドレス、アドレス2には連結元(連結する)の文字列の先頭アドレスを指定する。連結先の文字列1の終端に連結元の文字列が連結される。

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

main()

{
  char a[] = "abcd";
  char b[] = "efgh";

  strcat(a, b);

  printf("%s\n", a);
}

 

strlen関数

strlen関数は文字列長さを求める。関数の形式は以下の通りである。

strlen(アドレス1)

 

strlen関数のデータ型はint型である。アドレスには文字列の先頭アドレスを指定する。関数の戻り値が文字列の長さとなる。

 

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

main()

{
  char a[] = "abcd";
  int length;

  length = strlen(a);

  printf("%d\n", length);
}

 

strcmp関数

strcmp関数は2つの文字列を辞書的は並びの順番で大小比較をする。辞書的な並びとは、"abcd""abfg"という2つの文字列を比較する場合、左端から2文字目まで同じであるので、3文字目の'c''f'を比較する。'c'の文字コードは'f'よりも小さいので、"abfg""abcd"よりも辞書的な並びの順番が大きいと判断される。

 

strcmp(アドレス1, アドレス2)

 

関数のデータ型はint型である。アドレス1、アドレス2には比較する文字列の先頭アドレスを指定する。結果は関数の戻り値として返される。比較は次のように行われる。

 

文字列1 文字列2

文字列1 文字列2

0

文字列1 文字列2

 

strcmp関数は文字列が等しいかそうでないかの判定にも用いることができる。

 

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

main()

{
  char a[] = "abcd";
  char b[] = "abef";
  int x;

  x = strcmp(a, b);

  printf("%d\n", x);
}

 


ファイル入出力

今まで扱ってきた標準入出力は主にキーボードからの入力や画面への出力を扱うものであった。C言語では同様の操作でファイルの中身を読み書きすることができる。すなわち、キーボードから入力する変わりにファイルから入力する、もしくは画面に出力する変わりにファイルに出力するといったことが可能である。

ファイルにはテキストファイルとバイナリファイルがあるが、ここではテキストファイルを用いる。また、どちらの形式のファイルにもファイルの終端にEOF(End Of File)が書き込まれている

ファイルの操作を行う場合、ファイルを開く、ファイルを読み書きする、ファイルを閉じるという一連の動作が必要である。

これらのファイルの情報はFILE型のデータとして取り扱われる。

 

FILE *fp;

 

FILE型変数の中にはファイルを取り扱うための各種情報が格納されるが、通常、FILE型の変数の中身をユーザーが操作することはない。

次に、ファイルを開くためにはfopen関数を用いる。fopen関数は開きたいファイルのファイル名とファイルを開くモードを指定する。

 

fopen("filename", "ファイルを開くモード")

 

fopen関数は開いたファイルの情報を示すファイル・ポインタを返す。以降、ファイルが閉じられるまで、この得られたファイル・ポインタを用いてファイルの操作を行う。ファイルが開けなかった場合はNULLポインタを返す。

ファイルを開くモードは、ファイルを読み込むために開くのか、書き込むために開くのかを指定する。書き込むためには"r"を、読み込むためには"w"を指定する。

これらのファイルを開くまでの一連の処理は以下の通りである。

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

main()
{
  FILE *fp;

  /*
ファイルを読み込むために開く  */
  fp = fopen("filename", "r");

  /*ファイルが開けなかった場合はプログラムの終了*/
  if(fp == NULL){
    printf("Cannot Open File.\n");
    exit(0);
  }
}

 

このサンプル中のexit(0)はプログラムの強制終了を行う命令である。stdlib.hをインクルードしているのはexit関数を使用できるようにするためである。

ファイルを閉じるためにはfclose関数を用いる。fclose関数はファイル・ポインタで指定されたファイルを閉じる。

 

fclose(ファイル・ポインタ)

 

ファイルを開き閉じるまでの一連の処理は以下の通りである。

 

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

main()
{
  FILE *fp;

  /*
ファイルを読み込むために開く  */
  fp = fopen("filename", "r");

  /*ファイルが開けなかった場合はプログラムの終了*/
  if(fp == NULL){
    printf("Cannot Open File.\n");
    exit(0);
  }

  /* ファイルを閉じる */
  fclose(fp);
}

 

ファイルへの入出力

ファイルにデータを書き込んだり、読み込んだりするにはfprintf関数やfscanf関数を用いる。fprintf関数とfscanf関数の使用方法は以下の通りである。

 

fprintf(ファイルポインタ, 書式指定子, 1, 式2, , n)

fscanf(ファイルポインタ, 書式指定子, &変数1, &変数2, , &変数n)

 

fprintf関数もfscanf関数もファイル・ポインタを指定する以外、printf関数やscanf関数と使用方法は同じである。

fscanf関数の場合、scanfでリターンキーを打つ代わりに、テキストファイルの改行が同じ働きをする。また、fscanfは戻り値としてint型を返し、ファイルから読み込むものが無い場合EOFを返す

以下のプログラムはファイル名sample.txtのテキストファイルに書き込まれているすべてのint型のデータを読み込み合計するプログラムである。

 

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

main()
{
  FILE *fp;
  int x, count, flag;

  count = 0;

  /*
ファイルを読み込むために開く  */
  fp = fopen("filename", "r");

  /*ファイルが開けなかった場合はプログラムの終了*/
  if(fp == NULL){
    printf("Cannot Open File.\n");
    exit(0);
  }

  /*
無間ループ */
  while(1){
    /* int
型のデータを読み込む */
    flag = fscanf(fp, "%d", &x);

    /*
読み込むものが無い場合は結果を表示して
  
      無間ループを抜ける */
    if(flag == EOF){
      printf("%d\n", count);
      break;
    }

    /*
読み込むものがある場合は合計に足し込む */
    else{
      count += x;
    }
  }

  /* ファイルを閉じる */
  fclose(fp);
}