fopen / fopen_s и пишущий в файлы

Я использую fopen в C для записи вывода в текстовый файл. Объявление функции (где ARRAY_SIZE был определен ранее):

void create_out_file(char file_name[],long double *z1){  
  FILE *out;  
  int i;  

  if((out = fopen(file_name, "w+")) == NULL){  
    fprintf(stderr, "***> Open error on output file %s", file_name);  
    exit(-1);  
  }  

  for(i = 0; i < ARRAY_SIZE; i++)  
    fprintf(out, "%.16Le\n", z1[i]);  
  fclose(out);  
}  

Мои вопросы:

  1. На компиляции с MVS2008 я получаю предупреждение: предупреждение C4996: 'fopen': Эта функция или переменная могут быть небезопасными. Рассмотрите использование fopen_s вместо этого. Я не имею, посмотрите много информации о fopen_s так, чтобы я мог изменить свой код. Какие-либо предложения?

  2. Может каждый сообщать fprintf записать числа в желаемой числовой точности в файл? Если я использую long double затем я предполагаю, что мои ответы хороши до 15 цифр после десятичной точки.Я прав?

22
задан Jean-François Corbett 15 October 2015 в 14:36
поделиться

3 ответа

fopen_s - это вариант fopen , который содержит проверку параметров и возвращает код ошибки вместо указателя на случай, если что-то пойдет не так во время процесса открытия. Он более безопасен, чем базовый вариант, поскольку учитывает большее количество граничных условий. Компилятор предупреждает вас использовать его, потому что fopen представляет собой потенциальный вектор эксплуатации в вашем приложении.

Вы можете указать цифры точности для семейства функций printf с помощью спецификатора %. Xg , где x - желаемые цифры точности. на выходе. long double различается по точности от платформы к платформе, но обычно вы можете сделать ставку на то, что это не менее 16 цифр десятичной точности.

Редактировать: Хотя я не совсем согласен с другими, которые предполагают, что fopen_s является полной пустой тратой времени, это действительно представляет собой довольно низкую вероятность эксплуатации и широко не поддерживается. Однако некоторые другие функции, о которых предупреждается в разделе C4996, представляют собой гораздо более серьезные уязвимости, и использование _CRT_SECURE_NO_WARNINGS эквивалентно отключению будильника как для «вы оставили дверь спальни незапертой», так и «вы оставили ядерную бомба на кухне ».

Если вы не ограничены использованием «чистого C» для вашего проекта (например,для школьного задания или встроенного микроконтроллера), вам следует воспользоваться тем фактом, что почти все современные компиляторы C также являются компиляторами C ++ и используют варианты C ++ iostream всех этих функций ввода-вывода по порядку для одновременного повышения безопасности и .

20
ответ дан 29 November 2019 в 04:29
поделиться
  1. fopen_s и все другие функции _s являются специфичными для MS "безопасными" вариантами стандартных функций. Если ваш код не должен быть кроссплатформенным, вы можете просто переключиться и порадовать компилятор. В противном случае просто добавьте директиву препроцессора _CRT_SECURE_NO_WARNINGS в настройки вашего проекта, и он перестанет предупреждать вас об этом.

  2. Да, длинное двойное число легко подходит для 15-значной точности; на самом деле, для этого достаточно даже обычных двойников (но не более того).

6
ответ дан 29 November 2019 в 04:29
поделиться

Просто определите _CRT_SECURE_NO_WARNINGS , прежде чем включать какой-либо файл, чтобы избавиться от этих предупреждений, и не верьте тому, что говорит MS о fopen

1
ответ дан 29 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: