fopen() - ファイルのオープン

標準

標準/拡張機能 C/C++ 依存項目

ISO C
POSIX.1
XPG4
XPG4.2
C99
Single UNIX Specification、バージョン 3

両方  

形式

#include <stdio.h>

FILE *fopen(const char *__restrict__filename, const char *__restrict__mode);

機能説明

fopen() 関数は、filename で指定されたファイルをオープンし、ストリームをそれに関連付けます。mode 変数は、ファイルに要求されたアクセス・タイプを指定する文字ストリングです。mode 変数には、オプションのキーワード・パラメーターが後に続く、位置パラメーターが 1 つ含まれます。定位置パラメーターについては、表 1表 2 に説明があります。

位置パラメーターは小文字で受け渡されなければなりません。

キーワード・パラメーターは大文字小文字が混在していても構いません。それらはコンマで区切られなければなりません。キーワードのインスタンスは 1 つだけ指定できます。

fopen() に渡すファイル名により、通常、オープンされるファイルの タイプが判別されます。ファイルの命名規則が存在します。それらによって、特に MVS™ と HFS ファイルの両方を参照するアプリケーションを作成するこ とができます。fopen() が filenamemode のストリングからファイル・タイプを判別する方法の詳細については、「z/OS XL C/C++ プログラミング・ガイド」の『ファイルのオープン』に関するトピックを参照してください。

z/OS UNIX の大規模ファイルのサポート: AMODE 64 C/C++ アプリケーションの場合は、z/OS UNIX の大規模ファイルが自動的にサポートされます。AMODE 31 C/C++ アプリケーションは、オプション LANGLVL(LONGLONG) を指定してコンパイルされなければなりません。また、ヘッダーがインクルードされる前に _LARGE_FILES フィーチャー・テスト・マクロを定義して、2 GB のサイズより大きい z/OS UNIX ファイルをこの関数が操作できるようにしなければなりません。ファイル・サイズとオフセット・フィールドは、63 ビットの幅に拡張されます。したがって、_LARGE_FILES フィーチャー・テスト・マクロの定義も行うには、ファイルを操作する他のいずれかの関数が必要です。

マルチスレッド環境の名前付きパイプ: fopen() を使用して、マルチスレッド環境で名前付きパイプをオープンしないでください。使用した場合、デッドロックが起こる可能性があります。詳細は、「z/OS XL C/C++ プログラミング・ガイド」を参照してください。

ファイル・モード

制約事項: POSIX(OFF) を指定して実行する場合 に t を含むモード・パラメーター、例えば、rtrt+r+twtwt+w+tatat+、または a+t を指定すると、 fopen() 要求は、無効なモードが指定されたことを示すメッセージを出して失敗します。
表 1. 位置パラメーターの値
ファイル・モード 機能説明
r 読み取り用にテキスト・ファイルをオープンする (ファイルは必ず存在しなければならない)。
w 書き込み用にテキスト・ファイルをオープンする。w モードが、DISP=MOD を指定した ddname に指定されると、動作は a が指定された場合と同じになります。その他の場合は、ファイルが既に存在すると、その内容は壊れます。
a ファイルの終わりに書き込む付加モードで、テキスト・ファイルをオープンする。fopen() は、ファイルが存在しないときにはファイルを作成する。
r+ 読み取りおよび書き込み用にテキスト・ファイルをオープンする。(ファイルは必ず存在しなければならない)。
w+ 読み取りおよび書き込み用にテキスト・ファイルをオープンする。w+ モードが、DISP=MOD を指定した ddname に指定されると、動作は a+ が指定された場合と同じになります。その他の場合は、ファイルが既に存在すると、その内容は壊れます。
a+ 読み取りおよびファイルの終わりでの更新用に、付加モードでテキスト・ファイ ルをオープンする。fopen() は、ファイルが存在しないときにはファイルを作成する。
rb 読み取り用にバイナリー・ファイルをオープンする(ファイルは必ず存在しなければならない)。
wb 書き込み用に空のバイナリー・ファイルをオープンする。wb モードが、DISP=MOD を指定した ddname に指定されると、動作は ab が指定された場合と同じになります。その他の場合は、ファイルが既に存在すると、その内容は壊れます。
ab ファイルの終わりでの書き込み用に、付加モードでバイナリー・ファイルをオー プンする。fopen() は、ファイルが存在しないときにはファイルを作成する。
rt 読み取り用にテキスト・ファイルをオープンする (ファイルは必ず存在しなければならない)。
wt 書き込み用にテキスト・ファイルをオープンする。ファイルが既に存在すると、その内容は壊れます。
at ファイルの終わりに書き込む付加モードで、テキスト・ファイルをオープンする。fopen() は、ファイルが存在しないときにはファイルを作成する。
r+b または rb+ 読み取りおよび書き込み用にバイナリー・ファイルをオープンする(ファイルは必ず存在しなければならない)。
w+b または wb+ 読み取りおよび書き込み用に空のバイナリー・ファイルをオープンする。w+b (または wb+) モードが、DISP=MOD を指定した ddname に指定されると、動作は ab+ が指定された場合と同じになります。その他の場合は、ファイルが既に存在すると、その内容は壊れます。
a+b または ab+ 読み取りおよびファイルの終わりでの更新用に、付加モードでバイナリー・ファイ ルをオープンする。fopen() は、ファイルが存在しないときにはファイルを作成する。
r+t または rt+ 読み取りおよび書き込み用にテキスト・ファイルをオープンする。(ファイルは必ず存在しなければならない)。
w+t または wt+ 読み取りおよび書き込み用にテキスト・ファイルをオープンする。ファイルが既に存在すると、その内容は壊れます。
a+t または at+ 読み取りおよびファイルの終わりでの更新用に、付加モードでテキスト・ファイ ルをオープンする。fopen() は、ファイルが存在しないときにはファイルを作成する。
重要: ww+wbw+b、および wb+ パラメーターを使用する場合は注意 が必要です。同じ名前の既存ファイルにあるデータは失われます。
テキスト・ファイル には、印刷可能文字と制御文字によって構成 された行が含まれます。各行は改行文字で終わります。システムは出力テキスト・ストリームに制御文字を挿入、または変換します。 例えば、MVS DASD テキスト・ファイルに ¥r が書き込まれた場合は、¥n (改行) が書き込まれたと同様に扱われます。
注: 比較すると、テキスト・ストリームへのデータ出力は、同じテキス ト・ストリームからのデータ入力とは等しくなりません。

バイナリー・ファイル には、一連の文字が含まれます。バイナリー・ファイルでは、システムは入力または出力の際に制御文字を変換 しません。z/OS® XL C/C++ では、一部のタイプのファイルは、テキスト・モードでオープンされたときでも、常に、バイナリー・ファイルとして扱われます。

そのような場合、制御文字はファイルへバイナリー・データとして書き込まれます。入力の際は、制御文字は、書き込みのとおりに読み戻されます。詳細については、「z/OS XL C/C++ プログラミング・ガイド」でバイト・ストリーム・モデルに関するトピックを参照してください。

z/OS XL C/C++ には、Record I/O および Blocked I/O というファイル拡張子があります。これらのファイルは実質的にバイナリーで (データ変換処理はありません)、追加の修飾子 type=record および type=blocked を必要とします。詳細については、「z/OS XL C/C++ プログラミング・ガイド」で、レコード入出力ファイルへの書き込みおよびブロック入出力への書き込みに関するトピックを参照してください。

ファイルを aa+aba+b、または ab+ モードでオープンす るとき、すべての書き込み操作はファイルの終わりで行われます。fseek()、fsetpos()、または rewind() を使用してファイル・ ポインターの位置を変更できますが、書き込み関数は、出力操作を実行する前 に、ファイル・ポインターをファイルの終わりに移動し直します。このアクションは、既存データへの上書きを防ぐためのものです。

更新モード (2 または 3 番目の位置に + を使用して) を指定す る場合は、ファイルの読み書き両方ができます。ただし、読み取りと書き込みの切り替えを行うとき、fseek()、fsetpos()、rewind()、fflush() などの位置設定関数を介在させる必要があります。出力は、EOF が検出された場合、入力の直後に行われます。

表 2. ファイル・モード用キーワード・パラメーター
パラメーター 説明
abend=value オープンされるストリームに対して OS 入出力操作時に発行される異常終了から、ランタイム・ライブラリーがリカバリーしようとするかどうかを制御します。value は、abend または recover が可能です。詳細は、z/OS XL C/C++ プログラミング・ガイドを参照してください。
acc=value VSAM データ・セットのアクセス方向の標識。fwd または bwd が可能。
acc=bwd 最終レコードへのファイル位置標識を設定する。アクセス方向は、flocate() を呼び出して変更できる。
asis ファイル名が大文字に変換されずに、そのまま使用されることを指定する。このオプションは、POSIX ではデフォルトである。また、HFS ファイル名でのデフォルトでもある (詳細は、「z/OS XL C/C++ プログラミング・ガイド」を参照のこと)。
blksize=value レコードの物理ブロックの最大長をバイトで指定する。blksize パラメーターが有効で、かつ制限内であるかどうかをチェックするために、オープンしているファイルのタイプについて、「z/OS XL C/C++ プログラミング・ガイド」の該当するトピックを参照。
byteseek バイナリー・ファイルに対してバイト・シークが可能であるかを表す標識。詳細は、ftell() および fseek() 関数を参照。
lrecl=value 固定長レコードの長さと、可変長レコードの最大長を、バイトで指定する。lrecl パラメーターが有効で、かつ制限内であるかどうかをチェックするために、オープンしているファイルのタイプについて、「z/OS XL C/C++ プログラミング・ガイド」の該当するトピックを参照。
noseek ストリームが位置変更関数を一切使用していないことを示す。これによってパフォーマンスが改善できる。
password=xxxxxxx VSAM データ・セットにパスワードを指定する。
recfm=A ASA 印刷制御文字。
recfm=F 固定長、非ブロック化。
recfm=FA 固定長、ASA 印刷制御文字。
recfm=FB 固定長、ブロック化。
recfm=FM 固定長、マシン印刷制御コード。
recfm=FS 固定長、非ブロック化、標準。
recfm=FBA 固定長、ブロック化、ASA 印刷制御文字。
recfm=FBM 固定長、ブロック化、マシン印刷制御コード。
recfm=FBS 固定長、非ブロック化、標準、ASA 印刷制御文字。
recfm=FSA 固定長、非ブロック化、標準、ASA 印刷制御文字。
recfm=FSM 固定長、非ブロック化、標準、マシン印刷制御コード。
recfm=FBSA 固定長、ブロック化、標準、ASA 印刷制御文字。
recfm=FBSM 固定長、ブロック化、標準、マシン印刷制御コード。
recfm=U 未定義長。
recfm=UA 未定義長、ASA 印刷制御文字。
recfm=UM 未定義長、マシン印刷制御コード。
recfm=V 可変長、非ブロック化。
recfm=VA 可変長、ASA 印刷制御文字。
recfm=VB 可変長、ブロック化。
recfm=VM 可変長、マシン印刷制御コード。
recfm=VS 可変長、非ブロック化、スパン。
recfm=VBA 可変長、ブロック化、ASA 印刷制御文字。
recfm=VBM 可変長、ブロック化、マシン印刷制御コード。
recfm=VBS 可変長、ブロック化、スパン。
recfm=VSA 可変長、非ブロック化、スパン、ASA 印刷制御文字。
recfm=VSM 可変長、非ブロック化、スパン、マシン印刷制御コード。
recfm=VBSA 可変長、ブロック化、スパン、ASA 印刷制御文字。
recfm=VBSM 可変長、ブロック化、スパン、マシン印刷制御コード。
recfm=* ファイルが書き込みモードでオープンされると、既存のファイル属性が使用される。
注: 既存の DASD データ・セットにのみ recfm=* の使用が有効。その他すべての場合は無視される。
recfm=+ 以下の例外を除いて、recfm=* と同一。
  • 既存の DASD データ・セットに対するレコード・フォーマットがない場合、そ のデータ・セットが存在しないかのようにデフォルトが割り当てられる。
  • 追加モードが使用されると、fopen() は失敗する。
fopen() のデフォルト属性について詳しくは、「z/OS XL C/C++ プログラミング・ガイド」を参照。
samethread このパラメーターは、ストリームに対する入出力操作が、ストリームがオープンされたスレッドに限定されることを指定する。ライブラリーは、マルチスレッド環境では、ストリームをロックしない。このキーワードを使用すると、このストリームが他のスレッドでアクセスされる必要がないときに、パフォーマンスが改善できる。
space Space 属性は MVS データ・セット用。パラメーター内に、埋め込まれたブランクを入れることはできない。
この場合、
u
要求されたスペースの装置タイプ
p
要求された 1 次スペース量
s
要求された 2 次スペース量
d
要求されたディレクトリー・スペースの番号

このパラメーターの構文の詳細については、「z/OS XL C/C++ プログラミング・ガイド」で fopen() と freopen() のパラメーターに関するトピックを参照。

type=blocked このパラメーターは、順次ブロック入出力用にファイルがオープンされることを指定する。このファイルは、バイナリー・ファイルとしてオープンされる必要がある。そうしないと、fopen() は失敗する。読み取り操作と書き込み操作は、fread() と fwrite() によって行う。
type=memory このパラメーターは、C プログラムからのみアクセスできるメモリー・フ ァイルとして、このファイルを識別する。
type=memory (hiperspace) MVS/ESA を使用している場合、HIPERSPACE サブオプションを使用して、ハイパースペース・メモリー・ファイ ルをオープンすることができる。
制約事項: AMODE 64 アプリケーションの場合、type=memory(hiperspace)type=memory と して扱われる。
type=record このパラメーターは、順次レコード入出力用にファイルがオープンされることを指定する。 このファイルは、バイナリー・ファイルとしてオープンされる必要がある。そうしないと、fopen() は失敗する。 読み取り操作と書き込み操作は、fread() と fwrite() によって行う。VSAM クラスターにアクセスする場合、これが fopen() のデフォルト・ モードである。

戻り値

正常に実行された場合、fopen() は、関連ストリームを制御するオブジェクトへのポインターを戻します。

正常に実行されなかった場合、fopen() は NULL ポインターを戻します。

fopen() は、一般に、パラメーターが一致しないと失敗します。

HFS 用大規模ファイルの特殊な動作: errno が取る値は次のとおりです。
エラー・コード
説明
EOVERFLOW
名前付きファイルは通常のファイルであり、ファイルのサイズは、off_t 型のオブジェクトでは正しく表すことができません。

CELEBF26
⁄* CELEBF26                                      

   This example attempts to open two files for reading, myfile.dat              
   and myfile2.dat.                                                             
                                                                                
 *⁄                                                                             
#include <stdio.h>                                                              
                                                                                
int main(void)                                                                  
{                                                                               
   FILE *stream;                                                                
                                                                                
   ⁄* The following call opens a text file for reading *⁄                       
                                                                                
   if ((stream = fopen("myfile.dat", "r")) == NULL)                             
      printf("Could not open data file for reading¥n");                         
                                                                                
   ⁄* The following call opens:                                                 
              the file myfile2.dat,                                             
              a binary file for reading and writing,                            
              whose record length is 80 bytes,                                  
              and maximum length of a physical block is 240 bytes,              
              fixed-length, blocked record format                               
              for sequential record I⁄O.                                        
   *⁄                                                                           
                                                                                
   if ( (stream = fopen("myfile2.dat", "rb+, lrecl=80,¥                         
      blksize=240, recfm=fb, type=record")) == NULL )                           
      printf("Could not open data file for read update¥n");                     
}                                                                               

関連情報