#c #c #visual-c
#c #c #visual-c
Вопрос:
я очень новичок в C, и, работая над примерами в книге, я продолжаю получать ошибку «C аргумент типа * несовместим с параметром типа **». Я использую Visual studio 2019 C . Вот где я получаю сообщение об ошибке при использовании fopen_s:
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *inFile;
inFile = fopen_s("prices.dot","r"); /*Here is the line with an error*/
if (inFile == NULL)
{
printf("nThis file does not existL");
printf("nPlease make sure that this file currently exist");
exit(1);
}
printf("nThe file has been succfully open for reading.");
return(0);
}
когда я использую «fopen», я получаю предупреждение, в котором мне предлагается использовать fopen_s, а когда я использую fopen_s, я получаю другую ошибку. Мне было интересно, могу ли я получить какую-либо помощь в решении этого вопроса. Спасибо!
Комментарии:
1. Вы используете C или C ? Весь этот код выглядит как C.
2.
fopen_s
имеет подпись, отличнуюfopen
от .3. Аргументы to
fopen_s
не совпадают сfopen
. См . docs.microsoft.com/en-us/cpp/c-runtime-library/reference /…4. Я предлагаю вам отключить предупреждения, которые говорят вам использовать
_s
версии функций. Все они зависят от Microsoft, поэтому ваш код больше не переносим.5.
auto res = fopen_s(amp;inFile, "prices.dot","r")
.
Ответ №1:
Если вы загуглите «MSDN fopen_s» и прочтете документацию в сети разработчиков Microsoft, вы обнаружите, что прототип функции не идентичен fopen():
errno_t fopen_s(
FILE** pFile,
const char *filename,
const char *mode
);
Это означает, что ваш код в этой области изменится, чтобы выглядеть следующим образом:
FILE *inFile;
errno_t errcode;
errcode = fopen_s(amp;inFile, "prices.dot","r");
if (errcode != 0) { /* do error handling, perhaps quit */ }
С другой стороны, вы можете продолжать писать код на C в старом стиле и просто использовать «fopen ()», а в верхней части вашего файла, чтобы закрыть компилятор MSVC, добавьте следующий #define:
#define _CRT_SECURE_NO_WARNINGS
Обратите внимание, что функция fopen_s() была добавлена в стандарт C 2011 и описана в разделе K.3.5.2.1 — это означает, что это все еще переносимый код C на любом современном компиляторе C.
Ваша книга, вероятно, старше 2011 года, и в то время эта функция не была частью C.
Комментарии:
1. Спасибо всем вам за ответы и предложения. Да, я использую C. Я отключил предупреждение, используя #define _CRT_SECURE_NO_WARNINGS . Это сработало.