プログラミングにおけるファイル管理は、プログラマーが熟知していなければならないタスクです。さまざまなオープン、読み取り、および書き込み関数の知識は、ファイルに格納されている情報を格納または破棄するために常に必要であるため、不可欠です。
この Linux ヒントの記事では、write() 関数を使用してファイルを書き込む方法を学習します。
この ella、その構文、call メソッド、入力および出力引数、それぞれの場合に受け入れるデータの型、およびそれを正しく宣言する方法についてすべて説明します。
次に、C 言語での write() の使用を示す、コード スニペットとイメージを使用して用意した実用的な例に、この関数の使用を当てはめて学んだことを適用します。
write() 関数の使用に関する包括的な知識を得るために、この関数の使用時に発生する可能性のある個々のエラー、およびその検出と識別について説明する特別なセクションを追加しました。発生した場合の迅速な解決に必要なテクニック。
C 言語の Write() 関数の構文
整数 書く ( 整数 fd 、 空所 * バフ 、 size_t n ) ;C言語でのWrite()関数の説明
write() 関数は、開いているファイルに書き込みます。この関数は、「buf」が指すバッファの内容を、「fd」入力引数の記述子で指定されたファイルに書き込みます。ファイルに書き込まれるブロックのサイズは、「n」入力引数で指定する必要があります。
write() 関数で書き込みできるようにするには、ファイルを open() 関数で開き、O_RDONLY または O_RDWR 属性で指定する必要があります。それ以外の場合、この関数は効果がありません。
呼び出しが成功すると、入力された文字数が返されます。書き込み中にエラーが発生すると、-1 に等しい結果が返されます。エラーを示す識別コードは、「errno.h」ヘッダーに定義されている errno グローバル変数から取得できます。
後で、この関数の最も一般的なエラーを検出して特定する方法を説明するセクションがあります。
write() 関数は、「unistd.h」ヘッダーで定義されています。ファイルを開くための属性とモードを定義するフラグは、「fcntl.h」で定義されています。 open() および write() 関数を使用するには、次のようにこれらのヘッダーをコードに含める必要があります。
#include#include
C 言語で Write() 関数を使用してファイルに書き込む方法
この例では、先ほど作成した「example.txt」という名前の空のテキスト ファイルを「Documents」ディレクトリに書き込みます。
最初のステップは、必要なヘッダーを挿入することです。 main() 関数内で、open() 関数を使用してファイルを開きます。これを行うには、ファイル記述子として機能する「fd」整数と、ファイルに書き込みたいテキストを含む 1024 文字の「buf」バッファ配列を宣言する必要があります。このバッファに、GCC のマニュアル ページの最初の段落を保存して、それを「example.txt」ファイルに書き込みます。
読み取り/書き込みモードで open() 関数を使用してファイルを開いた後、write() 関数を呼び出し、「fd」ファイル記述子を最初の入力引数として渡し、「buf」ポインターを 2 番目の入力引数として渡すことにより、ファイルに書き込みます。引数、および strlen() 関数で取得する 3 番目の引数として配列に含まれる文字列のサイズ。この例のコードは次のとおりです。
#include#include
#include
#include
#include
#include
#include
空所 主要 ( )
{
整数 fd ;
チャー バッファ [ 1024 ] = 「GCC を呼び出すと、通常、前処理、コンパイル、アセンブリ、およびリンクが行われます。全体的なオプションを使用すると、このプロセスを中間段階で停止できます。たとえば、-c オプションは、リンカーを実行しないように指示します。その後、出力は次のように構成されます。アセンブラが出力するオブジェクトファイルです。」 ;
fd = 開ける ( 「ドキュメント/example.txt」 、 O_RDWR ) ;
書く ( fd 、 & バッファ 、 ストレン ( バッファ ) ) ;
近い ( fd ) ;
}
次の図では、このコードのコンパイルと実行が、write() 関数によって書き込まれた開かれたファイルと共に示されています。
C 言語で Write() 関数を使用してファイルの末尾にテキストを追加する方法
O_WRONLY または O_RDWR フラグを指定してファイルを開くと、カーソルは最初の位置にジャンプし、そこから書き込みを開始します。
ファイルの末尾にテキストを追加するには、ファイルを開くときに open() 関数の入力フラグ引数で、O_WRONLY または O_RDWR フラグと O_APPEND フラグの間の論理 OR 演算によって指定する必要があります。このように、カーソルがファイルの最後に置かれ、そこから書き込みが開始されます。また、属性と書き込みモードは、ファイルが fcntl() 関数で開かれると変更できます。
次の図では、前の例で作成したファイルの末尾にテキストを追加するコードを確認できます。
#include#include
#include
#include
#include
#include
#include
空所 主要 ( )
{
整数 fd ;
チャー バッファ [ 1024 ] = 「このテキストが追加されました。このテキストが追加されました。」 ;
fd = 開ける ( 「ドキュメント/example.txt」 、 O_RDWR | | O_APPEND ) ;
書く ( fd 、 & バッファ 、 ストレン ( バッファ ) ) ;
近い ( fd ) ;
}
次の画像は、追加されたテキストを示しています。ご覧のとおり、このオープニング メソッドでは、write() 関数は、ファイルに書き込まれた最後の文字の位置から書き込みを開始します。
C 言語で Write() 関数を使用するときに発生する可能性のあるエラーを検出および識別する方法
write() を使用すると、さまざまなエラーが発生する可能性があります。この場合、この関数は -1 に等しい結果を返します。
エラーが発生したかどうかを判断する最も簡単な方法は、条件が -1 の戻り値である「if」条件を使用することです。次に、このメソッドを使用してエラーが発生したかどうかを判断する方法を見てみましょう。
整数 n ;n = 書く ( fd 、 & バッファ 、 ストレン ( バッファ ) ) ;
もしも ( n == - 1 ) {
printf ( 「ファイルの書き込み中にエラーが発生しました。」 ) ;
}
write() 関数がエラーを返した場合、「if」ステートメントに移行し、「 ファイルの書き込み中にエラーが発生しました 」。
エラーが発生すると、「errno.h」ヘッダーで定義されている errno グローバル変数に数値コードが自動的に格納されます。このコードは、発生したエラーを識別するために使用できます。
以下は、write() 関数が生成する可能性があり、「errno.h」ヘッダーで定義されているエラーの抜粋と、各エラーの簡単な説明と関連する整数値です。
意味 | エラー番号の値 | エラー |
---|---|---|
再び | 十一 | 再試行する。 |
EBADF | 9 | ファイル番号が正しくありません。 |
EDESTADDRREQ | 89 | 宛先アドレスが必要です。 |
EDQUOT | 122 | 割り当てを超えました。 |
故障 | 14 | 住所が正しくありません。 |
EFBIG | 27 | ファイルが大きすぎます。 |
EINTR | 4 | システムコールが中断されました。 |
シングルチョイス | 22 | 無効な引数。 |
EIO | 5 | 入出力エラー。 |
ENOSPC | 28 | デバイスに空き容量がありません。 |
アッパー | 1 | 操作は許可されていません。 |
エラーを特定する最も簡単な方法は、errno 変数がジャンプ条件で、各ケースがエラー定義であるスイッチを開くことです。
次に、マイナス記号を含む記述子を入力しようとしてエラーになる例を見てみましょう。エラーを特定するには、前のスニペットで見た「if」条件を使用します。それを識別するために、この関数が生成する可能性のある最も一般的な 3 つのエラーでスイッチを開きます。
#include#include
#include
#include
#include
#include
#include
空所 主要 ( )
{
整数 fd ;
整数 n ;
チャー バッファ [ 1024 ] = 'こんにちは世界' ;
fd = 開ける ( 「ドキュメント/example.txt」 、 O_RDWR ) ;
n = 書く ( - 2 、 & バッファ 、 ストレン ( バッファ ) ) ;
もしも ( n == - 1 ) {
スイッチ ( エラー番号 ) {
場合 EBADF : {
printf ( 'ファイル番号が正しくありません。エラー: %i \n ' 、 エラー番号 ) ;
壊す ; }
場合 シングルチョイス : {
printf ( 「引数が無効です。エラー: %i \n ' 、 エラー番号 ) ;
壊す ; }
場合 EIO : {
printf ( 「I/O エラー。エラー: %i \n ' 、 エラー番号 ) ;
壊す ; }
}
}
}
次の図からわかるように、無効な記述子が入力引数として渡されると、write() 関数はエラーを返します。 errno 変数から取得された値は、EBADF ケースに入ったときにエラーを識別できるようにするジャンプ条件として使用されます。
結論
この Linux Hint の記事では、write() 関数を使用してファイルに書き込む方法を紹介しました。この関数の構文と理論的な説明を示しました。また、これらの問題を迅速に解決するために必要なツールとテクニックを使用できるように、エラーの検出と識別の方法についても説明しました。
write() がどのように機能するかを理解するのに役立つように、この関数と他のファイル処理関数の使用を示すコードと画像を使用して、この関数の使用を実際の例に実装しました。
また、ファイルを開くモードを選択してファイルの先頭または末尾にテキストを挿入する方法と、これらの属性を変更するために使用できる関数についても説明しました。