Remkomplekty.ru

IT Новости из мира ПК
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Fopen c ошибка

Избавляемся от ошибки «This function or variable may be unsafe» в Visual Studio

Время чтения: 5 минут

Компилятор в Visual Studio сильно отличается от привычных большинству программистов GCC или CLANG, из-за чего при написании кода на C или C++ очень часто возникают неожиданные проблемы в виде ошибки использования стандартных функций, например, scanf, fopen, sscanf и тому подобным. Студия предлагает заменять функции на безопасные (повезёт, если нужно просто добавить _s к функции с ошибкой, но нередко в этих функциях идёт иной набор аргументов, нежели в обычной программе). Если вы не готовы с этим мириться, то этот пост для вас!

Давайте для начала создадим обычный консольный проект в Visual Studio и напишем простенькую программу, которая запрашивает ввод двух чисел, вводит их и затем выводит на экран.

Попробовав выполнить сборку проекта, обнаружим те самые ошибки.

Чтобы Visual Studio не тратила ваши нервы, сделаем следующее:

1. Выберем пункт «Проект» в верхнем меню

2. В открывшемся списке щёлкнем по «Свойства название_проекта»

3. В появившемся окне выберем Свойства конфигурации , C/C++ , Препроцессор

4. В строке Определения препроцессора допишем в самый конец строку ;_CRT_SECURE_NO_WARNINGS

6. Попробуем заново выполнить сборку проекта:

Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!

Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов

Языки программирования: C, C++, Pascal, C#

Студент МГУ им. М.В. Ломоносова

А Вы знаете, что мы пишем программы на C, C++, C#, Pascal и Python?

Так что если Вам нужно написать программу на C/C++, C#, Pascal или Python — мы с радостью поможем с этим!

В том числе мы занимаемся репетиторством по информатике и программированию, а также готовим к ОГЭ и ЕГЭ!

Почему именно мы?

  • Более 1800 выполненных заказов;
  • Более 170 отзывов;
  • Качественное решение
  • Короткие сроки и привлекательные цены
  • Различные акции и скидки

Как с нами связаться?

  • группа Вконтакте: vk.com/programforyou
  • наша почта: order@programforyou.ru

Programforyou — позвольте нам писать код для вас и вы получите качественное решение в короткие сроки по привлекательной цене!

функции fopen устаревшие предупреждения

On компилятор Visual Studio 2005 C++, Я получаю следующее предупреждение, когда мой код использует fopen и такие призывы.

Как мне это предотвратить?

10 ответов:

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

директива препроцессора также может быть добавлена в настройки проекта, чтобы влияние его на все файлы в рамках проекта. Для этого добавьте _CRT_SECURE_NO_DEPRECATE до Свойства Проекта — > Свойства Конфигурации — > C / C++ — > Препроцессор — > Определения Препроцессора.

Ну вы могли бы добавить:

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

проблема с простым отключением устаревших предупреждений о функциях заключается в том, что Microsoft может удалить рассматриваемую функцию в более поздней версии CRT, нарушив ваш код (как указано ниже в комментариях, это не произойдет в этом случае с fopen, потому что это часть стандартов ISO C & C++).

Это просто Microsoft быть нахальным. «Устаревший» означает языковую функцию, которая может не предоставляться в будущих версиях стандартных языков / стандартных библиотек, как это предписано комитетом по стандартам. Это не означает или не должно означать: «мы, в одностороннем порядке, не думаем, что вы должны его использовать», независимо от того, насколько обоснован этот совет.

если ваш код предназначен для другой ОС (например, Mac OS X, Linux), вы можете использовать следующее:

рассмотрите возможность использования библиотеки переносимости как glib или Apache portable runtime. Они, как правило, обеспечивают безопасный, портативный Альтернативы для звонков, как эти. Это тоже хорошо, потому что эти небезопасные вызовы устарели в большинстве современных сред.

Я использую VisualStdio 2008. В этом случае я часто ставлю Preprocessor Definitions

Меню Проект [Имя Проекта] Свойства. Alt+F7

Если это меню или нажмите Alt + F7 в окне проекта, вы можете увидеть «Страницы Свойств»

Если вы хотите, чтобы он использовался на многих платформах, вы можете, как прокомментировал использование определяет как:

для тех, кто использует версию Visual Studio 2017, похоже, что определение препроцессора, необходимое для выполнения небезопасных операций, изменилось. Используйте вместо этого:

Он будет собирать потом.

многие из защищенных функций Microsoft, включая fopen_s (), являются частью C11, поэтому теперь они должны быть переносимыми. Вы должны понимать, что Безопасные функции отличаются поведением исключений, а иногда и возвращаемыми значениями. Кроме того, вы должны знать, что в то время как эти функции стандартизированы, это дополнительно часть стандарта (приложение K), который по крайней мере glibc (по умолчанию в Linux) и libc FreeBSD не реализуются.

однако, я боролся с этой проблемой для a пара лет. Я опубликовал больший набор макросов преобразования здесь., для вашей непосредственной проблемы, поместите следующий код в файл включения и включите его в исходный код:

конечно, этот подход не реализует ожидаемое поведение исключения.

Я также получил ту же проблему. Когда я пытаюсь добавить библиотеку opencv

Я получил не предупреждение, а ошибка.

Я также использовал директивы препроцессора, как уже упоминалось. Но это не решило проблему.

Читать еще:  Очистка ошибок реестра

Я решил ее следующим образом:

  • заходим в свойства -> С/C++ -> предварительно скомпилированные заголовки -> не использовать предварительно скомпилированные заголовки выбрать в Предкомпилированного заголовка.

Работа с текстовыми файлами

Работа с текстовыми файлами

Р абота с текстовым файлом похожа работу с консолью: с помощью функций форматированного ввода мы сохраняем данные в файл, с помощью функций форматированного вывода считываем данные из файла. Есть множество нюансов, которые мы позже рассмотрим. Основные операции, которые необходимо проделать, это

  • 1. Открыть файл, для того, чтобы к нему можно было обращаться. Соответственно, открывать можно для чтения, записи, чтения и записи, переписывания или записи в конец файла и т.п. Когда вы открываете файл, может также произойти куча ошибок – файла может не существовать, это может быть файл не того типа, у вас может не быть прав на работу с файлом и т.д. Всё это необходимо учитывать.
  • 2. Непосредственно работа с файлом — запись и чтение. Здесь также нужно помнить, что мы работаем не с памятью с произвольным доступом, а с буферизированным потоком, что добавляет свою специфику.
  • 3. Закрыть файл. Так как файл является внешним по отношению к программе ресурсом, то если его не закрыть, то он продолжит висеть в памяти, возможно, даже после закрытия программы (например, нельзя будет удалить открытый файл или внести изменения и т.п.). Кроме того, иногда необходимо не закрывать, а «переоткрывать» файл для того, чтобы, например, изменить режим доступа.

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

Иногда необходимо выполнять некоторые вспомогательные операции: переместиться в нужное место файла, запомнить текущее положение, определить длину файла и т.д.

Для работы с файлом необходим объект FILE. Этот объект хранит идентификатор файлового потока и информацию, которая нужна, чтобы им управлять, включая указатель на его буфер, индикатор позиции в файле и индикаторы состояния.

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

Создание и выделение памяти под объект типа FILE осуществляется с помощью функции fopen или tmpfile (есть и другие, но мы остановимся только на этих).

Функция fopen открывает файл. Она получает два аргумента – строку с адресом файла и строку с режимом доступа к файлу. Имя файла может быть как абсолютным, так и относительным. fopen возвращает указатель на объект FILE, с помощью которого далее можно осуществлять доступ к файлу.

Например, откроем файл и запишем в него Hello World

Функция fopen сама выделяет память под объект, очистка проводится функцией fclose. Закрывать файл обязательно, самостоятельно он не закроется.

Функция fopen может открывать файл в текстовом или бинарном режиме. По умолчанию используется текстовый. Режим доступа может быть следующим

Документация

fopen

Открытый файл, или получают информацию об открытых файлах

Синтаксис

Описание

fileID = fopen( filename ) открывает файл, filename , для бинарного доступа для чтения, и возвращает целочисленный идентификатор файла, равный или больше, чем 3. MATLAB ® резервирует идентификаторы файла 0 , 1 , и 2 для стандартного входа, стандартный вывод (экран), и стандартная погрешность, соответственно.

Если fopen не может открыть файл, затем fileID -1 .

fileID = fopen( filename , permission ) открывает файл с типом доступа, заданного permission .

fileID = fopen( filename , permission , machinefmt , encodingIn ) дополнительно задает порядок для чтения или записи байтов или битов в файле с помощью machinefmt аргумент. Дополнительный encodingIn аргумент задает схему кодировки символов, сопоставленную с файлом.

[fileID,errmsg] = fopen( ___ ) дополнительно возвращает системно-зависимое сообщение об ошибке если fopen сбои, чтобы открыть файл. В противном случае, errmsg пустой символьный вектор. Можно использовать этот синтаксис с любым из входных параметров предыдущих синтаксисов.

fIDs = fopen(‘all’) возвращает вектор-строку, содержащий идентификаторы файла всех открытых файлов. Идентификаторы, зарезервированные для стандартного входа, выхода и ошибки, не включены. Число элементов в векторе равно количеству открытых файлов.

filename = fopen( fileID ) возвращает имя файла что предыдущий вызов fopen используемый, когда это открыло файл, заданный fileID . Выходное имя файла разрешено к полному пути. fopen функция не считывает информации из файла, чтобы определить выходное значение.

[filename,permission,machinefmt,encodingOut] = fopen( fileID ) дополнительно возвращает разрешение, формат машины и кодирование что предыдущий вызов fopen используемый, когда это открыло заданный файл. Если файл был открыт в режиме двоичного счета, permission включает букву ‘b’ . encodingOut выход является стандартным именем схемы кодирования. fopen не считывает информации из файла, чтобы определить эти выходные значения. Недопустимый fileID возвращает пустые символьные вектора для всех выходных аргументов.

Примеры

Открытый идентификатор файла и передачи к функции файлового ввода-вывода

Откройте файл и передайте идентификатор файла fgetl функционируйте, чтобы считать данные.

Откройте файл, tsunamis.txt , и получите идентификатор файла.

Передайте fileID к fgetl функционируйте, чтобы прочитать одну строку из файла.

Запрос имени файла открыться

Создайте подсказку, чтобы запросить имя файла открыться. Если fopen не может открыть файл, отобразить соответствующее сообщение об ошибке.

Открытый файл для записи и задает тип доступа, пишущий порядок, кодировку символов

Откройте файл, чтобы записать в файл с помощью кодировки символов Shift JIS.

Читать еще:  Ошибка рантайм еррор

‘w’ введите задает доступ для записи, ‘n’ введите задает нативный порядок байтов и ‘Shift_JIS’ задает схему кодировки символов.

Получение информации об открытых файлах

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

Получите идентификаторы файла всех открытых файлов.

Получите имя файла и кодировку символов для открытого файла. Используйте

вместо выходных аргументов вы хотите не использовать.

Выход, показанный здесь, является представительным. Ваши результаты могут отличаться.

Входные параметры

filename — Имя файла, чтобы открыться
вектор символов или скаляр строки

Имя файла, чтобы открыться, включая расширение файла, заданное как символьный вектор-строка или скаляр строки. Если файл не находится в текущей папке, filename должен включать полное или относительный путь.

В системах UNIX ® , если filename начинается с ‘

username /’ , fopen функция расширяет путь к корневому каталогу текущего или заданного пользователя, соответственно.

Если вы открываете файл с доступом для чтения, и файл не находится в текущей папке, то fopen поисковые запросы вдоль пути поиска файлов MATLAB.

Если вы открываете файл с записью или добавляете доступ, и файл не находится в текущей папке, то fopen создает файл в текущем каталоге.

Пример: ‘myFile.txt’

Типы данных: char | string

permission — Тип доступа к файлу
‘r’ (значение по умолчанию) | ‘w’ | ‘a’ | ‘r+’ | ‘w+’ | ‘a+’ | ‘A’ | ‘W’ | .

Тип доступа к файлу, заданный как вектор символов или скаляр строки. Можно открыть файл в режиме двоичного счета или в текстовом режиме. В системах UNIX оба режима перевода имеют тот же эффект. Чтобы открыть файл в режиме двоичного счета, задайте одно из следующих.

Открытый файл для чтения.

Откройте или создайте новый файл для записи. Отбросьте существующее содержимое, если таковые имеются.

Откройте или создайте новый файл для записи. Добавьте данные в конец файла.

Открытый файл для чтения и записи.

Откройте или создайте новый файл для чтения и записи. Отбросьте существующее содержимое, если таковые имеются.

Откройте или создайте новый файл для чтения и записи. Добавьте данные в конец файла.

Открытый файл для добавления без автоматического сбрасывания буфера текущей производительности.

Открытый файл для записи без автоматического сбрасывания буфера текущей производительности.

Чтобы открыть файлы в текстовом режиме, присоедините букву ‘t’ к permission аргумент, такой как ‘rt’ или ‘wt+’ .

В системах Windows ® , в текстовом режиме:

Операции чтения, которые сталкиваются с возвратом каретки, сопровождаемым символом новой строки ( ‘rn’ ) удалите возврат каретки из входа.

Операции записи вставляют возврат каретки перед любым символом новой строки в выходе.

Откройте или создайте новый файл в текстовом режиме, если вы хотите записать в него в MATLAB и затем открыть его в Блокноте Microsoft ® или каком-либо текстовом редакторе, который не распознает ‘n’ как последовательность новой строки. При записи в файл закончите каждую строку ‘rn’ . Для примера смотрите fprintf . В противном случае откройте файлы в режиме двоичного счета для лучшей производительности.

Читать и записать в тот же файл:

Откройте файл со значением для permission это включает знак «плюс», ‘+’ .

Вызовите fseek или frewind между операциями чтения и операциями записи. Например, не вызывайте fread сопровождаемый fwrite , или fwrite сопровождаемый fread , если вы не вызываете fseek или frewind между ними.

Типы данных: char | string

machinefmt — Порядок для чтения или записи байтов или битов
‘n’ (значение по умолчанию) | ‘b’ | ‘l’ | ‘s’ | ‘a’ | .

Порядок для чтения или записи байтов или битов в файле, заданном как один из следующих векторов символов или скаляров строки.

Ваш системный порядок байтов (значение по умолчанию)

Упорядоченное расположение с обратным порядком байтов

Упорядоченное расположение с прямым порядком байтов

‘s’ или ‘ieee-be.l64’

Упорядоченное расположение обратного порядка байтов, 64-битный долгий тип данных

‘a’ или ‘ieee-le.l64’

Упорядоченное расположение прямого порядка байтов, 64-битный долгий тип данных

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

Типы данных: char | string

encodingIn ‘CharacterEncoding’
‘UTF-8’ | ‘ISO-8859-1’ | ‘windows-1251’ | ‘windows-1252’ | .

Кодировка символов, чтобы использовать для последующих операций чтения и операций записи, включая fscanf fprintf fgetl fgets fread , и fwrite , заданный как вектор символов или скаляр строки. Вектор символов или скаляр строки должны содержать имя схемы кодирования стандартного символа, такое как следующее.

Если вы не задаете схему кодирования, fopen открывает файлы для обработки использования кодировки по умолчанию для вашей системы. Для получения дополнительной информации смотрите Вводные Файлы с Различными Кодировками символов.

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

Типы данных: char | string

fileID — Идентификатор файла открытого файла
целое число

Идентификатор файла открытого файла, заданного как целое число.

Типы данных: double

Советы

В большинстве случаев не необходимо открыть файл в текстовом режиме. Функции импорта MATLAB, все приложения UNIX, и Microsoft Word и WordPad распознают ‘n’ как индикатор новой строки.

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Указания и ограничения по применению:

Генерация кода не поддерживает:

Входные параметры machinefmt encodingIn , или fileID .

Выходной аргумент errmsg .

Открытие файла в текстовом режиме. Это — permission аргумент не должен содержать букву t . Например, значением не может быть ‘rt’ .

permission аргумент может содержать три символа самое большее. Символы должны быть уникальными.

Читать еще:  Звуковые коды ошибок

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

При генерации исполняемых файлов C/C++, статических библиотек или динамических библиотек, можно открыть до 20 файлов.

Сгенерированный код не сообщает об ошибках от недопустимых идентификаторов файла. Запишите свою собственную обработку ошибки открытия файла в вашем коде MATLAB. Протестируйте ли fopen возвращает -1 , который указывает, что открытый файл перестал работать. Например:

Поведение сгенерированного кода для fread зависимо компилятором когда вы:

Откройте файл с помощью fopen с permission из a+ .

Считайте файл с помощью fread прежде, чем вызвать функцию ввода-вывода, такую как fseek или frewind , это устанавливает индикатор позиции в файле.

Смотрите также

Представлено до R2006a

Документация MATLAB
Поддержка

© 1994-2020 The MathWorks, Inc.

1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.

2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.

3. Сохраняйте структуру оригинального текста — например, не разбивайте одно предложение на два.

4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.

5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.

fopen — Открывает файл или URL

(PHP 4, PHP 5, PHP 7)

fopen — Открывает файл или URL

Описание

fopen() закрепляет именованный ресурс, указанный в аргументе filename , за потоком.

Список параметров

Если filename передан в форме «scheme://. «, он считается URL’ом и PHP проведёт поиск обработчика протокола (также известного как «обертка») для этой схемы. Если ни одна обёртка не закреплена за протоколом, PHP выдаст замечание, чтобы помочь вам отследить потенциальную проблему в вашем скрипте и затем продолжит выполнение, как если бы filename указывал на обыкновенный файл.

Если PHP установлено, что filename указывает на локальный файл, тогда выполняется попытка открыть поток к этому файлу. Файл должен быть доступен PHP, так что вам следует убедиться, что права доступа на файл это разрешают. Если вы включили безопасный режим или open_basedir, то накладываются дальнейшие ограничения.

Если PHP установлено, что filename указывает на зарегистрированный протокол и этот протокол зарегистрирован как сетевой URL, PHP выполняет проверку состояния директивы allow_url_fopen. Если она выключена, PHP выдаст предупреждение и вызов fopen закончится неудачей.

Замечание:

Список поддерживаемых протоколов доступен в разделе Поддерживаемые протоколы и обработчики (wrappers). Некоторые протоколы (обертки) поддерживают контекст и/или опции php.ini . Обратитесь к соответствующей странице с описанием используемого протокола для получения списка опций, которые могут быть установлены. (например, значение php.ini user_agent используется оберткой http).

На платформе Windows, необходимо экранировать все обратные слеши в пути к файлу или использовать прямые слеши.

Параметр mode указывает тип доступа, который вы запрашиваете у потока. Он может быть одним из следующих вариантов:

Замечание:

Разные семейства операционных систем имеют разные соглашения относительно окончания строк. Когда вы пишете текст и хотите вставить разрыв строки, вы должны использовать правильные символы (или символ) для вашей операционной системы. Системы семейства Unix используют n в качестве символа конца строки, системы семейства Windows используют rn в качестве символов окончания строки и системы семейства Macintosh используют r в качестве символа конца строки.

Если вы используете неверный символ конца строки при редактировании файлов, вы можете обнаружить, что при открытии эти файлы «странно выглядят».

Windows предлагает флаг режима текстовой трансляции (‘t’), который автоматически переведёт n в rn во время работы с файлом. И наоборот — вы также можете использовать ‘b’, чтобы принудительно включить бинарный режим, в котором ваши данные не будут преобразовываться. Чтобы использовать эти режимы, укажите ‘b’ или ‘t’ последней буквой параметра mode .

Так как установка флага трансляции по умолчанию зависит от SAPI и используемой версии PHP, рекомендуем явно задавать указанный флаг из соображений портируемости. Вы должны использовать режим ‘t’, если вы работаете с текстовым файлом и использовать n для обозначения конца строки в вашем скрипте, при этом не беспокоясь за читаемость ваших файлов в других приложениях типа «Блокнота». Во всех остальных случаях используйте флаг ‘b’.

Если вы явно не укажете флаг ‘b’ во время работы с бинарными файлами, вы можете столкнуться со странной порчей ваших данных, включая испорченные файлы изображений и странные проблемы с символами rn.

Замечание:

Из соображений портируемости, настоятельно рекомендуется всегда использовать флаг ‘b’ при открытии файлов с помощью fopen() .

Замечание:

Кроме того, из соображений портируемости, также настойчиво рекомендуется переписать старый код, который полагается на режим ‘t’, чтобы вместо этого он использовал правильные концы строк и режим ‘b’.

Необязательный третий параметр use_include_path может быть установлен в ‘1’ или TRUE , если вы также хотите провести поиск файла в include_path.

Замечание: Поддержка контекста была добавлена в PHP 5.0.0. Для описания контекстов смотрите раздел Потоки.

Возвращаемые значения

Возвращает указатель на файл в случае успешной работы, или FALSE в случае ошибки.

Ошибки

Если открыть файл не удалось, будет сгенерирована ошибка уровня E_WARNING . Вы можете использовать оператор @ для подавления этой ошибки.

Ссылка на основную публикацию
Adblock
detector