Saturday, September 1, 2018

C - ファイル I / O

最後の章では、Cプログラミング言語で扱われる標準入出力デバイスについて説明しました。 この章では、Cプログラマがどのようにデータストレージ用にテキストファイルまたはバイナリファイルを作成、オープン、クローズできるかについて説明します。

ファイルは、テキストファイルまたはバイナリファイルであるかどうかにかかわらず、一連のバイトを表します。 Cプログラミング言語は、ストレージデバイス上のファイルを処理するための高水準関数と低レベル(OSレベル)呼び出しへのアクセスを提供します。 この章では、ファイル管理の重要な要求について説明します。


ファイルを開く
fopen()関数を使用すると、新しいファイルを作成したり、既存のファイルを開くことができます。 この呼び出しは、FILE型のオブジェクトを初期化します。このオブジェクトには、ストリームを制御するために必要なすべての情報が含まれています。 この関数呼び出しのプロトタイプは次のとおりです

FILE *fopen( const char * filename, const char * mode );

ここで、filenameは文字列リテラルで、ファイルの名前を指定し、アクセスモードは次のいずれかの値を取ることができます
Sr.No.Mode & Description
1
r
既存のテキストファイルを読み込み用に開きます。
2
w
書き込み用のテキストファイルを開きます。 存在しない場合は、新しいファイルが作成されます。 ここでプログラムはファイルの先頭からコンテンツを書き始めるでしょう。
3
a
追加モードで記述するためのテキストファイルを開きます。 存在しない場合は、新しいファイルが作成されます。 ここであなたのプログラムは、既存のファイルコンテンツにコンテンツを追加し始めます。
4
r+
読み書き用のテキストファイルを開きます。
5
w+
読み書き用のテキストファイルを開きます。 存在する場合は最初にファイルを長さゼロに切り捨てます。存在しない場合はファイルを作成します。
6
a+
読み書き用のテキストファイルを開きます。 ファイルが存在しない場合は作成されます。 読書は最初から始まりますが、執筆は追加することしかできません。
バイナリファイルを扱う場合は、上記のアクセスモードの代わりに以下のアクセスモードを使用します
"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"


ファイルを閉じる
ファイルを閉じるには、fclose()関数を使用します。 この関数のプロトタイプは

int fclose( FILE *fp );

fclose( - )関数は、成功すると0を返し、ファイルを閉じるときにエラーが発生した場合はEOFを返します。 この関数は、実際にバッファに保留中のデータをファイルにフラッシュし、ファイルを閉じ、ファイルに使用されているすべてのメモリを解放します。 EOFは、ヘッダファイルstdio.hで定義される定数です。

ファイルを読み書きするためにC標準ライブラリが提供するさまざまな関数が文字単位で、または固定長文字列形式で提供されています。


ファイルの書き込み
以下は、個々の文字をストリームに書き込む最も簡単な関数です
int fputc( int c, FILE *fp );

関数fputc()は、引数cの文字値をfpが参照する出力ストリームに書き込みます。 成功した場合に書き込まれた文字を返し、そうでない場合はエラーを返します。 次の関数を使用して、ヌルで終了する文字列をストリームに書き込むことができます
int fputs( const char *s, FILE *fp );

関数fputs()は、文字列sをfpが参照する出力ストリームに書き込みます。 成功した場合は負の値を返し、それ以外の場合はエラーを返します。 int fprintf(FILE * fp、const char * format、...)関数を使用して文字列をファイルに書き込むこともできます。 次の例を試してみてください。

/ tmpディレクトリがあることを確認してください。 そうでない場合は、先に進む前に、このディレクトリをマシン上に作成する必要があります。
#include <stdio.h>

main() {
   FILE *fp;

   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);
}

上記のコードをコンパイルして実行すると、/ tmpディレクトリにtest.txtという新しいファイルが作成され、2つの異なる機能を使用して2行が書き込まれます。 次のセクションでこのファイルを読んでみましょう。


ファイルを読む
ファイルから1文字を読み込む最も簡単な関数は次のとおりです
int fgetc( FILE * fp );
fgetc()関数は、fpによって参照される入力ファイルから文字を読み込みます。 戻り値は文字読み込みであり、エラーの場合はEOFを返します。 次の関数は、ストリームから文字列を読み込むことを可能にします

char *fgets( char *buf, int n, FILE *fp );
関数fgets()は、fpで参照される入力ストリームからn-1文字までを読み込みます。 これは、読み込み文字列をバッファbufにコピーし、ヌル文字を付加して文字列を終了します。

この関数が最大文字数を読み取る前に改行文字 '\ n'またはファイルEOFの終わりに遭遇した場合、改行文字を含むその点まで読み取られた文字のみを返します。 int fscanf(FILE * fp、const char * format、...)関数を使用してファイルから文字列を読み取ることもできますが、最初の空白文字に遭遇した後は読み込みを停止します。

#include <stdio.h>

main() {

   FILE *fp;
   char buff[255];

   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1 : %s\n", buff );

   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);

}
上記のコードをコンパイルして実行すると、前のセクションで作成されたファイルが読み込まれ、次の結果が生成されます

1 : This
2: is testing for fprintf...

3: This is testing for fputs...

ここで何が起こったのかをもう少し詳しく見てみましょう。 最初に、fscanf()はちょうどこれを読んだので、それはスペースを見つけたので、2番目の呼び出しは行の終わりに遭遇するまで残りの行を読み込むfgets()です。 最後に、最後の呼び出しfgets()は2行目を完全に読み込みます。


バイナリI / O関数
バイナリ入力と出力に使用できる2つの関数があります
size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
              
size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);

これらの関数の両方は、メモリのブロック(通常は配列または構造体)の読み取りまたは書き込みに使用する必要があります。


No comments:

Post a Comment

Interfaces and their protocol stacks

インタフェースとそのプロトコルスタック 主要なネットワーク要素に精通した後、これら要素間のインタフェースをよりよく知る時期が来ています。 インタフェースは、MME、SGWおよびPGWが他のネットワーク要素(例えば、HSSまたはPCRF)と協働することを可能にする。 それらの...