Visual Studio が fopen について不平を言っています。それを変更するための適切な構文が見つかりません。私は持っている:
FILE *filepoint = (fopen(fileName, "r"));
に
FILE *filepoint = (fopen_s(&,fileName, "r"));
最初のパラメータの残りは何ですか?
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 関数の欠落を参照してください。