GNU/Linux >> Linux の 問題 >  >> Linux

C でのファイル処理と例 (fopen、fread、fwrite、fseek)

他の 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

Linux
  1. Linuxでの並べ替えコマンドと例

  2. 例を含む10以上のLinuxVIコマンド

  3. Linuxでのchattrコマンドと例

  1. 例を含む10のクイックLinuxテールコマンド

  2. LinuxでのLogrotateの使用ログファイルの管理(例を含む)

  3. 10 Sed (ストリーム エディター) コマンドの例

  1. 17Linuxでの実用的な例を含む便利なtarコマンド

  2. LinuxのZipおよびUnzipコマンドと例

  3. Linuxでの差分コマンドと例