Visual Studio жалуется на fopen. Я не могу найти правильный синтаксис для его изменения. У меня есть:
FILE *filepoint = (fopen(fileName, "r"));
to
FILE *filepoint = (fopen_s(&,fileName, "r"));
Какова остальная часть первого параметра?
Visual Studio жалуется на fopen. Я не могу найти правильный синтаксис для его изменения. У меня есть:
FILE *filepoint = (fopen(fileName, "r"));
to
FILE *filepoint = (fopen_s(&,fileName, "r"));
Какова остальная часть первого параметра?
fopen_s
— это "безопасный" вариант fopen
с несколькими дополнительными параметрами для строки режима и другим методом возврата указателя потока и кода ошибки. Он был изобретен Microsoft и вошел в стандарт C: он задокументирован в приложении K.3.5.2.2 самого последнего проекта стандарта C11. Конечно, это полностью задокументировано в интерактивной справке 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.
}
Поддержка Microsoft для C99 является неуклюжей и неполной. Visual Studio выдает предупреждения для допустимого кода, заставляя использовать стандартные, но необязательные расширения, но в данном конкретном случае, похоже, не поддерживает strerrorlen_s
. Дополнительные сведения см. в статье отсутствует функция C11 strerrorlen_s в MSVC 2017. .
fopen
. Visual Studio может выдать предупреждение, предлагая пользователям писать менее переносимый код с помощью fopen_s()
. Добавленная семантика в fopen_s
, касающаяся разрешений по умолчанию и монопольного режима, лучше всего решать с помощью fdopen
, когда она доступна. strerror_s
требует, чтобы пользователь предоставил буфер, длина которого должна быть сначала вычислена путем вызова strerrorlen_s(err)
. Головная боль вряд ли стоит того.
- person chqrlie; 16.04.2016
strerrorlen_s
. См. stackoverflow. com/questions/44430141/ для получения дополнительной информации.
- person chqrlie; 25.11.2017
fopen_s
документирован в MSDN. Предполагается, что первый параметр должен бытьFILE**
, а возвращаемое значение —errno_t
. - person Michael   schedule 24.02.2015