Fopen visual studio не работает
Комментарии
Отключить предупреждение
Чтобы устранить проблему C4996, обычно рекомендуется изменить код. Вместо этого используйте предложенные функции и глобальные переменные. Если необходимо использовать существующие функции или переменные по соображениям переносимости, можно отключить предупреждение.
Отключение предупреждения для определенной строки кода
Отключение предупреждения в файле
Отключение предупреждения в сборках из командной строки
Чтобы отключить предупреждение глобально в сборках командной строки, используйте /wd4996 параметр командной строки.
Отключение предупреждения для проекта в Visual Studio
чтобы отключить предупреждение для всего проекта в Visual Studio IDE, выполните следующие действия.
Откройте диалоговое окно страницы свойств для проекта. Сведения об использовании диалогового окна страницы свойств см. в разделе страницы свойств.
Выберите страницу свойств свойства конфигурации>C/C++>Дополнительно .
Отключение предупреждения с помощью макросов препроцессора
Вы также можете использовать макросы препроцессора, чтобы отключить некоторые определенные классы предупреждений об устаревании, используемых в библиотеках. Эти макросы описаны ниже.
Чтобы определить макрос препроцессора в Visual Studio:
Откройте диалоговое окно страницы свойств для проекта. Сведения об использовании диалогового окна страницы свойств см. в разделе страницы свойств.
Разверните свойства > конфигурации препроцессор C/C++ >.
Ниже приведены некоторые из распространенных источников предупреждений и ошибок C4996:
Имена функций POSIX
The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: new-name. See online help for details.
Корпорация Майкрософт переименовала некоторые библиотечные функции POSIX и Microsoft в CRT, чтобы они соответствовали ограничениям C99 и C++ 03 в зарезервированных и глобальных именах, определяемых реализацией. Только имена являются устаревшими, а не сами функции. В большинстве случаев в имя функции добавляется символ подчеркивания для создания имени. Компилятор выдает предупреждение об устаревании для имени исходной функции и предлагает предпочтительное имя.
Чтобы устранить эту проблему, обычно рекомендуется изменить код так, чтобы вместо него использовались предлагаемые имена функций. Однако обновленные имена относятся только к Microsoft. Если необходимо использовать имена существующих функций по соображениям переносимости, можно отключить эти предупреждения. Функции по-прежнему доступны в библиотеке с их исходными именами.
Чтобы отключить предупреждения об устаревании для этих функций, определите макрос _CRT_NONSTDC_NO_WARNINGS препроцессора. Этот макрос можно определить в командной строке, включив параметр /D_CRT_NONSTDC_NO_WARNINGS .
Небезопасные функции библиотеки CRT
This function or variable may be unsafe. Consider using safe-version instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
Корпорация Майкрософт не имеет устаревших функций и глобальных библиотек CRT и C++, так как доступны более безопасные версии. Большинство устаревших функций допускают непроверенный доступ на чтение или запись к буферам. Их неправильное использование может привести к серьезным проблемам безопасности. Компилятор выдает предупреждение об устаревании для этих функций и предлагает предпочтительную функцию.
Чтобы устранить эту проблему, рекомендуется вместо этого использовать функцию или переменную safe-version . Иногда вы не можете обеспечить переносимость или обратную совместимость. Тщательно проверьте, не возможно ли перезапись или Пересчитывание буфера в коде. После этого предупреждение можно отключить.
Чтобы отключить предупреждения об устаревании для этих функций в CRT, определите _CRT_SECURE_NO_WARNINGS .
Чтобы отключить предупреждения о нерекомендуемых глобальных переменных, определите _CRT_SECURE_NO_WARNINGS_GLOBALS .
дополнительные сведения об этих устаревших функциях и глобальных параметрах см. в разделе функции безопасности вбиблиотеках CRT и Сейф: стандартная библиотека C++.
Ненадежные функции стандартной библиотеки
'std:: function_name ::_Unchecked_iterators::_Deprecate' Call to std:: function_name with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
в Visual Studio 2015 это предупреждение появляется в отладочных сборках, так как некоторые функции шаблона стандартной библиотеки C++ не проверяют правильность параметров. Часто это обусловлено тем, что функции не хватает информации для проверки границ контейнера. Или, так как итераторы могут неправильно использоваться функцией. Это предупреждение помогает понять эти функции, так как они могут быть источником серьезных брешей в системе безопасности в программе. Дополнительные сведения см. в разделе проверенные итераторы.
Например, это предупреждение отображается в режиме отладки, если вместо простого массива передается указатель на std::copy элемент. Чтобы устранить эту проблему, используйте соответствующий объявленный массив, чтобы библиотека могла проверять экстенты массива и проверять границы.
Несколько стандартных алгоритмов библиотеки были обновлены в версии C++ 14 с двумя диапазонами. При использовании двух версий диапазона второй диапазон предоставляет необходимые проверки границ:
В этом примере показано несколько способов использования стандартной библиотеки для проверки использования итератора, и если непроверенное использование может быть опасным:
Если вы проверили, что в коде не может быть ошибки переполнения буфера, это предупреждение можно отключить. Чтобы отключить предупреждения для этих функций, определите _SCL_SECURE_NO_WARNINGS .
Проверенные итераторы включены
Предупреждение C4996 также может возникать, если не используется проверяемый итератор, если _ITERATOR_DEBUG_LEVEL определен как 1 или 2. По умолчанию для сборок в режиме отладки установлено значение 2, а для розничных сборок — 0. Дополнительные сведения см. в разделе проверенные итераторы.
Ненадежный код MFC или ATL
Предупреждение C4996 может возникать при использовании функций MFC или ATL, которые являются устаревшими по соображениям безопасности.
Чтобы устранить эту проблему, настоятельно рекомендуется изменить код, чтобы вместо этого использовать обновленные функции.
Сведения о подавлении этих предупреждений см. в разделе _AFX_SECURE_NO_WARNINGS .
Устаревшие функции и переменные CRT
This function or variable has been superseded by newer library or operating system functionality. Consider using new_item instead. See online help for details.
Некоторые функции и глобальные переменные библиотеки устарели. Эти функции и переменные могут быть удалены в будущей версии библиотеки. Компилятор выдает предупреждение об устаревании для этих элементов и предлагает предпочтительную альтернативу.
Чтобы устранить эту проблему, мы рекомендуем изменить код для использования предлагаемой функции или переменной.
Чтобы отключить предупреждения об устаревании для этих элементов, определите _CRT_OBSOLETE_NO_WARNINGS . Дополнительные сведения см. в документации по устаревшей функции или переменной.
Ошибки маршалирования в коде CLR
Предупреждение C4996 также может возникать при использовании библиотеки маршалирования CLR. В этом случае C4996 является ошибкой, а не предупреждением. Эта ошибка возникает при использовании marshal_as для преобразования между двумя типами данных, для которых требуется marshal_context класс. Эту ошибку также можно получить, когда библиотека упаковки не поддерживает преобразование. Дополнительные сведения о библиотеке упаковки см. в разделе Общие сведения о маршалировании в C++.
Этот пример приводит к возникновению предупреждения C4996, поскольку библиотеке маршалирования требуется контекст для преобразования из System::String const char * в.
Пример: определяемая пользователем устаревшая функция
Атрибут можно использовать deprecated в собственном коде для предупреждения вызывающих объектов, когда больше не рекомендуется использовать определенные функции. В этом примере C4996 создается в двух местах: по одному для строки, для которой объявлена устаревшая функция, а другая — для строки, в которой используется функция.
On Visual Studio 2005 C++ compiler, I get the following warning when my code uses the fopen and such calls.
How do I prevent this?
10 Answers 10
It looks like Microsoft has deprecated lots of calls which use buffers to improve code security. However, the solutions they're providing aren't portable. Anyway, if you aren't interested in using the secure version of their calls (like fopen_s), you need to place a definition of _CRT_SECURE_NO_DEPRECATE before your included header files. For example:
The preprocessor directive can also be added to your project settings to effect it on all the files under the project. To do this add _CRT_SECURE_NO_DEPRECATE to Project Properties -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions.
Well you could add a:
before you use fopen, but have you considered using fopen_s as the warning suggests? It returns an error code allowing you to check the result of the function call.
The problem with just disabling deprecated function warnings is that Microsoft may remove the function in question in a later version of the CRT, breaking your code (as stated below in the comments, this won't happen in this instance with fopen because it's part of the C & C++ ISO standards).
"Microsoft may remove the function in question in a later version of the CRT" - if they no longer wish to implement the C or C++ standards.
Some people target non-MS platforms as well. And with a lot of these _s functions, there is not really a well-notable security gain.
For future googlers: In this context, "deprecated" just means that a function's use is not recommended; it does not indicate that the function is scheduled to be removed from the CRT. -msdn ++++
This is just Microsoft being cheeky. "Deprecated" implies a language feature that may not be provided in future versions of the standard language / standard libraries, as decreed by the standards committee. It does not, or should not mean, "we, unilaterally, don't think you should use it", no matter how well-founded that advice is.
The meaning of the English word "deprecate" is precisely the second thing: "we think you shouldn't use it". But in computer parlance it has recently come to have a much weaker meaning, "it might not be wise to use it, because we're kind of thinking of removing it, and we've provided something we think is better".
If you code is intended for a different OS (like Mac OS X, Linux) you may use following:
I'am using VisualStdio 2008. In this case I often set Preprocessor Definitions
Menu \ Project \ [ProjectName] Properties. Alt+F7
If click this menu or press Alt + F7 in project window, you can see "Property Pages" window.
Then see menu on left of window.
Configuration Properties \ C/C++ \ Preprocessor
Then add _CRT_SECURE_NO_WARNINGS to \ Preprocessor Definitions.
Please see this first how-to-answer This question is answered before, obviously, you can add your answer here. But You Need to understand some points before answering. First, don't add an answer which is previously added with the same code or suggestion. Second, don't add an overly complicated answer if the user has asked very specifically about the problem and what he needs to solve this. Third, You can add a comment if you want to suggest anything regarding the answer or question.
Consider using a portability library like glib or the apache portable runtime. These usually provide safe, portable alternatives to calls like these. It's a good thing too, because these insecure calls are deprecated in most modern environments.
The portable alternative to Microsoft's one-off, not-quite-standards-compliant, non-portable implementation of the optional Annex K function fopen_s() is the C standard function fopen() .
If you want it to be used on many platforms, you could as commented use defines like:
_MSC_VER = 1600 may not be the first version that deprecated fopen(), etc. It was the first version in which I encountered the issue.
For those who are using Visual Studio 2017 version, it seems like the preprocessor definition required to run unsafe operations has changed. Use instead:
It will compile then.
@LeviRoberts you have to put this define at the very top of the file, the error is generated when some header files are included
Many of Microsoft's secure functions, including fopen_s(), are part of C11, so they should be portable now. You should realize that the secure functions differ in exception behaviors and sometimes in return values. Additionally you need to be aware that while these functions are standardized, it's an optional part of the standard (Annex K) that at least glibc (default on Linux) and FreeBSD's libc don't implement.
However, I fought this problem for a few years. I posted a larger set of conversion macros here., For your immediate problem, put the following code in an include file, and include it in your source code:
Of course this approach does not implement the expected exception behavior.
MS _s are not the same as C11 bounds checking interface in general. Some have the same sinature, some don't. As that interface is optional, few implementations support it, bercause it is mostly unnecessary. And your code is C++, not C which you refer to in the text.
@Olaf: Hmm. I can't address the bounds checking, other than to point out my exception behavior caveat.
You are right that I cited the C11 standard (as opposed to C++14 or 17). The functions are available in recent versions of Microsoft's C++ compilers. It turns out that Annex K is not widely supported outside of MSVS. Jonathan Leffler commented here that the MS versions don't actually match the Annex K specifications. So much for portability.
I'd appreciate if you read my comments completely. MSVC does not really use the BCI, but their own soup. MSVC has not ben compliant since at least 18 years now and were very clear about not intending to, at least including C99 mandatory featues like VLAs which are supported by every modern compiler since years already (including major embedded).
The questioner tagged Visual C++. I copied the code from a larger C++ file. For C, I guess the includes would be stdio.h and string.h (strings aren't used in the code above, though). I don't need the using namespace std; statement -- is that valid in C? I'm thinking the inline extern . should be static inline in C, to avoid linker problems. I don't write much C code these days. Add a comment if I'm wrong.
Компилятор в 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 — это сообщество, в котором Вы можете подтянуть свои знания по программированию, узнать, как эффективно решать те или иные задачи, а также воспользоваться нашими онлайн сервисами.
Открывает файл. Доступны более безопасные версии этих функций, которые выполняют дополнительные проверки параметров и возвращают коды ошибок. см. раздел fopen_s , _wfopen_s .
Синтаксис
Параметры
mode
Включенный тип доступа.
Возвращаемое значение
Каждая из этих функций возвращает указатель на открытый файл. Значение указателя null обозначает ошибку. Если параметр filename или mode имеет значение NULL или является пустой строкой, эти функции активируют обработчик недопустимых параметров, который описан в разделе Проверка параметров. Если выполнение может быть продолжено, эти функции возвращают значение NULL и задают значениееинвал.
Remarks
fopen Функция открывает файл, указанный параметром filename. По умолчанию строка с узким именем интерпретируется с помощью кодовой страницы ANSI ( CP_ACP ). в Windows классических приложениях это можно изменить на кодовую страницу OEM ( CP_OEMCP ) с помощью SetFileApisToOEM функции. С помощью функции можно AreFileApisANSI определить, интерпретируется ли имя файла с помощью ANSI или системной кодовой страницы OEM по умолчанию. _wfopen — это двухбайтовая версия fopen ; аргументы для _wfopen представляют собой двухбайтовые строки. В противном случае поведение _wfopen и fopen идентично. Использование исключительно _wfopen не влияет на набор закодированных символов, используемый в файловом потоке.
fopen принимает пути, допустимые в файловой системе, в точке выполнения; fopen принимает UNC-пути и пути, содержащие сопоставленные сетевые диски, если выполняющая код система имеет доступ к общей папке или сопоставленному диску во время выполнения. При построении путей для fopen убедитесь, что драйверы, пути или сетевые общие папки будут доступны в среде выполнения. В пути в качестве разделителей каталогов можно использовать прямую (/) или обратную (\) косую черту.
Всегда проверяйте возвращаемое значение, чтобы узнать, равен ли указатель NULL, прежде чем выполнять какие-либо дальнейшие операции с файлом. При возникновении ошибки задается глобальная переменная errno , которая может использоваться для получения конкретных сведений об ошибке. Дополнительные сведения см errno . в статьях, _doserrno _sys_errlist , и _sys_nerr .
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это, см. раздел глобальное состояние в CRT.
Поддержка Юникода
fopen поддерживает файловые потоки Юникода. Чтобы открыть файл Юникода, передайте флаг CCS , который задает нужную кодировку fopen , следующим образом.
File * FP = fopen ("newfile.txt", "RT +, CCS =Encoding");
Допустимые значения кодировки : Unicode, UTF-8и UTF-16LE.
Если файл открывается в режиме Юникода, функции ввода преобразуют данные, считываемые из файла в данные UTF-16, хранимые с типом wchar_t . Затем функции, которые выполняют запись в файл, открытый в режиме Юникода, ожидают буферы, содержащие данные UTF-16, хранимые с типом wchar_t . Если кодировка файла — UTF-8, при его записи данные UTF-16 преобразуются в UTF-8, а содержимое файла с кодировкой UTF-8 преобразуется в данные UTF-16 при его считывании. Попытка чтения или записи нечетного числа байтов в режиме Юникода приводит к ошибке проверки параметров . Для чтения или записи данных, хранимых в программе в кодировке UTF-8, используйте режим текстового или двоичного файла вместо режима Юникода. Вам необходимо реализовать все обязательные преобразования кодировки.
Если файл уже существует и открыт для чтения или добавления, метка порядка байтов (BOM), если она присутствует в файле, определяет кодирование. Кодировка спецификации имеет приоритет над кодировкой, заданной флагом CCS . Кодировка CCS используется только в том случае, если отсутствует спецификация или файл является новым файлом.
Обнаружение спецификации применяется только к файлам, открываемым в режиме Юникода (то есть путем передачи флага CCS ).
В следующей таблице перечислены режимы, используемые для различных флагов CCS , заданных в fopen и метках порядка байтов в файле.
Кодирования, используемые на основе CCS-флага и метки BOM
Флаг CCS | Нет метки BOM (или новый файл) | BOM: UTF-8 | BOM: UTF-16 |
---|---|---|---|
UNICODE | UTF-16LE | UTF-8 | UTF-16LE |
UTF-8 | UTF-8 | UTF-8 | UTF-16LE |
UTF-16LE | UTF-16LE | UTF-8 | UTF-16LE |
В файлы, открытые для записи в режиме Юникода, метка BOM записывается автоматически.
Если mode имеет значение, CCS =Encoding, fopen сначала пытается открыть файл, используя доступ на чтение и запись. Если это завершается успешно, функция считывает метку BOM, чтобы определить кодировку для файла; если операция завершается сбоем, функция использует для файла кодировку по умолчанию. В любом случае fopen затем снова открывает файл с правами только на запись. (Это относится только к режиму " a" , а не к режиму "a +" .)
Универсальное текстовое сопоставление функций
Подпрограмма TCHAR.H | Не определено _UNICODE & _MBCS | _MBCS определено | _UNICODE определено |
---|---|---|---|
_tfopen | fopen | fopen | _wfopen |
Режим символьной строки определяет тип доступа, запрашиваемый для файла, как показано ниже.
mode | Доступ |
---|---|
Cерверный | Открывает для чтения. Если файл не существует или его невозможно найти, вызов fopen завершается ошибкой. |
Белая | Открывает пустой файл для записи. Если указанный файл существует, его содержимое удаляется. |
конкретного | Открывается для записи в конце файла (добавление) без удаления маркера в конце файла (EOF) перед записью новых данных в файл. Создает файл, если он не существует. |
"r +" | Открывает для чтения и записи. Файл должен существовать. |
"w +" | Открывает пустой файл для чтения и записи. Если файл существует, его содержимое удаляется. |
"a +" | Открывается для чтения и добавления. Операция добавления включает удаления маркера EOF перед записью новых данных в файл. Маркер EOF не восстанавливается по окончании записи. Создает файл, если он не существует. |
При открытии файла с помощью типа доступа "a" или типа доступа "a +" все операции записи выполняются в конце файла. Указатель файла может быть перемещен с помощью fseek или rewind , но он всегда возвращается в конец файла перед выполнением любой операции записи. Поэтому невозможно перезаписать существующие данные.
Режим "a" не УДАЛЯЕТ маркер EOF перед добавлением к файлу. После добавления команда MS-DOS TYPE отображает данные только до первоначального маркера EOF и не отображает данные, добавленные в файл. Перед добавлением в файл в режиме "a +" удаляется маркер EOF. После добавления команда TYPE MS-DOS отображает все данные в файле. Для добавления в потоковый файл, заканчивающийся маркером EOF CTRL + Z, требуется режим "a +" .
При указании типа доступа "r +", "w +"или "a +" разрешены операции чтения и записи (считается, что файл открыт для обновления). Однако при переходе от чтения к записи операция ввода должна получить маркер конца файла. Если маркер EOF отсутствует, необходимо воспользоваться промежуточным вызовом функции размещения файла. Функции размещения файла — fsetpos , fseek и rewind . При переходе от записи к чтению необходимо воспользоваться промежуточным вызовом функции fflush или функции размещения файла.
В дополнение к предыдущим значениям к режиму можно добавить следующие символы, чтобы указать режим преобразования для символов новой строки.
Модификатор режима | Режим преобразования |
---|---|
t | Откройте файл в текстовом (переведенном) режиме. |
b | Открыть в двоичном (непреобразованном) режиме; переводы, включающие символы возврата каретки и перевода строки, подавляются. |
В текстовом режиме CTRL + Z интерпретируется как символ EOF на входе. В файлах, открытых для чтения и записи с помощью "a +", FOPEN проверяет наличие CTRL + Z в конце файла и удаляет его, если это возможно. Это делается потому, что использование fseek и ftell для перемещения в файле, заканчивающемся клавишей CTRL + Z, может привести fseek к неправильному поведению в конце файла.
В текстовом режиме сочетания возврата каретки и перевода строки преобразуются в однострочные каналы ввода, а символы перевода строки преобразуются в сочетания символов возврата каретки и перевода строки на выходе. Если функция ввода-вывода потока Юникода работает в текстовом режиме (по умолчанию) исходный или конечный поток рассматривается как последовательность многобайтовых символов. Поэтому входные функции потока Юникода преобразуют многобайтовые символы в расширенные (как если бы для этого вызывалась функция mbtowc ). По той же причине выходные функции потока Юникода преобразуют расширенные символы в многобайтовые (как если бы для этого вызывалась функция wctomb ).
Если t или b не задан в режиме, то режим преобразования по умолчанию определяется глобальной переменной _fmode . Если t или b является префиксом аргумента, функция завершается ошибкой и возвращает значение NULL.
Дополнительные сведения об использовании текстового и двоичного режимов в Юникоде, а также многобайтового потока ввода-вывода см. в статьях Text and Binary Mode File I/O и Ввод-вывод в поток в кодировке Юникод в текстовом и двоичном режиме.
Следующие параметры могут быть добавлены в режим для указания дополнительных поведений.
Модификатор режима | Поведение |
---|---|
x | Вызывает сбой функции, если имя файла уже существует. Может использоваться только с описателями "w" или "w +". |
c | Включите флаг фиксации для связанного имени файла , чтобы содержимое файлового буфера записывалось непосредственно на диск при fflush вызове или _flushall . |
n | Сбросьте флаг фиксации для связанного файла с состоянием "без фиксации". Это значение по умолчанию. Оно также переопределяет глобальный флаг фиксации при соединении программы с COMMODE.OBJ. Значение по умолчанию глобального флага фиксации — без фиксации (no-commit), если только программа не связана явно с файлом COMMODE.OBJ (см. раздел Параметры ссылок). |
N | Указывает, что файл не наследуется дочерними процессами. |
S | Указывает, что кэширование оптимизировано для последовательного доступа с диска, но не ограничивается им. |
R | Указывает, что кэширование оптимизировано для случайного доступа с диска, но не ограничивается им. |
T | Определяет файл как временный. По возможности он не сбрасывается на диск. |
D | Определяет файл как временный. Он удаляется, если закрывается последний указатель файла. |
CCS =кодирование | Задает кодировку, используемую для этого файла (один из UTF-8, UTF-16LEили Unicode). Не указывайте никакое значение, если требуется использовать кодировку ANSI. |
Допустимые символы для строки режима , используемой в fopen и _fdopen , соответствуют аргументам офлаг , которые используются в _open и _sopen , как показано ниже.
Символы в строке режима | Эквивалентное значение офлаг для _open/_sopen |
---|---|
конкретного | _O_WRONLY | _O_APPEND (обычно _O_WRONLY | _O_CREAT | _O_APPEND) |
a + | _O_RDWR | _O_APPEND (обычно _O_RDWR | _O_APPEND | _O_CREAT ) |
r | _O_RDONLY |
r + | _O_RDWR |
w | _O_WRONLY (обычно _O_WRONLY | _O_CREAT | _O_TRUNC) |
w + | _O_RDWR (обычно _O_RDWR | _O_CREAT | _O_TRUNC) |
b | _O_BINARY |
t | _O_TEXT |
x | _O_EXCL |
c | None |
n | None |
S | _O_SEQUENTIAL |
R | _O_RANDOM |
T | _O_SHORTLIVED |
D | _O_TEMPORARY |
CCS = Юникод | _O_WTEXT |
CCS = UTF-8 | _O_UTF8 |
CCS = UTF-16LE | _O_UTF16 |
Если используется режим RB , вам не нужно переносить код, и если предполагается читать большую часть большого файла или не беспокоиться о производительности сети, можно также подумать, следует ли использовать файлы Win32, сопоставленные с памятью, в качестве параметра.
Требования
Компонент | Обязательный заголовок |
---|---|
fopen | |
_wfopen | либо |
_wfopen является расширением Майкрософт. Дополнительные сведения о совместимости см. в разделе Совместимость.
Параметрырежимовc, n, t, S, R, tи Dявляются расширениями Майкрософт для fopen и _fdopen и не должны использоваться, если требуется переносимость ANSI.
Пример 1
Следующая программа открывает два файла. Она использует fclose для закрытия первого файла и _fcloseall для закрытия всех остальных файлов.
Пример 2
Следующая программа создает файл (или перезаписывает его, если имеется) в текстовом режиме с кодировкой Юникода. Затем она записывает две строки в файл и закрывает его. Выходные данные — это файл с именем _wfopen_test.xml, который содержит данные из раздела Output.
Использовать функцию fopen() в приложение для открытия файла, а функция использует режим доступа r +или + .
Можно запустить приложение и applicationtries, чтобы открыть файл, который равен или больше 4 гигабайт (ГБ).
В этом случае файл не открывается или возвращена следующая ошибка:
EINVAL (недопустимый аргумент)
Причина
Данная проблема возникает образом ищет функции fopen() в конце файлов после его открытия файлов для добавления. Внутри функции fopen() использует функцию _lseek() для выполнения этого действия. Тем не менее функция _lseek() не может обрабатывать файлы размером более 4 ГБ.
Решение
Данное исправление изменяет поведение функции семейства fopen() . После установки данного исправления функции fopen() внутренне использует функцию, которая может выполнять поиск за пределами 4 ГБ без возвращения ошибки. В частности функции fopen() использует функцию _lseeki64() вместо функции _lseek() .
Сведения об исправлении
Исправление от корпорации Майкрософт доступно. Тем не менее оно предназначено только для устранения проблемы, указанной в данной статье. Предлагаемое исправление должно применяться исключительно в системах, в которых обнаружена эта специфическая неполадка.
Чтобы устранить эту проблему, обратитесь в службу поддержки пользователей Майкрософт для получения исправления. Полный список телефонов службы поддержки клиентов корпорации Майкрософт и сведения о стоимости поддержки посетите следующий веб-сайт корпорации Майкрософт:
Предварительные условия
Для установки этого исправления необходимо иметь Microsoft Visual Studio 2010 Пакет обновления 1 (SP1 установлен).
Необходимость перезагрузки
Может потребоваться перезагрузить компьютер после установки исправления, если используются уязвимые файлы.
Сведения о замене исправлений
Это исправление не заменяет ранее выпущенные исправления.
Сведения о файлах
Глобальная версия имеет атрибуты файла (или более поздние атрибуты файлов), приведенные в следующей таблице. Дата и время для этих файлов указаны в формате общего скоординированного времени (UTC). При просмотре сведений о файле, он преобразуется в локальное время. Чтобы узнать разницу между временем по Гринвичу и местным временем, откройте вкладку Часовой пояс элемента Дата и время в панели управления.
Для всех поддерживаемых версий Microsoft Visual Studio 2010 с пакетом обновления 1
Читайте также: