_fsopen、_wfsopen
更新 : 2007 年 11 月
ストリームをファイル共有モードで開きます。
FILE *_fsopen(
const char *filename,
const char *mode,
int shflag
);
FILE *_wfsopen(
const wchar_t *filename,
const wchar_t *mode,
int shflag
);
パラメータ
filename
開くファイルの名前。mode
アクセス許可の種類。shflag
可能な共有の種類。
戻り値
これらの各関数は、ストリームへのポインタを返します。エラーが発生すると、NULL のポインタ値を返します。filename または mode が NULL または空の文字列の場合、これらの関数は、「パラメータの検証」に説明されているように、無効なパラメータ ハンドラを呼び出します。実行の継続が許可された場合、これらの関数は NULL を返し、errno を EINVAL に設定します。
エラー コードの詳細については、「_doserrno、errno、_sys_errlist、および _sys_nerr」を参照してください。
解説
_fsopen 関数は、filename でストリームとして指定されたファイルを開き、モードと shflag で定義されているように、そのファイルを以降の共有読み取りまたは共有書き込み用に準備します。_wfsopen は _fsopen のワイド文字バージョンです。_wfsopen の引数 filename と mode はワイド文字列です。それ以外では、_wfsopen と _fsopen の動作は同じです。
mode 文字列には、ファイルに要求するアクセス モードを指定します。次の表にアクセス モードを示します。
用語 |
定義 |
---|---|
"r" |
読み出し用に開きます。ファイルが存在しない場合や見つからない場合、_fsopen 呼び出しは失敗します。 |
"w" |
書き込み用に空のファイルを開きます。指定したファイルが既に存在すると、そのファイルの内容は破棄されます。 |
"a" |
末尾に書き込みができるようにファイルを開きます (追加モード)。ファイルが存在しない場合は、先にファイルを作成します。 |
"r+" |
読み出しと書き込みの両方のモードで開きます。ファイルが存在している必要があります。 |
"w+" |
読み出しと書き込みの両方のモードで空のファイルを開きます。指定したファイルが既に存在すると、そのファイルの内容は破棄されます。 |
"a+" |
読み出しと追加の両方のモードでファイルを開きます。ファイルが存在しない場合は、先にファイルを作成します。 |
"w" と "w+" は、既存のファイルを破棄するので注意して使用してください。
ファイルを "a" または "a+" のアクセス モードで開くと、書き込み操作はすべてファイルの終端から行われます。ファイル ポインタは fseek 関数または rewind 関数で移動できますが、書き込み操作の前に必ずファイルの終端に戻されます。したがって、既存のデータは上書きされません。"r+"、"w+"、または "a+" のいずれかのアクセス モードを指定すると、読み出しと書き込みの両方が許可されます (ファイルは更新モードで開きます)。ただし、読み出しと書き込みを切り替えるときは、その前に fsetpos、fseek、rewind のいずれかの関数を実行する必要があります。必要に応じて、fsetpos 関数または fseek 関数には現在位置を指定できます。上記の値以外に、mode に次の文字を追加すると、改行文字の変換モードを指定できます。
用語 |
定義 |
---|---|
t |
ファイルをテキスト (変換) モードで開きます。このモードでは、入力時にキャリッジ リターンとライン フィード (CR-LF: carriage return–line feed) が単独のライン フィード (LF: line feed) に変換され、出力時に LF 文字が CR-LF に変換されます。また、Ctrl + Z は入力時に EOF (EOF: end-of-file) 文字として解釈されます。読み出しモードまたは読み出しと書き込みの両方のモードで開かれたファイルでは、_fsopen がファイル末尾の Ctrl + Z の有無を調べ、削除できる場合は削除します。これは、Ctrl + Z で終わるファイル内を fseek 関数および ftell 関数で移動するとき、ファイル末尾近くで fseek が正しく動作しないことがあるためです。 |
b |
ファイルをバイナリ (非変換) モードで開きます。上記の変換は行われません。 |
t または b を mode で指定しなければ、変換モードは既定モードの _fmode 変数によって定義されます。t または b を引数の先頭に指定すると、エラーが発生して NULL が返されます。テキスト モードとバイナリ モードについては、「テキスト モードとバイナリ モードのファイル入出力」を参照してください。
shflag 引数は、Share.h で定義されている次の記号定数 (manifest 定数) のいずれかで構成される定数式です。
用語 |
定義 |
---|---|
_SH_COMPAT |
16 ビット アプリケーションに対応した互換モードを設定します。 |
_SH_DENYNO |
読み出しアクセスおよび書き込みアクセスを許可します。 |
_SH_DENYRD |
ファイルの読み出しを禁止します。 |
_SH_DENYRW |
ファイルの読み出しと書き込みを禁止します。 |
_SH_DENYWR |
ファイルの書き込みを禁止します。 |
汎用テキスト ルーチンのマップ
Tchar.h のルーチン |
_UNICODE および _MBCS が未定義の場合 |
_MBCS が定義されている場合 |
_UNICODE が定義されている場合 |
---|---|---|---|
_tfsopen |
_fsopen |
_fsopen |
_wfsopen |
必要条件
関数 |
必須ヘッダー |
省略可能なヘッダー |
---|---|---|
_fsopen |
<stdio.h> |
<share.h> shflag パラメータのマニフェスト定数を定義します。 |
_wfsopen |
<stdio.h> または <wchar.h> |
<share.h> shflag パラメータのマニフェスト定数を定義します。 |
使用例
// crt_fsopen.c
#include <stdio.h>
#include <stdlib.h>
#include <share.h>
int main( void )
{
FILE *stream;
// Open output file for writing. Using _fsopen allows us to
// ensure that no one else writes to the file while we are
// writing to it.
//
if( (stream = _fsopen( "outfile", "wt", _SH_DENYWR )) != NULL )
{
fprintf( stream, "No one else in the network can write "
"to this file until we are done.\n" );
fclose( stream );
}
// Now others can write to the file while we read it.
system( "type outfile" );
}
No one else in the network can write to this file until we are done.