[C / C ++] C言語でファイルを操作する方法

C言語でファイルを操作する方法はたくさんありますが、

まず、いくつかの概念を明確にする必要があります。

プログラム設計では、一般的にプログラムファイルとデータファイルの2種類のファイルについて話します。

ファイル名:ファイルには、ユーザーの識別と参照のために一意のファイル識別子が必要です。ファイル名は、ファイルパス+ファイル名トランク+ファイルサフィックスの3つの部分で構成されます。

ファイルの種類:データの構成に応じて、データファイルはテキストファイルまたはバイナリファイルと呼ばれます。(同じサイズのデータ​​を保存する理由は、バイナリファイルのサイズがテキストファイルよりも小さいことを図に示しています)

ファイルバッファ:ANSIC標準では、「バッファファイルシステム」を使用してデータファイルを処理します。いわゆるバッファファイルシステムとは、プログラムで使用されている各ファイルのメモリに「ファイルバッファ」を自動的に開くことを意味します。バッファのサイズは、Cコンパイルシステムによって決定されます。

ファイルポインタ:C言語では、ポインタ変数はファイルを指すために使用されます。このポインタはファイルポインタと呼ばれます。ファイルポインタが指すファイルに対して、さまざまな操作を実行できます。ファイルの名前、ファイルのステータス、ファイルの現在の場所など。この情報は構造変数に格納されます。構造体タイプは、FILEという名前のシステムによって宣言されます。たとえば、stdio.hヘッダーファイルには、次のファイルタイプ宣言があります。

struct _iobuf {
    char *_ptr;
    int _cnt;
    char *_base;
    int _flag;
    int _file;
    int _charbuf;
    int _bufsiz;
    char *_tmpfname;
    };
typedef struct _iobuf FILE;

このFILE構造の変数は、FILEポインターを介して維持できます。FILE *ポインター変数を作成します。

FILE* pf;//文件指针变量

定義pfは、FILEタイプのデータを指すポインター変数です。それに関連付けられているファイルは、ファイルポインタ変数を介して見つけることができます。

 いくつかのファイルの基本的な操作機能を以下に説明します。

1.ファイルの開閉

    読み書きする前にファイルを開き、使用終了後にファイルを閉じてください。

     ANSICは、fopen関数を使用してファイルを開くことを規定しており、ファイルを指すためにFILE *ポインター変数が返されます。fcloseでファイルを閉じます。

FILE * fopen ( const char * filename, const char * mode );
int fclose ( FILE * stream );

    FILE * fopen(const char * filename、const char * mode);その機能は、指定されたモードモードを使用して、filenameが指すファイルを開くことです。ファイルが正常に開かれると、ストリームへのファイルポインタが返されます。ファイルを開くことができない場合、NULLが返され、エラーコードがエラーで保存されます。

    int fclose(FILE * stream)は、ストリームストリームを閉じます。すべてのバッファをフラッシュします。戻り値:ストリームが正常に閉じられた場合、fcloseは0を返し、それ以外の場合はEOF(-1)を返します。(ストリームがNULLで、プログラムが実行を継続できる場合、fcloseはエラー番号をEINVALに設定し、EOFを返します。)

    上記の開封方法は以下の通りです。

     ファイル使用モードの意味指定したファイルが存在しない場合
    「r」(読み取り専用)    :データを入力するには、既存のテキストを開きます。ファイルが存在しない場合、ファイルにエラーがあります。
    「W」(書き込み専用) :データを出力するには、テキストファイルを開きます。ファイルが存在しない場合は、新しいファイルを作成します。
    「A」(   追加:テキストファイルの最後にデータを追加します。ファイルが存在しない場合、エラーが発生します。
    「Rb」(読み取り専用)   :データを入力するには、バイナリファイルを開きます。ファイルが存在しない場合、エラーが発生します。
    「Wb」(書き込み専用)  :データを出力するには、バイナリファイルを開きます。ファイルが存在しない場合は、新しいファイルを作成します。
    「Ab」(  追加:バイナリファイルの末尾にデータを追加します。ファイルが存在しない場合、エラーが発生します。
    「R +」(読み取りと書き込み)    :読み取りと書き込み用のテキストファイルを開きます。ファイルが存在しない場合、エラーが発生します。
    「W +」(読み取りと書き込み):読み取りと書き込みを行うために、新しいファイルが提案されます。ファイルが存在しない場合は、新しいファイルを作成します。
    「A +」(読み取りと書き込み)   :ファイルを開き、ファイルの最後で読み取りと書き込みを行います。ファイルが存在しない場合は、新しいファイルを作成します。
    「Rb +」(読み取りと書き込み)読み取りと書き込み用のバイナリファイルを開きます。ファイルが存在しない場合、エラーが発生します。
    「Wb +」(読み取りと書き込み):読み取りと書き込みを行うには、新しいバイナリファイルを作成します。ファイルが存在しない場合は、新しいファイルを作成します。
    「Ab +」(読み取りと書き込み):バイナリファイルを開き、ファイルの最後で読み取りと合計を行います。ファイルが存在しない場合は、新しいファイルを書き込んで作成します。

     といった:

#include <stdio.h>
int main ()
{
    FILE * pFile;
    pFile = fopen ("myfile.txt","w");
    if (pFile!=NULL)
    {
        fputs ("fopen example",pFile);
        fclose (pFile);
    }
    return 0;
}

    開いた後、pfileポインタの有効性を判断します。

2.ファイルの順次読み取りと書き込み

   いくつかの入力および出力関数を紹介します。

   (1)文字入力関数int fgetc(FILE * stream) は、指定されたストリームから次の文字(符号なし文字)を取得し、位置識別子を前方に移動します。stream は、操作が実行されるストリームを識別するFILEオブジェクトへのポインターです。この関数は、読み取られた文字をunsigned char強制の形式でintに返します。ファイルの終わりに到達した場合、または読み取りエラーが発生した場合は、EOFを返します。適用対象:すべての入力ストリーム。

   (2)文字出力関数 int fputc(int char、FILE * stream) は、パラメータcharで 指定され文字(符号なし文字)を指定されたストリームストリームに書き込み 、位置識別子を前方に移動します。char は書き込まれる文字です。文字は、対応するint値とともに渡されます。streamは、書き込まれる文字のストリームを識別するFILEオブジェクトへのポインターです。エラーが発生しなければ、書き込まれた文字が返されます。エラーが発生した場合、EOFが返され、エラー識別子が設定されます。適用対象:すべての入力ストリーム。

   (3)テキスト行入力関数char * fgets(char * str、int n、FILE * stream) は、指定されたストリームから行を読み取り、strが 指す文字列に格納 ます 状況に応じて、(n-1)文字が読み取られたとき、改行文字が読み取られたとき、またはファイルの終わりに達したときに停止し ます。str は、読み取る文字列を格納する文字配列へのポインタです。n は、読み取られる最大文字数(最後のヌル文字を含む)です。通常、strとして渡される配列の長さが使用されます。streamは、文字が読み取られるストリームを識別するFILEオブジェクトへのポインタです。成功した場合、関数は同じstrパラメーターを返します。ファイルの終わりに到達した場合、または文字が読み取られなかった場合、strの内容は変更されず、nullポインターが返されます。エラーが発生した場合、nullポインタが返されます。適用対象:すべての入力ストリーム。

   (4)テキスト行出力関数 int fputs(const char * str、FILE * stream) は、指定されたストリームストリームに文字列を書き込みますが、ヌル文字は含まれません。strは、書き込まれるヌル終了文字シーケンスを含む配列です。stream- これは、文字列が書き込まれるストリームを識別するFILEオブジェクトへのポインタです。この関数は、負でない値、またはエラーが発生した場合はEOFを返します。適用対象:すべての入力ストリーム。

   (5)フォーマットされた入力関数int fputs(const char * str、FILE * stream) は、指定されたストリームストリームに文字列を書き込みますが、ヌル文字は含まれません。strは、書き込まれるヌル終了文字シーケンスを含む配列です。streamは、文字列に書き込まれるストリームを識別するFILEオブジェクトへのポインタです。この関数は、負でない値、またはエラーが発生した場合はEOFを返します。適用対象:すべての入力ストリーム。

   (6)フォーマットされた出力関数int fprintf(FILE * stream、const char * format、...)は、 フォーマットされた出力をストリームに送信します。streamは、ストリームを識別するFILEオブジェクトへのポインタです。formatは、ストリームに書き込まれるテキストを含むC文字列です。埋め込みフォーマットタグを含めることができます。このタグは、後続の追加パラメーターで指定された値に置き換えて、必要に応じてフォーマットすることができます。適用対象:すべての入力ストリーム。

   (7) 指定されたフローストリームからのバイナリ入力size_t fread(void * ptr、size_t size、size_t nmemb、FILE * stream)は、が  指すptr配列に データを読み取ります ptr は、サイズ* nmemb バイトの最小サイズのメモリブロックへのポインタ です。sizeは、読み取られる各要素のサイズ(バイト単位)です。nmembは要素の数であり、各要素のサイズはsizeバイトです。streamは、入力ストリームを指定するFILEオブジェクトへのポインターです。正常に読み取られた要素の総数は、整数データ型であるsize_tオブジェクトとして返されます。合計がnmembパラメーターと異なる場合は、エラーが発生したか、ファイルの終わりに達した可能性があります。適用対象:ファイル。

   (8)バイナリ出力size_t fwrite(const void * ptr、size_t size、size_t nmemb、FILE * stream) は 、ptrが指す配列内のデータを指定された ストリームに書き込み ます 。ptrは、書き込まれる要素の配列へのポインタです。size は、書き込まれる各要素のサイズ(バイト単位)です。nmemb は要素の数であり、各要素のサイズはsizeバイトです。stream は、出力ストリームを指定するFILEオブジェクトへのポインターです。成功すると、関数は整数データ型である要素の総数を表すsize_tオブジェクトを返します。数値がnmembパラメーターと異なる場合、エラーが表示されます。適用対象:ファイル。

3.ファイルのランダムな読み取りと書き込み

   (1)fseekは、ファイルポインタの位置とオフセットに従ってファイルポインタを検索します。

int fseek ( FILE * stream, long int offset, int origin );

    成功した場合、関数はゼロを返します。それ以外の場合、関数はゼロ以外の値を返します。streamは、ストリームを識別するFILEオブジェクトへのポインタです。offset は、バイト単位の理由の相対オフセットです。whence は、オフセットが追加され始める位置です。通常、次の定数のいずれかとして指定されます。

絶え間ない 説明
SEEK_SET ファイルの先頭
SEEK_CUR ファイルポインタの現在の位置
SEEK_END ファイルの終わり

   (2)ftellは、開始位置を基準にしたファイルポインタのオフセットを返します。

long int ftell ( FILE * stream );

      streamは、ストリームを識別するFILEオブジェクトへのポインタです。この関数は、ロケーション識別子の現在の値を返します。エラーが発生した場合、-1Lが返され、グローバル変数errnoが正の値に設定されます。

   (3)巻き戻しは、ファイルポインタの位置をファイルの先頭に戻します

void rewind(FILE *stream)

          stream は、ストリームを識別するFILEオブジェクトへのポインタです。

4.ファイルの終わりの判断

   int feof(FILE * stream) は、指定されたストリームのファイルの終わり識別子をテストします。

   ファイル読み取りの過程で、feof関数の戻り値を直接使用して、ファイルが終了したかどうかを判別することはできません。むしろ、ファイルの読み取りが終了したときに、読み取りが失敗したか、ファイルの終わりに到達したかを判断するために使用されます。

 (1)テキストファイルの読み取りが終了したかどうか、戻り値がEOF(fgetc)かNULL(fgets)かを判断します。例:fgetcはEOFかどうかを判断します。fgetsは戻り値がNULLかどうかを判断します。

 (2)バイナリファイルの読み取り終了を判断し、戻り値が実際に読み取られる数値よりも小さいかどうかを判断します。例:freadは、戻り値が実際に読み取られる数よりも小さいかどうかを判断します。

テキストファイルの例:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int c; 
    FILE* fp = fopen("test.txt", "r");
    if(!fp) 
        {
            perror("File opening failed");
            return EXIT_FAILURE;
        }
    while ((c = fgetc(fp)) != EOF) 
        {
            putchar(c);
        }
    if (ferror(fp))
        puts("I/O error when reading");
    else if (feof(fp))
        puts("End of file reached successfully");
    fclose(fp);
}

 

おすすめ

転載: blog.csdn.net/RMA515T/article/details/115268682