Почему я не могу использовать fopen?

У меня была та же проблема, и я нашел это решение:

if($("input[name='yourcheckbox']").is(':checked')) {
   console.log('chb checked');
} else {
   console.log('chb not checked');
}
24
задан Community 23 May 2017 в 12:16
поделиться

6 ответов

Существует официальный технический отчет ISO / IEC JTC1 / SC22 / WG14 (язык C) TR24731-1 (интерфейсы проверки границ) и его обоснование доступно по адресу:

Также ведется работа над TR24731-2 (функции динамического распределения).

Заявленное обоснование для fopen_s () :

6.5.2 Функции доступа к файлу

При создании файла функции fopen_s и freopen_s повышают безопасность, защищая файл от несанкционированного доступа, задавая его файл защиты и открытия файла с монопольным доступом.

В спецификации говорится:

6.5.2.1 Функция fopen_s

Краткое содержание

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
errno_t fopen_s(FILE * restrict * restrict streamptr,
                const char * restrict filename,
                const char * restrict mode);

Ограничения времени выполнения

Ни один из streamptr , ] имя файла ,или режим должен быть нулевым указателем.

Если есть нарушение ограничения времени выполнения, fopen_s не пытается открыть файл. Кроме того, если streamptr не является нулевым указателем, fopen_s устанавливает * streamptr в нулевой указатель.

Описание

Функция fopen_s открывает файл, имя которого является строкой, на которую указывает filename и связывает с ним поток.

Строка режима должна быть такой, как описано для fopen , с добавлением, что режимы запускаются с символом 'w' или 'a' может предшествовать символ 'u', см. ниже:

  • uw обрезать до нулевой длины или создать текстовый файл для записи, разрешения по умолчанию
  • ua добавить; открыть или создать текстовый файл для записи в конце файла, разрешения по умолчанию
  • uwb обрезать до нулевой длины или создать двоичный файл для записи, разрешения по умолчанию
  • uab добавить; открыть или создать двоичный файл для записи в конце файла, по умолчанию разрешения
  • uw + обрезать до нулевой длины или создать текстовый файл для обновления, разрешения по умолчанию
  • ua + добавить; открыть или создать текстовый файл для обновления, запись в конце файла, по умолчанию разрешения
  • uw + b или uwb + обрезать до нулевой длины или создать двоичный файл для обновления, по умолчанию разрешения
  • ua + b или uab + append; открыть или создать двоичный файл для обновления, записывая в конец файла, разрешения по умолчанию

В той степени, в которой базовая система поддерживает концепции, файлы открываются для записи должен быть открыт с эксклюзивным (также известным как неразделенный) доступом. Если файл создан, а первым символом строки режима не является 'u', поскольку базовая система поддерживает это, файл должен иметь права доступа, которые предотвращают другие пользователи системы от доступа к файлу. Если файл создается и первый символ строки режима - 'u', то к моменту закрытия файла он должен иметь системные разрешения доступа к файлам по умолчанию 10) .

Если файл был открыт успешно, то указатель на ФАЙЛ указывает на streamptr будет установлен указатель на объект, контролирующий открытый файл. В противном случае указатель в ФАЙЛ , на который указывает streamptr , будет установлен нулевой указатель.

Возвращает

Функция fopen_s возвращает ноль, если она открывала файл. Если он не открыл файл или если произошло нарушение ограничения времени выполнения, fopen_s возвращает ненулевое значение.

10) Это те же разрешения, с которыми файл был бы создан с помощью fopen.

20
ответ дан 28 November 2019 в 22:22
поделиться

Вы можете использовать fopen () . Серьезно, не обращайте внимания на Microsoft здесь, они оказывают программистам медвежью услугу, отклоняясь от стандартов ISO. Они, кажется, думают, что люди, пишущие код, каким-то образом лишены мозгов и не знают, как проверять параметры перед вызовом библиотечных функций.

Если кто-то не желает изучать тонкости программирования на C, ему действительно нечего делать. Это. Им следует перейти на более безопасный язык.

Похоже, это просто еще одна попытка Microsoft ограничить поставщиков разработчиками (хотя они не единственные, кто пробует это, поэтому я не ругаю их конкретно) . Обычно я добавляю:

#define _CRT_SECURE_NO_WARNINGS

(или вариант "- D" в командной строке) в большинство своих проектов, чтобы убедиться, что я m не беспокоится о компиляторе при написании совершенно правильного, допустимого кода C.

Microsoft предоставила дополнительные функции в функции fopen_s () (кодировки файлов, например), а также изменение способа возврата . Это может сделать его лучше для программистов Windows, но делает код по сути непереносимым.

Если вы собираетесь писать код только для Windows, обязательно используйте его. Я сам предпочитаю возможность компилировать и запускать мой код где угодно (с минимальными изменениями).


Начиная с C11, эти безопасные функции теперь являются частью стандарта, хотя и являются необязательными. Более подробную информацию см. В Приложении К.

Это может сделать его лучше для программистов Windows, но делает код по сути непереносимым.

Если вы собираетесь писать код только для Windows, обязательно используйте его. Я сам предпочитаю возможность компилировать и запускать мой код где угодно (с минимальными изменениями).


Начиная с C11, эти безопасные функции теперь являются частью стандарта, хотя и являются необязательными. Более подробную информацию см. В Приложении К.

Это может сделать его лучше для программистов Windows, но делает код по сути непереносимым.

Если вы собираетесь писать код только для Windows, обязательно используйте его. Я сам предпочитаю возможность компилировать и запускать мой код где угодно (с минимальными изменениями).


Начиная с C11, эти безопасные функции теперь являются частью стандарта, хотя и являются необязательными. Более подробную информацию см. В Приложении К.

46
ответ дан 28 November 2019 в 22:22
поделиться

Или это что-то еще?

В некоторых реализациях структуры FILE, используемой fopen, файловый дескриптор определен как unsigned short. Это оставляет вас с максимумом 255 одновременно открытых файлов, минус стандартный ввод, стандартный вывод и стандартный поток ошибок.

В то время как значение быть в состоянии иметь 255 открытых файлов спорно, конечно, эта деталь реализации материализуется на платформе Solaris 8, когда у вас более 252 разъемов ! То, что сначала показалось кажущейся случайной неудачей при установлении SSL-соединения с использованием libcurl в моем приложении, оказалось вызвано этим, но потребовалось развернуть отладочные версии libcurl и openssl и провести клиента через сценарий отладчика, чтобы наконец понять это.

Хотя это не полностью вина fopen, можно увидеть достоинства сброса оков старых интерфейсов; решение отказаться от рекомендаций может быть основано на том, что поддерживать двоичную совместимость с устаревшей реализацией сложно.

2
ответ дан 28 November 2019 в 22:22
поделиться

В новых версиях выполняется проверка параметров , а в старых - нет.

См. этот поток SO для получения дополнительной информации.

1
ответ дан 28 November 2019 в 22:22
поделиться

Безопасность потоков. fopen () использует глобальную переменную errno , тогда как замена fopen_s () возвращает errno_t и принимает FILE ** аргумент для хранения указателя файла.

1
ответ дан 28 November 2019 в 22:22
поделиться

По сути, это означает, что файлы, которые записывает приложение, по умолчанию защищены от других пользователей.

Они не сделали этого с fopen () из-за вероятности того, что существующий код сломается.

Microsoft решила отказаться от fopen () , чтобы побудить разработчиков Windows принимать осознанные решения о том, будут ли файлы, используемые их приложениями, иметь свободные права доступа или нет.

Ответ Джонатана Леффлера обеспечивает предлагаемую стандартизацию. язык для fopen_s () . Я добавил этот ответ, надеясь прояснить обоснование.

Microsoft решила отказаться от использования fopen () , чтобы побудить разработчиков Windows принимать осознанные решения о том, будут ли файлы, используемые их приложениями, иметь свободные права доступа или нет.

Ответ Джонатана Леффлера обеспечивает предлагаемый язык стандартизации для fopen_s () . Я добавил этот ответ, надеясь прояснить обоснование.

Microsoft решила отказаться от использования fopen () , чтобы побудить разработчиков Windows принимать осознанные решения о том, будут ли файлы, используемые их приложениями, иметь свободные права доступа или нет.

Ответ Джонатана Леффлера обеспечивает предлагаемый язык стандартизации для fopen_s () . Я добавил этот ответ, надеясь прояснить обоснование.

8
ответ дан 28 November 2019 в 22:22
поделиться