Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C で read() システム コールをマスターする:総合ガイド

C 言語には、ファイルを読み取ることができる関数がいくつかあります。最も一般的に使用されるのは、read() 関数と fread() 関数です。この言語は、getchar() などの関数を使用して 1 文字ずつ読み取るメソッドも提供します。

ファイル処理関数、その呼び出しメソッド、入出力引数などをスムーズに使用するためには、ファイル処理関数を理解しておくことが重要です。これらは、プログラマーがシステムに保存されている情報を保存したり破棄したりするために利用できるリソースであるためです。

この Linuxhint 記事では、read() 関数を使用してファイルを読み取る方法を学習します。

このエラ、その構文、メソッド呼び出し、入力引数と出力引数、それぞれが受け入れるデータのタイプ、およびそれらを適切に宣言する方法についてすべて説明します。

次に、この機能の使用法を実際の例に落とし込んで、学んだことを応用します。

read() 関数の使用方法を十分に理解していただくために、この関数の使用時に発生する可能性のあるすべてのエラーとその検出と識別について説明する特別なセクションを追加しました。これにより、エラーが発生した場合に迅速に解決するために必要なテクニックが得られます。

C 言語の Read() 関数の構文

 
size_t read(int fd, void *buf, size_t count);
 

Read() 関数の説明

read() 関数は、「fd」入力引数の記述子で指定された、開いているファイルの内容を読み取ります。この関数は、ファイルの内容をバイト数カウントで読み取り、「buf」が指すバッファにコピーします。 「fd」識別子は、ファイルが開かれたときに open() 関数の結果として返される整数です。

read() 関数が正常に返ると、読み取られたバイト数が返されます。結果が 0 の場合は、ファイルが最後まで読み取られたことを意味し、-1 はエラーが発生したことを意味します。

特定のエラーは、グローバル「errno」変数からコードを取得することで特定できます。この後のセクションでは、read() 関数の使用時に発生する可能性のあるエラーと、それらを検出および識別する手法について説明します。

read() 関数は「unistd.h」ヘッダーで宣言されています。これを使用するには、次のようにこのファイルをコードに含める必要があります。

Read() 関数を使用してファイルを読み取る方法

この例では、open() 関数と read() 関数を使用してファイルを開いて読み取る方法を説明します。

この目的のために、以前に Linux マネージャーを使用して「example.txt」という名前のテキスト ファイルを作成し、それを「Documents」ディレクトリに保存しました。そして、この記事の最初の段落をその中に書きました。

ファイルを読み取るコードを開発する最初のステップは、必要なヘッダーを組み込み、空の値を返す main() 関数を作成することです。その中に、ファイル記述子として機能する「fd」整数、つまり「buff」と呼ばれる 1024 文字のバッファーを定義します。ここには、read() によって読み取られた情報が保存されます。配列パスには、読み込むファイルのパスと名前が格納されます。

必要な変数を定義した後、open() 関数を呼び出してファイルを開きます。この関数を呼び出すには、最初の入力引数としてファイルのパスと名前を含むパス配列を渡し、2 番目の引数として O_RDONLY フラグを指定します。出力引数として「fd」整数を渡します。ここで、open() はファイルの読み取りに使用する記述子を返します。

ファイルを開いたら、read() 関数を呼び出し、open() 関数によって返される最初の引数として「fd」記述子を渡すことによって、その内容を読み取ります。 2 番目の引数として、読み取るコンテンツを保存する「buff」バッファへのポインタを渡し、最後にバッファのサイズ (この場合は 1024 バイト) を渡します。

次に、printf() 関数を使用して、buff に格納されている内容をコマンド コンソールに表示します。この例の完全なコードは次のとおりです。

#include
#include
#include
#include

int main()
{  
   int fd;
   文字バフ[1024];
   char path[] ="Documents/example.txt";
   fd =open(パス, O_RDONLY);
   read(fd, buff, 1024);
   printf("\n\n%s\n\n",buff);
   }

次の図は、このコードのコンパイルと実行を示しています。ご覧のとおり、read() は「example.txt」ファイルの内容全体を「buff」に置き、printf() 関数はそれをコマンド コンソールに出力します。

C で read() システム コールをマスターする:総合ガイド

Read() 関数の使用時に発生する可能性のあるエラーを検出および特定する方法

read() を使用すると、さまざまなエラーが発生する可能性があります。これが発生すると、この関数は -1 に等しい結果を返します。

エラーが発生したかどうかを判断する最も簡単な方法は、戻り値 -1 である「if」条件を使用することです。ここで、このメソッドを使用してエラーが発生したかどうかを判断する方法を見てみましょう。

int n;
n =read(fd, buff , 1024);
if ( n ==-1){
     printf ("ファイルの読み取り中にエラーが発生しました。");
     }

read() 関数がエラーで戻った場合、「if」ステートメントに移行し、「ファイルの読み取り中にエラーが発生しました」というメッセージを出力します。

エラーが発生すると、「errno.h」ヘッダーで定義されているグローバル変数「errno」に数値コードが自動的に格納されます。このコードは、発生したエラーを特定するために使用できます。

以下は、read() 関数が生成する可能性があり、「errno.h」ヘッダーで定義されているエラーの抜粋と、各エラーと関連する整数値の簡単な説明です。

定義 errno の値 エラーイーゲイン 11EBADF をもう一度お試しください 9ファイル番号が間違っていますEDESTADDRREQ 89宛先アドレスが必要ですEFAULT 14住所が間違っていますEFBIG 27ファイルが大きすぎるEINTR 4システムコールが中断されましたEINVAL 22無効な引数EIO 5 I/O エラーEPERM 1操作禁止

エラーを識別する最も簡単な方法は、「errno」変数がジャンプ条件であり、それぞれのケースがエラー定義であるスイッチを開くことです。

次に、負号付きの記述子を入力しようとしてエラーが発生する例を見てみましょう。エラーを特定するには、前のスニペットで見た「if」条件を使用します。これを特定するために、この関数が生成する可能性のある 3 つの最も一般的なエラーを含むスイッチを開きます。

#include
#include
#include
#include
#include

int main()
{  
   int fd,n;
   文字バフ[1024];
   char path[] ="Documents/example.txt";
   fd =open(path, O_RDONLY);

   n =読み取り(99999999、バフ、1024);
   if (n ==-1){
      スイッチ(エラー番号){
    EBADF の場合:{
                  printf("不正なファイル番号。エラー:%i\n", errno);
                  休憩;}
    ケース EINVAL:{
                   printf("引数が無効です。エラー:%i\n", errno);
                   休憩;}
    EIO の場合:{
                printf("I/O エラー 。エラー:%i\n", errno);
                休憩;}
    }
 }
}

次の図からわかるように、無効な記述子が入力引数として渡されると、read() 関数はエラーを返します。ジャンプ条件として使用される「errno」変数から取得される値により、EBADF ケースに入るときにエラーを識別できます。

C で read() システム コールをマスターする:総合ガイド

結論

この Linuxhint の記事では、ファイルを読み取るために C 言語で実装される最も一般的な関数の 1 つである read() 関数の使用方法を説明しました。

その構文と、その理論的な操作、入力引数と出力引数、およびそのデータ型を説明するセクションを調べました。その後、open() 関数と read() 関数を使用してファイルを開いて読み取る方法を示すコードと画像を使用して、実践的な例で学んだ内容を実装しました。

この関数の使用時に発生する可能性のあるエラーのトラブルシューティングに必要な手段を用意するために、エラーを検出および識別するために C 言語が提供するメソッドを説明する特別なセクションを追加しました。


  1. PGM形式で画像を書き込むCプログラム

    PGMはポータブルグレーマップです。 2D配列をPNG、JPEG、またはその他の画像形式の画像としてCに保存する場合は、ファイルに書き込む前に、指定された形式でデータをエンコードするために多くの作業を行う必要があります。 Netpbm形式は、簡単でポータブルなソリューションを提供します。 Netpbmはグラフィックプログラムのオープンソースパッケージであり、基本的にLinuxまたはUnixプラットフォームで使用されます。 MicrosoftWindowsシステムでも動作します。 各ファイルは2バイトのマジックナンバーで始まります。このマジックナンバーは、ファイルのタイプを識別するために使用

  2. 配列のソートされた個別の要素をC言語で出力します

    整数要素の配列が与えられた場合、タスクは重複する値を削除し、ソートされた方法で個別の要素を出力することです。 以下に示すのは、整数型の値を4、6、5、3、4、5、2、8、7、0の形式で格納する配列です。結果は、ソートされた要素を0、2、3、4として出力します。 4、5、5、6、7、8ですが、この結果には重複する値4と5が含まれているため、削除する必要があり、最終結果は0、2、3、4、5、6、7、8になります。 例 Input: array[] = {4, 6, 5, 3, 4, 5, 2, 8, 7, 0} Output: 0 2 3 4 5 6 7 8 説明 したがって、結果を達成