34

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

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

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

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

4

1 に答える 1

46

fopen_sは、モード文字列用のいくつかの追加オプションと、ストリーム ポインタとエラー コードを返すための別のメソッドを備えた「安全な」バリアントです。fopenこれは 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 関数の欠落を参照してください。

于 2015-02-24T13:12:01.263 に答える