ファイル共有付きでストリームを開きます。
構文
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または空の文字列である場合、これらの関数は、Parameter 検証で説明されているように、無効なパラメーター ハンドラーを呼び出します。 実行の継続が許可された場合、これらの関数は NULL を返し、errno を EINVAL に設定します。
これらのエラー コードやその他のエラー コードについては、「errno、_doserrno、_sys_errlist、および _sys_nerr」を参照してください。
解説
_fsopen 関数は、filename で指定されたファイルをストリームとして開き、モードおよび shflag 引数による定義に従って、後続の共有の読み取りまたは書き込み用にファイルを準備します。
_wfsopen は _fsopen のワイド文字バージョンであり、filename に対する mode 引数と _wfsopen 引数はワイド文字列です。 それ以外では、_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 に次の文字の 1 つを追加すると、改行の変換モードやファイル管理を指定できます。
| 任期 | 定義 |
|---|---|
t |
ファイルをテキスト (変換) モードで開きます。 このモードでは、復帰と改行 (CR-LF) の組み合わせは入力時に 1 つの改行 (LF) 文字に変換され、LF 文字は出力時に CR-LF の組み合わせに変換されます。 また、Ctrl + Z は入力時に EOF (end-of-file) 文字として解釈されます。 読み取りまたは読み取り/書き込み用にファイルを開いた場合、_fsopen はファイル末尾に Ctrl + Z があるかどうかを確認し、それを削除できる場合は削除します。
fseekとftellを使用して Ctrl + Z で終わるファイル内を移動すると、ファイルの末尾付近でfseekが不適切に動作する可能性があるため、削除されます。 |
b |
ファイルをバイナリ (無変換) モードで開き、前述の変換は行いません。 |
D |
最後のファイル ポインターが閉じられたときに削除される一時ファイルを指定します。 |
R |
キャッシュがディスクからのランダム アクセスに最適化されるように指定します。ただし、ランダム アクセスに限定されるわけではありません。 |
S |
キャッシュがディスクからのシーケンシャル アクセスに最適化されるように指定します。ただし、シーケンシャル アクセスに限定されるわけではありません。 |
T |
メモリ不足が必要な場合を除き、ディスクに書き込まれないファイルを指定します。 |
tまたはbがmodeで指定されていない場合、変換モードは既定のモード変数_fmodeによって定義されます。
t または b を引数の先頭に指定すると、エラーが発生して NULLが返されます。 テキスト モードとバイナリ モードの詳細については、「 Text および binary mode file I/O を参照してください。
TとDについて:
-
Tは、メモリ不足で必要ない限り、ファイルをディスクに書き込むのを回避します。 詳細については、FILE_ATTRIBUTE_TEMPORARYのと、このブログ投稿一時的なを参照してください。 -
Dは、ディスクに書き込まれる通常のファイルを指定します。 違いは、閉じられたときに自動的に削除されるということです。TDを組み合わせて両方のセマンティクスを取得できます。
_fsopen および _wfsopen は、Microsoft 固有の fopenのバリエーションです。 これらは ANSI 標準の一部ではありません。 より移植性が高く安全な機能については、ファイル共有が不要な場合は、 _wfopen_s または fopen_sを検討してください。
引数 shflag は、Share.h で定義されている次のマニフェスト定数のいずれかで構成した定数式です。
| 任期 | 定義 |
|---|---|
_SH_DENYNO |
読み取りおよび書き込みアクセスを許可します。 |
_SH_DENYRD |
ファイルへの読み取りアクセスを拒否します。 |
_SH_DENYRW |
ファイルへの読み取りおよび書き込みアクセスを拒否します。 |
_SH_DENYWR |
ファイルへの書き込みアクセスを拒否します。 |
既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。
汎用テキスト ルーチンのマップ
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.
関連項目
ストリーム入出力
fclose, _fcloseall
_fdopen, _wfdopen
ferror
_fileno
fopen, _wfopen
freopen, _wfreopen
_open, _wopen
_setmode
_sopen, _wsopen