_Rwrite() — 次のレコードの書き込み

フォーマット

#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 の値は、次のいずれかに設定されます。

意味
ENOTWRITE
ファイルは書き込み操作用にオープンされません。
ETRUNC
入出力操作で切り捨てが発生しました。
EIOERROR
リカバリー不能な入出力エラーが発生しました。
EIORECERR
リカバリー可能な入出力エラーが発生しました。

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 );
}
 

関連情報



[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]