フォーマット
#include <recio.h> _RIOFB_T * _Rwrite(_RFILE *fp, void *buf, size_t size);
言語レベル: ILE C Extension
スレッド・セーフ: はい。ただし、スレッド間でファイル・ポインターが渡された場合、入出力フィードバック域はそれらのスレッド間で共有されます。
説明
_Rwrite() 関数には、移動と位置指定の 2 つのモードがあります。 buf がユーザー・バッファーを指す場合、_Rwrite() は移動モードです。 buf が NULL である場合、関数は位置指定モードです。
_Rwrite() 関数は、fp で指定されたファイルにレコードを付加します。 buf からレコードにコピーされたバイト数は、 size の最小値とファイルのレコード長です (移動モードのみ)。 サイズがレコード長より大きい場合、データは切り捨てられ、errno が ETRUNC に設定されます。 操作が正常終了した場合、必ず 1 つの完全なレコードが書き込まれます。
_Ropen() を使用してから _Rwrite() を使用してレコードをソース物理ファイルに出力する場合、 シーケンス番号を手動で付加する必要があります。
_Rwrite() 関数は、以後の読み取り操作のファイルの位置には影響しません。
以下の項目に該当する場合、_Rwrite() 関数が正常終了を示していても、レコードが失われる場合があります。
出力がバッファーに入れられると、_Rwrite ルーチンは正常終了を戻します。 これは、レコードが正常にバッファーにコピーされたことを示します。 ただし、バッファーがフラッシュされた場合、ルーチンは失敗します。 これは、別のライターによって、ファイルの容量がいっぱいになってしまったためです。 この場合、_Rwrite() 関数は、 ファイルにデータを送信する _Rwrite() 関数への呼び出しでのみエラーが発生したことを示します。
_Rwrite() 関数は、すべてのタイプのファイルの場合に有効です。
戻り値
_Rwrite() 関数は、fp に関連した _RIOFB_T 構造体を指すポインターを戻します。 _Rwrite() 操作が正常終了した場合、移動モードと位置指定モードの両方で、num_bytes フィールドは 書き込まれたバイト数に設定されます。 この関数は、ユーザーのバッファーからシステム・バッファーにバイトを転送します。 レコード・ブロッキングが行われている場合、 この関数は、ブロックをデータベースに送信する際に rrn フィールドと key フィールドのみを更新します。 fp がディスプレイ・ファイル、ICF ファイル、またはプリンター・ファイルである場合、この関数は sysparm フィールドを更新します。 この関数が正常終了しなかった場合、num_bytes フィールドは、 指定された size より小さい値 (移動モード) またはゼロ (位置指定モード) に設定され、 errno が変更されます。
errno の値は、次のいずれかに設定されます。
errno の設定については、表 12 および 表 14 を参照してください。
_Rwrite() の使用例
#include <stdio.h> #include <recio.h> #include <string.h> #include <stdlib.h> typedef struct { char name[20]; char address[25]; } format1 ; typedef struct { char name[8]; char password[10]; } format2 ; typedef union { format1 fmt1; format2 fmt2; } formats ; int main(void) { _RFILE *fp; /* File pointer */ _RIOFB_T *rfb; /*Pointer to the file's feedback structure */ _XXIOFB_T *iofb; /* Pointer to the file's feedback area */ formats buf, in_buf, out_buf; /* Buffers to hold data */ /* Open the device file. */ if (( fp = _Ropen ( "MYLIB/T1677RD2", "ar+" )) == NULL ) { printf ( "Could not open file¥n" ); exit ( 1 ); } _Racquire ( fp,"DEVICE1" ); /* Acquire another device. Replace */ /* with actual device name. */ _Rformat ( fp,"FORMAT1" ); /* Set the record format for the */ /* display file. */ rfb = _Rwrite ( fp, "", 0 ); /* Set up the display. */ _Rpgmdev ( fp,"DEVICE2" ); /* Change the default program device. */ /* Replace with actual device name. */ _Rformat ( fp,"FORMAT2" ); /* Set the record format for the */ /* display file. */ rfb = _Rwrite ( fp, "", 0 ); /* Set up the display. */ rfb = _Rwriterd ( fp, &buf, sizeof(buf) ); rfb = _Rwrread ( fp, &in_buf, sizeof(in_buf), &out_buf, sizeof(out_buf )); _Rreadindv ( fp, &buf, sizeof(buf), __DFT ); /* Read from the first device that */ /* enters data - device becomes */ /* default program device. */ /* Determine which terminal responded first. */ iofb = _Riofbk ( fp ); if ( !strncmp ( "FORMAT1 ", iofb -> rec_format, 10 )) { _Rrelease ( fp, "DEVICE1" ); } else { _Rrelease(fp, "DEVICE2" ); } /* Continue processing. */ printf ( "Data displayed is %45.45s¥n", &buf); _Rclose ( fp ); }
関連情報