• Giga@hdv-tech.com
  • 24時間オンラインサービス:
    • 7189078c
    • sns03
    • 6660e33e
    • youtube贝
    • インスタグラム

    C、文書の読み取りと書き込み

    投稿日時: 2023 年 8 月 11 日

    C プログラマがテキスト ファイルまたはバイナリ ファイルを作成、オープン、クローズする方法について説明します。

    ファイルとは、テキスト ファイルであるかバイナリ ファイルであるかに関係なく、一連のバイトを意味します。C 言語では、最上位の関数へのアクセスを提供するだけでなく、ストレージ デバイス上のファイルを処理するための基盤となる (OS) 呼び出しも提供します。 。この章では、文書管理における重要な呼び出しについて説明します。

    オープンファイル

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

    FILE *fopen ( const char * ファイル名 , const char * モード );

    ここで、filename はファイルに名前を付ける文字列で、アクセス モードの値は次のいずれかの値になります。

    パターン

    説明

    r

    読み取り可能な既存のテキスト ファイルを開きます。

    w

    ファイルへの書き込みが可能なテキスト ファイルを開きます。ファイルが存在しない場合は、新しいファイルが作成されます。ここで、プログラムはファイルの先頭からコンテンツを書き込みます。ファイルが存在する場合、長さ 0 に切り詰められて再書き込みされます。

    a

    テキスト ファイルを開き、追加モードでファイルに書き込みます。ファイルが存在しない場合は、新しいファイルが作成されます。ここで、プログラムは既存のファイルにコンテンツを追加します。

    r+

    ファイルの読み取りと書き込みができるテキスト ファイルを開きます。

    w+

    ファイルの読み取りと書き込みができるテキスト ファイルを開きます。ファイルがすでに存在する場合、ファイルは長さ 0 に切り詰められ、ファイルが存在しない場合は、新しいファイルが作成されます。

    a+

    ファイルの読み取りと書き込みができるテキスト ファイルを開きます。ファイルが存在しない場合は、新しいファイルが作成されます。読み取りはファイルの先頭から開始され、書き込みは追加モードでのみ行われます。

    バイナリ ファイルを処理する場合は、次のアクセス モードを使用して上記を置き換えます。

    「rb」、「wb」、「ab」、「rb+」、「r+b」、「wb+」、「w+b」、「ab+」、「a+b」

    閉じたファイル

    ファイルを閉じるには、fclose() 関数を使用してください。関数のプロトタイプは次のとおりです。

    int fclose ( FILE *fp );

    • ファイルが正常に閉じられた場合、fclose() 関数はゼロを返し、エラーが発生した場合は EOF を返します。実際、この関数はバッファからデータを削除し、ファイルを閉じ、そのファイルに使用されていたすべてのメモリを解放します。EOF はヘッダー ファイル stdio.h で定義された定数です。

    C 標準ライブラリは、文字または固定長文字列としてファイルを読み書きするためのさまざまな関数を提供します。

    ファイルに書き込む

    ストリームに文字を書き込む最も単純な関数を次に示します。

    int fputc ( int c , FILE *fp );

    関数 fputc () は、パラメータ c の文字値を fp が指す出力ストリームに書き込みます。書き込みが成功すると、書き込まれた文字が返され、エラーが発生した場合は EOF が返されます。次の関数を使用して、null で終わる文字列をストリームに書き込むことができます。

    int fputs ( const char *s , FILE *fp );

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

    注:使用可能な tmp ディレクトリがあることを確認してください。存在しない場合は、まずコンピュータ上に作成する必要があります。

    /tmp は通常、Linux システム上の一時ディレクトリです。Windows システムで実行する場合は、C: \ tmp、D: \ tmp などのローカル環境内の既存のディレクトリに変更する必要があります。

    生きた例

    #含むint main () { ファイル *fp = NULL ;fp = fopen ("/tmp/test.txt ", "w+");fprintf (fp , "これは fprintf のテストです...\n ");fputs ("これは 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 にコピーし、最後に null 文字を追加して文字列を終了します。

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

    生きた例

    #含むint main () { ファイル *fp = NULL ;チャーバフ [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: これ 2: fprintf をテストしています...

    3: これは fputs のテストです...

    まず、 fscanf() のメソッドは、後ろにスペースがあるため、 This のみを読み取ります。次に、関数 fgets () を呼び出して、行末までの残りの部分を読み取ります。最後に、 fgets() を呼び出して 2 行目を完全に読み取ります。

    バイナリI/O関数

    バイナリ入力および出力には、次の 2 つの関数が使用されます。

    size_t fread (void *ptr , size_t 要素のサイズ , size_t 要素の数 , FILE *a_file );size_t fwrite (const void *ptr , size_t size_of_elements , size_t number_of_elements , FILE *a_file );

    どちらの関数も、ストレージ ブロック (通常は配列または構造体) の読み取りと書き込みが可能です。

    上記の C ファイルの読み取りと書き込みに関する作業は、ソフトウェア技術業務である HDV Phoelectron Technology Ltd. に属します。ネットワーク関連機器(ACなど)の会社ONU/ コミュニケーションONU/ 知的ONU/繊維ONUなど)は強力なソフトウェアチームを結集し、すべての顧客が必要とする排他的な要求をカスタマイズし、当社の製品をよりインテリジェントで高度なものにします。



    ウェブ聊天