_fsopen, _wfsopen

ファイル共有付きでストリームを開きます。

構文

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 のポインター値を返します。 パラメーター検証の説明に従って、これらの関数が無効なパラメーター ハンドラーを呼び出す場合、modeNULLまたは空の文字列である場合filename。 実行の継続が許可された場合、これらの関数は NULL を返し、errnoEINVAL に設定します。

これらのエラー コードやその他のエラー コードについては、「errno_doserrno_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+" を使用してファイルを開くと、すべての書き込み操作はファイルの末尾から行われます。 ファイル ポインターは、またはrewindを使用してfseek再配置できますが、書き込み操作が実行される前に常にファイルの末尾に戻ります。したがって、既存のデータを上書きすることはできません。 "r+""w+"、または "a+" のいずれかのアクセスの種類を指定すると、読み取りと書き込みの両方を行うことができます (この場合、ファイルは「更新用に開かれる」と言います)。 ただし、読み取りと書き込みを切り替える場合は、その前に fsetposfseek、または rewind のいずれかの操作を実行する必要があります。 必要に応じて、fsetpos 関数または fseek 関数には現在位置を指定できます。 上記の値に加え、mode に次の文字の 1 つを追加すると、改行の変換モードやファイル管理を指定できます。

任期 定義
t ファイルをテキスト (変換) モードで開きます。 このモードでは、復帰と改行 (CR-LF) の組み合わせは入力時に 1 つの改行 (LF) 文字に変換され、LF 文字は出力時に CR-LF の組み合わせに変換されます。 また、Ctrl + Z は入力時に EOF (end-of-file) 文字として解釈されます。 読み取りまたは読み取り/書き込み用にファイルを開いた場合、_fsopen はファイル末尾に Ctrl + Z があるかどうかを確認し、それを削除できる場合は削除します。 Ctrl + Z で終わるファイル内を使用 fseek して ftell 移動すると、ファイルの末尾付近で不適切な動作が発生する可能性 fseek があるため、削除されます。
b ファイルをバイナリ (無変換) モードで開き、前述の変換は行いません。
D 最後のファイル ポインターが閉じられたときに削除される一時ファイルを指定します。
R キャッシュがディスクからのランダム アクセスに最適化されるように指定します。ただし、ランダム アクセスに限定されるわけではありません。
S キャッシュがディスクからのシーケンシャル アクセスに最適化されるように指定します。ただし、シーケンシャル アクセスに限定されるわけではありません。
T メモリ不足が必要な場合を除き、ディスクに書き込まれないファイルを指定します。

変換モードが既定のモード変数_fmodemode定義されている場合、またはb指定されていない場合tは、変換モードが定義されます。 t または b を引数の先頭に指定すると、エラーが発生して NULLが返されます。 テキストモードとバイナリモードの詳細については、テキストモードおよびバイナリモードファイルI/Oを参照してください

に関してT:D

  • T は、メモリ不足で必要ない限り、ファイルをディスクに書き込むのを回避します。 詳細については、「File 属性定数」を参照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