web-dev-qa-db-ja.com

fopenからfopen_sに移行する方法

Visual Studioはfopenについて不平を言っています。変更するための適切な構文が見つかりません。私が持っています:

FILE *filepoint = (fopen(fileName, "r"));

FILE *filepoint = (fopen_s(&,fileName, "r"));

最初のパラメーターの残りは何ですか?

13
beatleman

fopen_sfopen "secure"バリアントで、モード文字列用のいくつかの追加オプションと、ストリームポインターとエラーを返すための別の方法がありますコード。 Microsoftによって発明され、C標準に組み込まれました。C11標準の最新ドラフトの付録K.3.5.2.2に文書化されています。もちろん、Microsoftのオンラインヘルプに完全に文書化されています。 Cの出力変数にポインターを渡す概念を理解していないようです。この例では、filepointのアドレスを最初の引数として渡す必要があります。

errno_t err = fopen_s(&filepoint, fileName, "r");

完全な例を次に示します。

#include <errno.h>
#include <stdio.h>
#include <string.h>
...
FILE *filepoint;
errno_t err;

if ((err = fopen_s(&filepoint, fileName, "r")) != 0) {
    // File could not be opened. filepoint was set to NULL
    // error code is returned in err.
    // error message can be retrieved with strerror(err);
    fprintf(stderr, "cannot open file '%s': %s\n",
            fileName, strerror(err));
    // If your environment insists on using so called secure
    // functions, use this instead:
    char buf[strerrorlen_s(err) + 1];
    strerror_s(buf, sizeof buf, err);
    fprintf_s(stderr, "cannot open file '%s': %s\n",
              fileName, buf);
} else {
    // File was opened, filepoint can be used to read the stream.
}

C99に対するMicrosoftのサポートは不格好で不完全です。 Visual Studioは有効なコードに対して警告を生成し、標準だがオプションの拡張機能の使用を強制しますが、この特定のケースではstrerrorlen_sをサポートしていないようです。詳細については、 MSVC 2017ではC11 strerrorlen_s関数がありません を参照してください。

25
chqrlie