Ошибка E0167: аргумент C типа * несовместим с параметром типа «FILE **»

#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 . Это сработало.