他の OS と同様に、ファイル処理は Linux の中心的な概念です。システム プログラマーは誰でも、最初のプログラミング割り当ての 1 つとしてそれを学習します。プログラミングのこの側面には、システム ファイルが関係します。
ファイル処理を通じて、システム ファイルに対して作成、変更、削除などの操作を実行できます。この記事では、非常に基本的なファイル処理を取り上げます。この記事が、この多層的な側面の最上層をクリアすることを願っています.
ファイル処理関数
この記事では、ファイル処理でよく使用される次の関数について説明します。
fopen()
FILE *fopen(const char *path, const char *mode);
fopen() 関数は、ファイルを開き、それに I/O ストリームを関連付けるために使用されます。この関数は 2 つの引数を取ります。最初の引数は開くファイルの名前を含む文字列へのポインタで、2 番目の引数はファイルを開くモードです。モードは次のとおりです:
- 'r' :読み取り用にテキスト ファイルを開きます。ストリームはファイルの先頭に配置されます。
- 'r+' :読み取りおよび書き込み用に開きます。ストリームはファイルの先頭に配置されます。
- ‘w’ :ファイルを長さ 0 に切り詰めるか、書き込み用のテキスト ファイルを作成します。ストリームはファイルの先頭に配置されます。
- 'w+' :読み書き用にオープン。ファイルが存在しない場合は作成され、存在しない場合は切り捨てられます。ストリームはファイルの先頭に配置されます。
- 'a' :追加用に開きます (ファイルの最後に書き込みます)。ファイルが存在しない場合は作成されます。ストリームはファイルの末尾に配置されます。
- ‘a+’ :読み取りと追加のために開きます (ファイルの最後に書き込みます)。ファイルが存在しない場合は作成されます。読み取りの最初のファイル位置はファイルの先頭ですが、出力は常にファイルの末尾に追加されます。
fopen() 関数は、成功すると FILE ストリーム ポインターを返し、失敗すると NULL を返します。
fread() と fwrite()
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
関数 fread/fwrite は、fopen 関数で開かれたファイルからデータを読み書きするために使用されます。これらの関数は 3 つの引数を受け入れます。最初の引数は、データの読み取り/書き込みに使用されるバッファーへのポインターです。読み取り/書き込みデータは、それぞれ「size」バイト長の「nmemb」要素の形式です。
成功した場合、fread/fwrite は、fopen 関数によって開かれたストリームに対して実際に読み書きされたバイト数を返します。失敗した場合は、より少ない数の bye (その後、読み取り/書き込みが要求されます) が返されます。
fseek()
int fseek(FILE *stream, long offset, int whence);
fseek() 関数は、ストリームのファイル位置インジケータを新しい位置に設定するために使用されます。この関数は 3 つの引数を受け入れます。最初の引数は、fopen() 関数によって返される FILE ストリーム ポインターです。 2 番目の引数「オフセット」は、シークするバイト数を示します。 3 番目の引数「whence」は、「offset」バイト数のシークがどこから行われるかを示します。 whence に使用できる値は、SEEK_SET、SEEK_CUR、または SEEK_END です。これら 3 つの値は (順番に) ファイルの開始、現在の位置、およびファイルの終了を示します。
成功すると、この関数は 0 を返し、それ以外の場合は -1 を返します。
fclose()
int fclose(FILE *fp);
fclose() 関数は、最初に fopen() によって開かれたストリームをフラッシュし、次に基礎となる記述子を閉じます。正常に完了すると、この関数は 0 を返します。それ以外の場合は、ファイルの終わり (eof) が返されます。失敗した場合、ストリームがさらにアクセスされると、動作は未定義のままになります。
コード
#include<stdio.h> #include<string.h> #define SIZE 1 #define NUMELEM 5 int main(void) { FILE* fd = NULL; char buff[100]; memset(buff,0,sizeof(buff)); fd = fopen("test.txt","rw+"); if(NULL == fd) { printf("\n fopen() Error!!!\n"); return 1; } printf("\n File opened successfully through fopen()\n"); if(SIZE*NUMELEM != fread(buff,SIZE,NUMELEM,fd)) { printf("\n fread() failed\n"); return 1; } printf("\n Some bytes successfully read through fread()\n"); printf("\n The bytes read are [%s]\n",buff); if(0 != fseek(fd,11,SEEK_CUR)) { printf("\n fseek() failed\n"); return 1; } printf("\n fseek() successful\n"); if(SIZE*NUMELEM != fwrite(buff,SIZE,strlen(buff),fd)) { printf("\n fwrite() failed\n"); return 1; } printf("\n fwrite() successful, data written to text file\n"); fclose(fd); printf("\n File stream closed through fclose()\n"); return 0; }
上記のコードは、この実行可能ファイルが実行される場所と同じ場所にテスト ファイル「test.txt」が配置されていることを前提としています。
最初のファイルの内容は次のとおりです:
$ cat test.txt hello everybody
それでは、コードを実行してください:
$ ./fileHandling File opened successfully through fopen() Some bytes successfully read through fread() The bytes read are [hello] fseek() successful fwrite() successful, data written to text file File stream closed through fclose()
ファイル test.txt の内容を再度確認します。以下に示すように、ファイルの内容が変更されました。
$ cat test.txt hello everybody hello