OpenVMS
HP C ランタイム・ライブラリ・
リファレンス・マニュアル (上巻)


前へ 次へ 目次 索引


2.1 RTL ルーチンからの RMS の使用

HP C RTL の I/O 関数とマクロを使用してファイルを作成する場合,次の属性も含めて,多くの RMS ファイル属性の値を指定できます。

これらの値の詳細については,「リファレンス・セクション」の creat関数の説明を参照してください。

これらの値は, openfopenfreopenなどの関数でも設定できます。

RMS の詳細については,『HP C User's Guide for OpenVMS Systems』を参照してください。

2.2 UNIX I/O と標準 I/O

UNIX I/O 関数は UNIX システム・サービスであり,現在は ISO POSIX-1 (ISO Portable Operating System Interface) によって標準化されています。

UNIX I/O 関数では,ファイル記述子を使用してファイルにアクセスします。 ファイル記述子とは,ファイルを識別する整数です。ファイル記述子は次のように宣言されます。ここで, file_desc はファイル記述子の名前です。


int  file_desc; 

creatなどの UNIX I/O 関数は,ファイル記述子をファイルに関連付けます。次の例について考えてみましょう。


file_desc1 = creat("INFILE.DAT", 0, "rat=cr", "rfm=var"); 

この文は,ファイル・アクセス・モード 0,キャリッジ・リターン制御,可変長レコードで INFILE.DAT というファイルを作成し,変数 file_desc1をファイルに関連付けます。読み込みや書き込みなどの操作のためにファイルにアクセスするときは,ファイル記述子を使用してファイルを参照します。次の例を参照してください。


write(file_desc1, buffer, sizeof(buffer)); 

この文はバッファの内容を INFILE.DAT に書き込みます。

標準 I/O 関数やマクロの代わりに, UNIX I/O 関数やマクロを使用しなければならない状況があります。この 2 種類の I/O の詳細についてと,各 I/O で RMS ファイル・フォーマットがどのように操作されるかについては, 第 1 章 を参照してください。

標準 I/O 関数は ANSI C 標準で指定されています。

標準 I/O 関数では,UNIX I/O の機能にバッファリング機能が追加され,ファイルにアクセスするためにファイル・ポインタが使用されます。 ファイル・ポインタとは, FILE *型のオブジェクトです。これは,次に示すように, <stdio.h>ヘッダ・ファイルに定義されている typedefです。


typedef  struct  _iobuf  *FILE; 

_iobuf識別子も <stdio.h>に定義されています。

ファイル・ポインタを宣言するには,次のように指定します。


FILE  *file_ptr; 

既存のファイルの作成やオープンには,標準 I/O の fopen関数を使用します。次の例を参照してください。


#include <stdio.h> 
 
main() 
{ 
   FILE  *outfile; 
   outfile  =  fopen("DISKFILE.DAT", "w+"); 
      . 
      . 
      . 
} 

この例では,ファイル DISKFILE.DAT が書き込み更新アクセスのためにオープンされます。

HP C RTL では,ファイル記述子とファイル・ポインタの間の変換のために,次の関数が用意されています。

2.3 ワイド文字 I/O 関数とバイト I/O 関数

ワイド文字 I/O 関数は,大部分のバイト I/O 関数と同様の動作を実行します。ただし,基本単位としてワイド文字を取り扱う点がバイト I/O 関数と異なります。

しかし,外部表現 (ファイル内の表現) はワイド文字ではなく,マルチバイト文字シーケンスです。ワイド文字で書式設定された入出力関数の場合,次のことに注意してください。

バイト I/O 関数は状態依存エンコーディングを取り扱うことができません。ワイド文字 I/O 関数はこのような操作が可能です。ワイド文字 I/O 関数は,各ワイド文字ストリームを mbstate_t型の変換状態オブジェクトに関連付けることにより,この操作を実行します。

ワイド文字 I/O 関数は次のとおりです。


fgetwc        fputwc        fwscanf       fwprintf       ungetwc 
fgetws        fputws        wscanf        wprintf 
getwc         putwc                       vfwprintf 
getwchar      putwchar                    vwprintf 

バイト I/O 関数は次のとおりです。


fgetc         fputc         fscanf        fprintf         ungetc 
fgets         fputs         scanf         printf          fread 
getc          putc                        vfprinf         fwrite 
gets          puts                        vprintf 
getchar       putchar 

ワイド文字入力関数は, fgetwc関数を連続して呼び出すことによって書き込まれる場合,ストリームからマルチバイト文字を読み込み,これらの文字をワイド文字に変換します。各変換は,ストリーム独自の mbstate_tオブジェクトによって記述される変換状態を指定して mbrtowc関数を呼び出したかのように実行されます。

ワイド文字出力関数は, fputwc関数を連続して呼び出すことにより書き込んだかのように,ワイド文字をマルチバイト文字に変換し,これらの文字をストリームに書き込みます。各変換は,I/O ストリームの独自の mbstate_tオブジェクトによって記述される変換状態を指定して wcrtomb関数を呼び出したかのように実行されます。

ワイド文字 I/O 関数で不正なマルチバイト文字が検出されると, errnoが EILSEQ に設定されます。

2.4 変換指定

複数の標準 I/O 関数 (端末 I/O 関数を含む) では, I/O のデータの書式を指定するために変換指定が使用されます。これらの関数は,書式設定された入力関数と書式設定された出力関数です。次の例について考えてみましょう。


int     x = 5.0; 
FILE    *outfile; 
   .
   .
   .
fprintf(outfile, "The answer is %d.\n", x); 

識別子 outfile に関連付けられたファイルに書き込まれる文字列内の変換指定 %dは,変数 xの 10 進数に置き換えられます。

各変換指定はパーセント記号 (%) から始まり, 変換指定子で終了します。これは,実行する変換の種類を指定する文字です。パーセント記号と変換指定子の間に,必要に応じて任意の文字を指定することができます。

ワイド文字で書式設定された I/O 関数の場合,変換指定はワイド文字の文字列です。対応するバイト I/O 関数では,変換指定はバイト列です。

これらの任意に指定できる文字と変換指定子については, 2.4.1 項と 2.4.2 項を参照してください。

2.4.1 入力情報の変換

情報を入力する場合の書式指定文字列には,次の 3 種類の項目を含むことができます。

各入力ポインタは,対応する変換指定と同じ型のオブジェクトを示すアドレス式です。変換指定は書式指定文字列の一部になります。示されるオブジェクトは,入力値を受け取るターゲットです。変換指定と同じ数だけ入力ポインタが必要であり,アドレスが指定されるオブジェクトは変換指定と同じ型でなければなりません。

変換指定は次の文字で構成され,順序はここに示したとおりになります。

表 2-2 は,パーセント記号 (%) ( または %n$ というシーケンス ) と変換指定子の間に指定できる文字を示しています。これらの文字は省略可能ですが,指定する場合は, 表 2-2 に示した順に指定する必要があります。

表 2-2 % (または% n$) と入力変換指定子の間に指定できる省略可能な文字
文字 意味
* 代入禁止文字
フィールド幅 0 以外の 10 進整数であり,最大フィールド幅を指定する。

ワイド文字入力関数の場合は,フィールド幅はワイド文字の文字数で表現される。

バイト入力関数の場合は,ディレクティブが次のいずれかである場合を除き,フィールド幅はバイト数で表現される。

%lc, %ls, %C, %S, %[

これらの場合,フィールド幅はマルチバイト文字単位で表現される。

h,l,
L (または ll)
変換指定子 d,i,n のいずれかの前に指定する。対応する引数が int を指すポインタではなく, short int を指すポインタの場合は,h を指定する。 long int を指すポインタの場合は,l ( 小文字のエル ) を指定する。 OpenVMS Alpha システムの場合のみ, __int64 を指すポインタの場合は, L または ll (2 つの小文字のエル ) を指定する。

変換指定子 o,u,または x の前に指定する。対応する引数が unsigned int を指すポインタではなく, unsigned short int を指すポインタの場合は,h を指定する。 unsigned long int を指すポインタの場合は,l を指定する。 OpenVMS Alpha システムの場合のみ, unsigned __int64 を指すポインタの場合は, L または ll を指定する。

変換指定子 c,s,[ の前に指定する。対応する引数が wchar_t を指すポインタの場合は, l ( 小文字のエル ) を指定する。

最後に,変換指定子 e,f,g の前に指定する。対応する引数が float を指すポインタではなく, double を指すポインタの場合は,l ( 小文字のエル ) を指定する。 long double を指すポインタの場合は L を指定する。

h,l,L,ll のいずれかが他の変換指定子とともに指定されている場合は,その動作は未定義になる。

表 2-3 は,書式設定された入力の変換指定子を示しています。

表 2-3 書式設定された入力の変換指定子
指定子 入力の種類1 説明
d   base 引数の値を 10 に設定した strtol 関数のサブジェクト・シーケンスに対して期待される書式と同じ書式の 10 進整数が入力に期待される。対応する引数は int を指すポインタでなければならない。
i   入力文字の先頭文字によって型が決定される整数が期待される。先頭が 0 の場合は 8 進数,先頭が 0X または 0x の場合は 16 進数,他のすべての形式の場合は 10 進数であると解釈される。対応する引数は int を指すポインタでなければならない。
o   入力に 8 進整数 (先頭の 0 はあってもなくてもかまわない) が期待される。対応する引数は int を指すポインタでなければならない。
u   base 引数の値が 10 の strtoul 関数のサブジェクト・シーケンスに対して期待される書式と同じ書式の 10 進整数が入力に期待される。
x   入力に 16 進整数 (先頭の 0x はあってもなくてもかまわない) が期待される。対応する引数は unsigned int を指すポインタでなければならない。
c バイト 入力に 1 バイトが期待される。対応する引数は char を指すポインタでなければならない。

c 変換指定子の前にフィールド幅が指定されている場合は,フィールド幅によって指定される文字数が読み込まれる。この場合,対応する引数は char 型の配列を指すポインタでなければならない。

この変換指定子の前に省略可能な文字 l (小文字のエル) が指定されている場合は,ワイド文字コードに変換されるマルチバイト文字が入力に期待される。

対応する引数は wchar_t 型を指すポインタでなければならない。 c 変換指定子の前にフィールド幅も指定されている場合は,フィールド幅によって指定された文字数が読み込まれる。この場合,対応する引数は wchar_t の配列を指すポインタでなければならない。

  ワイド文字 省略可能なフィールド幅に指定された文字数が期待される。指定されていない場合は 1 になる。

c 指定子の前に l (小文字のエル) が指定されていない場合は,対応する引数は char の配列を指すポインタでなければならない。

c 指定子の前に l (小文字のエル) が指定されている場合は,対応する引数は wchar_t の配列を指すポインタでなければならない。

C バイト ワイド文字コードに変換されるマルチバイト文字が入力に期待される。対応する引数は wchar_t 型を指すポインタでなければならない。

C 変換指定子の前にフィールド幅も指定されている場合は,フィールド幅によって指定される文字数が読み込まれる。その場合,対応する引数は wchar_t の配列を指すポインタでなければならない。

  ワイド文字 省略可能なフィールド幅に指定された文字数のシーケンスが期待される。指定されていない場合は 1 になる。対応する引数は wchar_t の配列を指すポインタでなければならない。
s バイト 入力にバイト・シーケンスが期待される。対応する引数は,バイト・シーケンスと,自動的に付加されるヌル区切り文字 (\0) を格納できるだけの十分な大きさの文字配列を指すポインタでなければならない。入力フィールドはスペース,タブ,改行文字で区切られる。

この変換指定子の前に省略可能な文字 l (小文字のエル) が指定されている場合は,ワイド文字コードに変換されるマルチバイト文字シーケンスが入力に期待される。対応する引数は,文字シーケンスの他に,自動的に付加される区切り文字のヌル・ワイド文字コードを格納できるだけの十分な大きさのワイド文字 ( wchar_t 型) の配列を指すポインタでなければならない。入力フィールドはスペース,タブ,改行文字で区切られる。

  ワイド文字 入力に空白文字以外の文字シーケンスが期待される (概念上)。

s 指定子の前に l (小文字のエル) が指定されていない場合は,対応する引数は,シーケンスの他に,自動的に末尾に付加されるヌル・バイトを格納できるだけの十分な大きさの char の配列を指すポインタでなければならない。

s 指定子の前に l (小文字のエル) が指定されている場合は,対応する引数はシーケンスの他に,自動的に末尾に付加されるヌル・ワイド文字を格納できるだけの十分な大きさの wchar_t の配列を指すポインタでなければならない。

S バイト ワイド文字コードに変換されるマルチバイト文字シーケンスが入力に期待される。対応する引数は,シーケンスの他に,自動的に末尾に付加されるヌル・ワイド文字コードを格納できるだけの十分な大きさのワイド文字 ( wchar_t 型) の配列を指すポインタでなければならない。
  ワイド文字 空白文字以外の文字シーケンスが入力に期待される。対応する引数は,シーケンスの他に,自動的に末尾に付加されるヌル・ワイド文字を格納できるだけの十分な大きさの wchar_t の配列を指すポインタでなければらない。
e,f,g   入力に浮動小数点数値が期待される。対応する引数は, float を指すポインタでなければならない。浮動小数点数値の入力形式は次のとおりである。 [<pm symbol>]nnn[radix][ddd][{E|e}[<pm symbol>]nn]. n と d は 10 進数である (フィールド幅によって示される桁数から符号と英字の E を差し引いた桁数)。基数を示す文字は現在のロケールで定義される。
[...]   空白文字によって区切られていない空でない文字シーケンスが期待される。角括弧は,入力シーケンスに期待される文字セット ( scanset) を囲む。入力シーケンス内の文字のうち,scanset に含まれる文字に対応しない文字が検出されると,文字シーケンスは終了する。

角括弧で囲まれたすべての文字で scanset が構成される。ただし,左角括弧の直後の文字がサーカンフレックス (^) の場合は例外である。この場合は,scanset に含まれる文字は,サーカンフレックスと右角括弧で囲まれる文字以外のすべての文字になる。サーカンフレックスと右角括弧で 囲まれた文字が検出されると,入力文字シーケンスは終了する。

変換指定子が [] または [^] で始まる場合は,右角括弧文字は scanset に含まれ,次の右角括弧文字が指定を終了する右角括弧文字になる。それ以外の場合は,最初の右角括弧文字が検出されたときに,指定は終了する。

  バイト [ 指定子の前に l (小文字のエル) が指定されていない場合は, scanset に含まれる文字はシングル・バイト文字だけでなければならない。この場合,対応する引数は,シーケンスの他に,自動的に末尾に付加されるヌル・バイトを格納できるだけの十分な大きさの char の配列を指すポインタでなければならない。

[ 指定子の前に l (小文字のエル) が指定されている場合は,入力シーケンス内の文字はマルチバイト文字であると解釈され,その後の処理のためにワイド文字シーケンスに変換される。文字の範囲が scanset に指定されている場合は,処理は現在のプログラムのロケールの LC_COLLATE カテゴリに従って実行される。この場合,対応する引数は,シーケンスの他に,自動的に末尾に付加されるヌル・ワイド文字を格納できるだけの十分な大きさの wchar_t の配列を指すポインタでなければならない。

  ワイド文字 [ 変換指定子の前に l (小文字のエル) が指定されていない場合は,処理は %l[ 指定子のバイト入力の場合と同じである。ただし,対応する引数は,マルチバイト・シーケンスの他に,自動的に末尾に付加されるヌル・バイトを格納できるだけの十分な大きさの char の配列を指すポインタでなければならない。

[ 変換指定子の前に l (小文字のエル) が指定されている場合は,処理は前に説明した場合と同じであるが,対応する引数は,ワイド文字シーケンスの他に,自動的に末尾に付加されるヌル・ワイド文字を格納できるだけの十分な大きさの wchar_t の配列を指すポインタでなければならない。

p   void を指すポインタが引数として期待される。入力値は 16 進数として解釈される。
n   入力は使用されない。対応する引数は整数を指すポインタである。整数は,書式設定された入力関数に対するこの呼び出しで,これまで入力ストリームから読み込まれた文字数として代入される。 %n ディレクティブの実行は,書式設定された入力関数の実行が終了したときに返される代入カウントを増分しない。
%   1 つのパーセント記号に対応する。変換や代入は実行されない。完全な変換指定は %% である。


1 バイトまたはワイド文字。ただし,どちらも示されていない場合は,指定子の説明は両方に適用される。


前へ 次へ 目次 索引