C4996 ошибка c fopen

With the Visual Studio 2005 C++ compiler, I get the following warning when my code uses the fopen() and such calls: 1>foo.cpp(5) : warning C4996: 'fopen' was declared deprecated 1> c:

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:

#pragma once
#if !defined(FCN_S_MACROS_H)
   #define   FCN_S_MACROS_H

   #include <cstdio>
   #include <string> // Need this for _stricmp
   using namespace std;

   // _MSC_VER = 1400 is MSVC 2005. _MSC_VER = 1600 (MSVC 2010) was the current
   // value when I wrote (some of) these macros.

   #if (defined(_MSC_VER) && (_MSC_VER >= 1400) )

      inline extern
      FILE*   fcnSMacro_fopen_s(char *fname, char *mode)
      {  FILE *fptr;
         fopen_s(&fptr, fname, mode);
         return fptr;
      }
      #define fopen(fname, mode)            fcnSMacro_fopen_s((fname), (mode))

   #else
      #define fopen_s(fp, fmt, mode)        *(fp)=fopen( (fmt), (mode))

   #endif //_MSC_VER

#endif // FCN_S_MACROS_H

Of course this approach does not implement the expected exception behavior.

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:

#pragma once
#if !defined(FCN_S_MACROS_H)
   #define   FCN_S_MACROS_H

   #include <cstdio>
   #include <string> // Need this for _stricmp
   using namespace std;

   // _MSC_VER = 1400 is MSVC 2005. _MSC_VER = 1600 (MSVC 2010) was the current
   // value when I wrote (some of) these macros.

   #if (defined(_MSC_VER) && (_MSC_VER >= 1400) )

      inline extern
      FILE*   fcnSMacro_fopen_s(char *fname, char *mode)
      {  FILE *fptr;
         fopen_s(&fptr, fname, mode);
         return fptr;
      }
      #define fopen(fname, mode)            fcnSMacro_fopen_s((fname), (mode))

   #else
      #define fopen_s(fp, fmt, mode)        *(fp)=fopen( (fmt), (mode))

   #endif //_MSC_VER

#endif // FCN_S_MACROS_H

Of course this approach does not implement the expected exception behavior.

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:

#pragma once
#if !defined(FCN_S_MACROS_H)
   #define   FCN_S_MACROS_H

   #include <cstdio>
   #include <string> // Need this for _stricmp
   using namespace std;

   // _MSC_VER = 1400 is MSVC 2005. _MSC_VER = 1600 (MSVC 2010) was the current
   // value when I wrote (some of) these macros.

   #if (defined(_MSC_VER) && (_MSC_VER >= 1400) )

      inline extern
      FILE*   fcnSMacro_fopen_s(char *fname, char *mode)
      {  FILE *fptr;
         fopen_s(&fptr, fname, mode);
         return fptr;
      }
      #define fopen(fname, mode)            fcnSMacro_fopen_s((fname), (mode))

   #else
      #define fopen_s(fp, fmt, mode)        *(fp)=fopen( (fmt), (mode))

   #endif //_MSC_VER

#endif // FCN_S_MACROS_H

Of course this approach does not implement the expected exception behavior.

sektor2009

3 / 3 / 2

Регистрация: 15.03.2009

Сообщений: 347

1

11.05.2014, 16:57. Показов 87762. Ответов 8

Метки нет (Все метки)


error C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
не нравится вот эта строчка

C++
1
2
a=fopen("Pole.txt","r");
    bb=fopen("rezult.txt","w");

читал что надо писать fopen_s() Но тогда не нравится ему что в нутри скобок) не принимает char

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



231 / 231 / 69

Регистрация: 30.09.2012

Сообщений: 545

11.05.2014, 17:19

2

sektor2009, Вам же компилятор сам сказзал, что нужно сделать. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
Курсор на имя вашего проекта, жать ПКМ, выбираем свойства — Свойства конфигурации -> C/C++ -> Препроцессор и в определения препроцессора добавляем ;_CRT_SECURE_NO_WARNINGS , после чего ОК и ошибки нет.



4



3 / 3 / 2

Регистрация: 15.03.2009

Сообщений: 347

11.05.2014, 17:44

 [ТС]

3

не помогло (((
что делать??



0



7 / 4 / 14

Регистрация: 05.02.2014

Сообщений: 131

11.05.2014, 17:59

4

sektor2009,
#include <iostream>
#include <fstream>

fstream f;
f.open(filename, ios: out);

Добавлено через 1 минуту
f.close();

где filename — имя файла

лучше всего сделать
char filename[32];
cout <<«Name file n»;
cin >> filename;



0



231 / 231 / 69

Регистрация: 30.09.2012

Сообщений: 545

11.05.2014, 18:03

5

sektor2009, Move to front, алгоритм на C++, error C4996: ‘fopen’: Посмотрите, что пишет Croessmah. Когда ошибка станет варнингом( то есть предупреждением) её можно будет убрать тем, что я писал или же перед всеми инклудами вставить строчку #define _CRT_SECURE_NO_WARNINGS Это снимет предупреждения.



4



degree128

1 / 1 / 0

Регистрация: 03.09.2018

Сообщений: 71

13.10.2018, 14:58

6

Для решения проблемы нужно написать

C++
1
2
FILE *a;
 fopen_s(a,"FIlename","r");



0



AlinDen

0 / 0 / 0

Регистрация: 05.05.2019

Сообщений: 74

25.02.2021, 09:40

7

C++
1
2
3
4
5
6
7
8
9
10
char InFileName[80]; // Имя входного файла
    printf_s("Введите имя входного файла: ");
    cin >> InFileName;
    FILE *InFile;
    fopen_s(InFile, "InFileName", "r"); // Открываем файл для чтения
    if (!InFile) {
        printf_s("Ошибка при открытии файлаn");
        _getch();
        return;
    }

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



0



Volga_

Эксперт CЭксперт С++

4257 / 2463 / 1333

Регистрация: 14.12.2018

Сообщений: 4,632

Записей в блоге: 1

25.02.2021, 09:52

8

Цитата
Сообщение от AlinDen
Посмотреть сообщение

fopen_s(InFile, «InFileName», «r»); // Открываем файл для чтения
    if (!InFile) {

Надо:

C++
1
2
3
errno_t err = fopen_s(&InFile, InFileName, "r");
    if (err)
    {



0



AlinDen

0 / 0 / 0

Регистрация: 05.05.2019

Сообщений: 74

25.02.2021, 10:22

9

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
void Menu7()
{
    FILE *InFile;
    char InFileName[80]; // Имя входного файла
    printf_s("Введите имя входного файла: ");
    cin >> InFileName;
    
    errno_t err = fopen_s(&InFile, InFileName, "r"); // Открываем файл для чтения
    if (err) {
        printf_s("Ошибка при открытии файлаn");
        _getch();
        return;
    }
 
    int i, j;
    for (i = 1; i <= N; i++) // Заполняем индексный массив
        ind[i] = i;
 
    int m[N + 1]; // Массив частот символов
    float _p[N + 1]; // Массив для хранения исходных вероятностей
 
    for (i = 1; i <= N; i++) // Обнуляем массив частот символов
        m[i] = 0;
    char _c;
    while (!feof(InFile)) {
        fscanf_s(InFile, "%c", &_c); // Читаем символ из файла
        if (_c != 10 && _c != 13)
            m[GetNo(_c)]++;
    }
    fclose(InFile);
    int s = 0; // Сумма всех частот
    for (i = 1; i <= N; i++)
        s += m[i];
    for (i = 1; i <= N; i++)
        p[i] = (float)m[i] / s;
    SortP(); // Сортируем массив вероятностей
    for (i = 1; i <= N; i++) // Сохраняем исходные вероятности
        _p[i] = p[i];
 
    for (i = 1; i <= N; i++) {
        for (j = 1; j <= N; j++)
            c[i][j] = 0;
        l[i] = 0;
    }
    Huffman(N);
 
    char OutFileName[80];  // Имя выходного файла
    printf_s("Введите имя выходного файла: ");
    cin >> OutFileName;
    FILE *OutFile;
    errno_t er = fopen_s(&OutFile, OutFileName, "w"); // Открываем файл для записи
    if (er) {
        printf_s("Ошибка при создании файлаn");
        _getch();
        return;
    }
 
    errno_t errr = fopen_s(&InFile, "InFileName", "r");
    while (errr) { // Кодируем файл
        fscanf_s(InFile, "%c", &_c); // Читаем символ из файла
        if (_c != 10 && _c != 13) {
            int no = ind[GetNo(_c)];
            for (j = 1; j <= l[no]; j++)
                fprintf(OutFile, "%d", c[no][j]);
        }
        else
            fprintf(OutFile, "%c", _c);
    }
    fclose(InFile);
    fclose(OutFile);
 
    _getch();
    return;
}

Ошибка LNK2019 ссылка на неразрешенный внешний символ WinMain в функции «int __cdecl invoke_main(void)» (?invoke_main@@YAHXZ)



0



Содержание

  1. Предупреждение компилятора (уровень 3) C4996
  2. Комментарии
  3. Отключение предупреждения
  4. Отключение предупреждения для определенной строки кода
  5. Отключение предупреждения в файле
  6. Отключение предупреждения в сборках командной строки
  7. Отключение предупреждения для проекта в Visual Studio
  8. Отключение предупреждения с помощью макросов препроцессора
  9. Имена функций POSIX
  10. Небезопасные функции библиотеки CRT
  11. Небезопасные функции стандартной библиотеки
  12. Проверенные итераторы включены
  13. Небезопасный код MFC или ATL
  14. Устаревшие функции и переменные CRT
  15. Маршалинг ошибок в коде СРЕДЫ CLR
  16. Пример: определяемая пользователем нерекомендуемая функция
  17. Visual studio 2013 error c4996 fopen
  18. Answered by:
  19. Question
  20. Answers
  21. Русские Блоги
  22. Как устранить ошибку C4996: проблема fopen в VS2013
  23. Метод / шаг
  24. Интеллектуальная рекомендация
  25. IView CDN Загрузка значка шрифта нормальная, а значок шрифта не может быть загружен при локальной загрузке JS и CSS
  26. Критическое: ошибка настройки прослушивателя приложения класса org.springframework.web.context.ContextLoaderLis
  27. 1086 Не скажу (15 баллов)
  28. Pandas применяют параллельный процесс приложения, многоядерная скорость очистки данных
  29. PureMVC Learning (Tucao) Примечания

Предупреждение компилятора (уровень 3) C4996

Код использует функцию, член класса, переменную или определение типа, помеченную как нерекомендуемую. Символы устарели с помощью __declspec(deprecated) модификатора или атрибута C++14 [[deprecated]] . Фактическое предупреждающее сообщение C4996 задается модификатором или атрибутом deprecated объявления.

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

Комментарии

Многие функции, функции-члены, шаблоны функций и глобальные переменные в библиотеках Visual Studio устарели. Некоторые функции, такие как POSIX и функции Майкрософт, устарели, так как теперь они имеют другое предпочтительное имя. Некоторые функции библиотеки среды выполнения C устарели, так как они небезопасны и имеют более безопасный вариант. Другие нерекомендуемые, так как они устарели. Сообщения об устаревании обычно включают предполагаемую замену устаревшей функции или глобальной переменной.

Отключение предупреждения

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

Отключение предупреждения для определенной строки кода

Чтобы отключить предупреждение для определенной строки кода, используйте директиву warning pragma. #pragma warning(suppress : 4996)

Отключение предупреждения в файле

Чтобы отключить предупреждение в файле для всего следующего, используйте директиву pragma #pragma warning(disable : 4996) предупреждения.

Отключение предупреждения в сборках командной строки

Чтобы отключить предупреждение глобально в сборках командной строки, используйте параметр командной /wd4996 строки.

Отключение предупреждения для проекта в Visual Studio

Чтобы отключить предупреждение для всего проекта в интегрированной среде разработки Visual Studio, выполните следующие действия.

Откройте диалоговое окно «Страницы свойств » для проекта. Сведения об использовании диалогового окна «Страницы свойств» см. в разделе «Страницы свойств».

Выберите страницу свойств> конфигурацииC/C++>Advanced.

Измените свойство Disable Specific Warnings для добавления 4996 . Нажмите кнопку «ОК» , чтобы применить изменения.

Отключение предупреждения с помощью макросов препроцессора

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

Чтобы определить макрос препроцессора в Visual Studio, выполните следующие действия.

Откройте диалоговое окно «Страницы свойств » для проекта. Сведения об использовании диалогового окна «Страницы свойств» см. в разделе «Страницы свойств».

Разверните свойства > конфигурации препроцессора C/C++>.

В свойстве «Определения препроцессора» добавьте имя макроса. Нажмите кнопку ОК для сохранения изменений, а затем выполните повторную сборку проекта.

Чтобы определить макрос только в определенных исходных файлах, добавьте строку, #define EXAMPLE_MACRO_NAME например перед любой строкой, включающей файл заголовка.

Ниже приведены некоторые распространенные источники предупреждений и ошибок 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 для зарезервированных и глобальных имен, определенных реализацией. Не рекомендуется использовать только имена, а не сами функции. В большинстве случаев в имя функции был добавлен символ подчеркивания, чтобы создать соответствующее имя. Компилятор выдает предупреждение об устаревании для исходного имени функции и предлагает предпочтительное имя.

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

Чтобы отключить предупреждения об устаревании для этих функций, определите макрос _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, так как для библиотеки маршалинга требуется контекст для преобразования из a System::String в . const char *

Пример: определяемая пользователем нерекомендуемая функция

Атрибут можно использовать в собственном коде deprecated , чтобы предупреждать вызывающих объектов, если вы больше не рекомендуете использовать определенные функции. В этом примере C4996 создается в двух местах: одна для строки, в которой объявлена нерекомендуемая функция, и одна для строки, в которой используется функция.

Источник

Visual studio 2013 error c4996 fopen

This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.

Answered by:

Question

I got this error when i ran my program:

C:OpenCV2.3buildincludeopencv2/flann/logger.h(70): warning C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

and then when I tried using fopen_s (replaced fopen with fopen_s), I got this error:

C:OpenCV2.3buildincludeopencv2/flann/logger.h(70): error C2660: ‘fopen_s’ : function does not take 2 arguments

Does anyone have any suggestions?

Answers

Use your favourite search engine — Bing, Google, Yahoo —
and do a search for: msdn fopen_s

Follow the links with msdn in the URL.

Use the same procedure whenever you need documentation
for a VC++ feature or keyword.

Alternatively, put the cursor on the term in question
(e.g. — fopen_s) and press F1. You should get the help
for that term.

If you have the Dynamic Help window open (Ctrl-F1)
then when you put the *editor’s* cursor on a word
a list of available help topics will automatically
appear in the Dynamic Help window. Click on the
most obvious choice to get the compiler’s help.

It should rarely be necessary to ask others to
give you links to documentation or help for common
terms/words/features used when constructing a
program — especially those related to the C and C++
languages.

Источник

Русские Блоги

Как устранить ошибку C4996: проблема fopen в VS2013

Метод / шаг

Щелкните правой кнопкой мыши файл проекта 1 и выберите 2

Затем появится страница свойств файла, нажмите 1 «Препроцессор», затем нажмите 2, чтобы открыть препроцессор, как показано ниже.

Скопируйте «_CRT_SECURE_NO_WARNINGS» в красное поле ниже и нажмите «Применить».

Как только проблема будет решена, можно переходить к следующей работе

Мне так намного лучше, проблема решается постоянно

Интеллектуальная рекомендация

IView CDN Загрузка значка шрифта нормальная, а значок шрифта не может быть загружен при локальной загрузке JS и CSS

Используйте iview, чтобы сделать небольшой инструмент. Чтобы не затронуть другие платформы, загрузите JS и CSS CDN на локальные ссылки. В результате значок шрифта не может быть загружен. Просмо.

Критическое: ошибка настройки прослушивателя приложения класса org.springframework.web.context.ContextLoaderLis

1 Обзор Серверная программа, которая обычно запускалась раньше, открылась сегодня, и неожиданно появилась эта ошибка. Интуитивно понятно, что не хватает связанных с Spring пакетов, но после удаления п.

1086 Не скажу (15 баллов)

При выполнении домашнего задания друг, сидящий рядом с ним, спросил вас: «Сколько будет пять умножить на семь?» Вы должны вежливо улыбнуться и сказать ему: «Пятьдесят три». Это.

Pandas применяют параллельный процесс приложения, многоядерная скорость очистки данных

В конкурсе Algorith Algorith Algorith Algorith Algorith 2019 года используется многофункциональная уборка номера ускорения. Будет использовать панды. Но сама панда, кажется, не имеет механизма для мно.

PureMVC Learning (Tucao) Примечания

Справочная статья:Введение подробного PrueMVC Использованная литература:Дело UnityPureMvc Основная цель этой статьи состоит в том, чтобы организовать соответствующие ресурсы о PureMVC. Что касается Pu.

Источник

Избавляемся от ошибки «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, в постоянном поиске новых задач и алгоритмов

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

Выпускник МГУ им. М.В. Ломоносова

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

Источник

Error c4996 fopen this function or variable may be unsafe

This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.

Answered by:

Question

I got this error when i ran my program:

C:OpenCV2.3buildincludeopencv2/flann/logger.h(70): warning C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

and then when I tried using fopen_s (replaced fopen with fopen_s), I got this error:

C:OpenCV2.3buildincludeopencv2/flann/logger.h(70): error C2660: ‘fopen_s’ : function does not take 2 arguments

Does anyone have any suggestions?

Answers

Use your favourite search engine — Bing, Google, Yahoo —
and do a search for: msdn fopen_s

Follow the links with msdn in the URL.

Use the same procedure whenever you need documentation
for a VC++ feature or keyword.

Alternatively, put the cursor on the term in question
(e.g. — fopen_s) and press F1. You should get the help
for that term.

If you have the Dynamic Help window open (Ctrl-F1)
then when you put the *editor’s* cursor on a word
a list of available help topics will automatically
appear in the Dynamic Help window. Click on the
most obvious choice to get the compiler’s help.

It should rarely be necessary to ask others to
give you links to documentation or help for common
terms/words/features used when constructing a
program — especially those related to the C and C++
languages.

Источник

предупреждение fopen устаревшее

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

Как я могу это предотвратить?

10 ответы

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

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

ответ дан 18 авг.

Вам, вероятно, следует сделать что-то вроде этого: #ifdef _WIN32 #define _CRT_SECURE_NO_DEPRECATE #endif #include Потому что другим платформам это не нужно определять во время компиляции. — Markwatson

@markwatson Лучше бы охранять #ifdef _MSC_VER . — Микровирус

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

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

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

«Microsoft может удалить данную функцию в более поздней версии CRT» — если они больше не хотят внедрять стандарты C или C ++. — Стив Джессоп

Некоторые люди также нацелены на платформы, не относящиеся к MS. И с большим количеством этих _s-функций нет действительно заметного повышения безопасности. — sstn

Для будущих гуглеров: 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 ++++ — Navin

@SteveJessop Они уже сознательно и охотно нарушают стандарт. Видеть это. — ПриближениеТемнотаРыбы

В VS2013 мне нужно было использовать #pragma warning(disable:4996) потому что предложенный _CRT_SECURE_NO_WARNINGS и _CRT_SECURE_NO_DEPRECATE оба не работали. В #define Кажется, что s работают в других контекстах, поэтому предупреждаем, что это, похоже, выполняется непоследовательно. — Билл Вайнман

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

Значение английского слова «deprecate» — это как раз вторая вещь: «мы думаем, что вы не должны его использовать». Но на компьютерном языке это слово в последнее время стало иметь гораздо более слабое значение: «Возможно, было бы неразумно использовать его, потому что мы как бы думаем об его удалении, и мы предоставили что-то, что, по нашему мнению, лучше». — Стив Джессоп

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

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

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

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

Затем посмотрите меню в левой части окна.

Свойства конфигурации C / C ++ Preprocessor

Затем добавьте _CRT_SECURE_NO_WARNINGS в Определения препроцессора.

Создан 15 июля ’17, 04:07

Пожалуйста, сначала посмотрите это как ответить На этот вопрос ответят раньше, очевидно, вы можете добавить свой ответ здесь. Но прежде чем отвечать, вам необходимо понять некоторые моменты. Во-первых, не добавляйте ответ, который ранее был добавлен с тем же кодом или предложением. Во-вторых, не добавляйте слишком сложный ответ, если пользователь очень конкретно спросил о проблеме и о том, что ему нужно для ее решения. В-третьих, вы можете добавить комментарий, если хотите что-то предложить по поводу ответа или вопроса. — Анкит Сутар

Это единственный ответ, который сработал для меня в Visual Studio 2017. #define осталось много ошибок C4996. (@ankitsuthar ваш комментарий кажется мне неуместным. Этот ответ краток, он работает и отличается по важным деталям от других.) — Боб Стейн

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

Компания портативный альтернатива одноразовой, не совсем совместимой со стандартами непереносимой реализации от Microsoft дополнительной функции Annex K fopen_s() стандартная функция языка C fopen() . — Эндрю Хенле

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

Ваш комплексный #IF относится только к платформам, но не к версиям компилятора. Как насчет #if (defined(_MSC_VER) && (_MSC_VER >= 1600) ) . #ELSE . Это должно охватывать все случаи, верно? — всадникБилл

_MSC_VER = 1600 может быть не первой версией, в которой функция fopen () устарела и т. Д. Это была первая версия, в которой я столкнулся с проблемой. — всадникБилл

Похоже, что первая версия MSVC с (некоторыми) безопасными функциями была 2005, _MSC_VER = 1400. — всадникБилл

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

Затем он будет компилироваться.

ответ дан 20 мар ’17, в 16:03

Похоже, это не работает для меня. По-прежнему получаются ошибки компиляции для freopen . — Леви Робертс

@LeviRoberts, вы должны поместить это определение в самый верх файла, ошибка генерируется, когда включены некоторые файлы заголовков — JRH

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

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

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

ответ дан 28 авг.

MS _s не то же самое, что интерфейс проверки границ C11 в целом. У некоторых такой же характер, у некоторых нет. Поскольку этот интерфейс является необязательным, его поддерживают лишь несколько реализаций, поскольку в нем нет необходимости. И ваш код — C ++, а не C, на который вы ссылаетесь в тексте. — слишком честный для этого сайта

@ Олаф: Хм. Я не могу обратиться к проверке границ, кроме как указать на мое предостережение относительно поведения исключения. — всадникБилл

Вы правы, что я привел стандарт C11 (в отличие от C ++ 14 или 17). Эти функции доступны в последних версиях компиляторов Microsoft C ++. Оказывается, приложение K не поддерживается широко за пределами MSVS. Джонатан Леффлер прокомментировал здесь что версии MS на самом деле не соответствуют спецификациям Приложения К. Вот вам и портативность. — всадникБилл

Буду признателен, если вы прочитаете мои комментарии полностью. MSVC на самом деле использует не BCI, а свой собственный суп. MSVC не соответствует требованиям уже как минимум 18 лет и очень четко заявлял о своем нежелании, по крайней мере, включая обязательные функции C99, такие как VLA, которые уже много лет поддерживаются всеми современными компиляторами (включая основные встроенные). — слишком честный для этого сайта

Спрашивающий отметил Visual C ++. Я скопировал код из большего файла C ++. Для C, я думаю, включает в себя stdio.h и строка.h (однако в приведенном выше коде строки не используются). Мне не нужен использование пространства имен std; заявление — это действительно в C? Я думаю встроенный внешний . должно быть статический встроенный в C, чтобы избежать проблем с компоновщиком. В наши дни я не пишу много кода на C. Добавьте комментарий, если я ошибаюсь. — всадникБилл

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

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

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

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

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

Источник

https://iodocs.com/wp-admin/post.php?post=1238&action=edit&message=1

fopen deprecated warning
On Visual Studio 2015 C++ compiler, I get the following warning when my code uses the fopen and such calls.

foo.cpp(5) : warning C4996: ‘fopen’ was declared deprecated

        c:program filesmicrosoft visual studio 8vcincludestdio.h(234) : see declaration of ‘fopen’

        Message: ‘This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.’

Answer:

Well, you could add a:

#pragma warning (disable : 4996)

Before you are possible to use fopen but become you considered using fopen_s as the warning recommends? It returns an error code permitting you to check the result of the function call.

The problem with just disabling deprecated function warnings is that Microsoft may discard the role in question in a later version of the CRT, breaking your code. Now, this won’t happen in this instance with fopen because it’s part of the C & C++ ISO standards.

  • Forum
  • Windows Programming
  • Fopen giving error

Fopen giving error

void In(void) //read the image
{
int i, j;
double el;
char buff[255];
stream = fopen(«test.txt», «r»); //skeltonize -> newedg.txt & normal myFile1
for (j = 0; j < ny; j++) //row
for (i = 0; i < nx; i++) //col
{
fscanf(stream, «%lf», &el);
I[i][j] = el;
}
fclose(stream);
}

This is the aspect of the code and this is the error i get:

Error C4996 ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead.

Error C4996 ‘fscanf’: This function or variable may be unsafe. Consider using fscanf_s instead.

If you are using Visual Studio you can #define _CRT_SECURE_NO_WARNINGS before your #include files.

Not recommended. It is using a bomb to swat a fly. And doesn’t fix the problems with the functions, you can still have buffer overruns.

OR

Use C11’s fopen_s() and fscanf_s() function that was created to prevent buffer overruns. As suggested in the error messages.

https://en.cppreference.com/w/c/io/fopen
https://en.cppreference.com/w/c/io/fopen

Still not working. Any other solution

Don’t use C code. Write C++ instead. Something like this should do it, assuming I is an array of some sensible type.

1
2
3
4
5
6
7
8
ifstream inputFile("test.txt");
for (j = 0; j < ny; j++) //row
{
  for (i = 0; i < nx; i++) //col
  {
    inputFile >>  I[i][j];
  }
}

Last edited on

You should check if and why fopen fails.

1
2
3
4
5
6
stream = fopen("test.txt", "r"); 
if (stream == NULL)
{
  perror(NULL); // #include <stdio.h>
  return;
}

Topic archived. No new replies allowed.

description title ms.date api_name api_location api_type topic_type f1_keywords helpviewer_keywords

Learn more about: fopen, _wfopen

fopen, _wfopen

05/18/2022

_wfopen

fopen

_o__wfopen

_o_fopen

msvcrt.dll

msvcr80.dll

msvcr90.dll

msvcr100.dll

msvcr100_clr0400.dll

msvcr110.dll

msvcr110_clr0400.dll

msvcr120.dll

msvcr120_clr0400.dll

ucrtbase.dll

api-ms-win-crt-stdio-l1-1-0.dll

DLLExport

apiref

STDIO/fopen

CORECRT_WSTDIO/_wfopen

TCHAR/_tfopen

fopen

_wfopen

_tfopen

opening files, for file I/O

wfopen function

tfopen function

_tfopen function

_wfopen function

files [C++], opening

fopen function

fopen, _wfopen

Opens a file. More-secure versions of these functions that perform more parameter validation and return error codes are available; see fopen_s, _wfopen_s.

Syntax

FILE *fopen(
   const char *filename,
   const char *mode
);
FILE *_wfopen(
   const wchar_t *filename,
   const wchar_t *mode
);

Parameters

filename
File name.

mode
Kind of access that’s enabled.

Return value

Each of these functions returns a pointer to the open file. A null pointer value indicates an error. If filename or mode is NULL or an empty string, these functions trigger the invalid parameter handler, which is described in Parameter validation. If execution is allowed to continue, these functions return NULL and set errno to EINVAL.

For more information, see errno, _doserrno, _sys_errlist, and _sys_nerr.

Remarks

The fopen function opens the file that is specified by filename. By default, a narrow filename string is interpreted using the ANSI codepage (CP_ACP). In Windows Desktop applications, it can be changed to the OEM codepage (CP_OEMCP) by using the SetFileApisToOEM function. You can use the AreFileApisANSI function to determine whether filename is interpreted using the ANSI or the system default OEM codepage. _wfopen is a wide-character version of fopen; the _wfopen arguments are wide-character strings. Otherwise, _wfopen and fopen behave identically. Just using _wfopen doesn’t affect the coded character set that’s used in the file stream.

fopen accepts paths that are valid on the file system at the point of execution; fopen accepts UNC paths and paths that involve mapped network drives as long as the system that executes the code has access to the share or mapped drive at the time of execution. When you construct paths for fopen, make sure that drives, paths, or network shares will be available in the execution environment. You can use either forward slashes (/) or backslashes () as the directory separators in a path.

Always check the return value to see whether the pointer is NULL before you perform any other operations on the file. If an error occurs, the global variable errno is set, and may be used to obtain specific error information. For more information, see errno, _doserrno, _sys_errlist, and _sys_nerr.

By default, this function’s global state is scoped to the application. To change it, see Global state in the CRT.

Unicode support

fopen supports Unicode file streams. To open a Unicode file, pass a ccs=encoding flag that specifies the desired encoding to fopen, as follows.

FILE *fp = fopen("newfile.txt", "rt+, ccs=UTF-8");

Allowed values for ccs encoding are UNICODE, UTF-8, and UTF-16LE.

When a file is opened in Unicode mode, input functions translate the data that’s read from the file into UTF-16 data stored as type wchar_t. Functions that write to a file opened in Unicode mode expect buffers that contain UTF-16 data stored as type wchar_t. If the file is encoded as UTF-8, then UTF-16 data is translated into UTF-8 when it’s written. The file’s UTF-8-encoded content is translated into UTF-16 when it’s read. An attempt to read or write an odd number of bytes in Unicode mode causes a parameter validation error. To read or write data that’s stored in your program as UTF-8, use a text or binary file mode instead of a Unicode mode. You’re responsible for any required encoding translation.

If the file already exists and is opened for reading or appending, then any byte order mark (BOM) in the file determines the encoding. The BOM encoding takes precedence over the encoding that’s specified by the ccs flag. The ccs encoding is only used when no BOM is present or the file is a new file.

[!NOTE]
BOM detection only applies to files that are opened in Unicode mode (that is, by passing the ccs flag).

The following table summarizes the modes that are used for various ccs flags given to fopen and Byte Order Marks in the file.

Encodings used based on ccs flag and BOM

ccs flag No BOM (or new file) 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

Files opened for writing in Unicode mode have a BOM written to them automatically.

If mode is a, ccs=encoding for some encoding value, fopen first tries to open the file by using both read and write access. If this action succeeds, the function reads the BOM to determine the encoding for the file. If it fails, the function uses the default encoding for the file. In either case, fopen will then reopen the file by using write-only access. (This behavior applies to "a" mode only, not to "a+" mode.)

Generic-text routine mappings

TCHAR.H routine _UNICODE and _MBCS not defined _MBCS defined _UNICODE defined
_tfopen fopen fopen _wfopen

The character string mode specifies the kind of access that is requested for the file, as follows.

mode Access
"r" Opens for reading. If the file doesn’t exist or can’t be found, the fopen call fails.
"w" Opens an empty file for writing. If the given file exists, its contents are destroyed.
"a" Opens for writing at the end of the file (appending) without removing the end-of-file (EOF) marker before new data is written to the file. Creates the file if it doesn’t exist.
"r+" Opens for both reading and writing. The file must exist.
"w+" Opens an empty file for both reading and writing. If the file exists, its contents are destroyed.
"a+" Opens for reading and appending. The appending operation includes the removal of the EOF marker before new data is written to the file. The EOF marker isn’t restored after writing is completed. Creates the file if it doesn’t exist.

When a file is opened by using the "a" access type or the "a+" access type, all write operations occur at the end of the file. The file pointer can be repositioned by using fseek or rewind, but is always moved back to the end of the file before any write operation is performed. Therefore, existing data can’t be overwritten.

The "a" mode doesn’t remove the EOF marker before it appends to the file. After appending has occurred, the MS-DOS TYPE command only shows data up to the original EOF marker and not any data appended to the file. Before it appends to the file, the "a+" mode does remove the EOF marker. After appending, the MS-DOS TYPE command shows all data in the file. The "a+" mode is required for appending to a stream file that is terminated with the CTRL+Z EOF marker.

When the "r+", "w+", or "a+" access type is specified, both reading and writing are enabled (the file is said to be open for «update»). However, when you switch from reading to writing, the input operation must encounter an EOF marker. If there’s no EOF, you must use an intervening call to a file positioning function. The file positioning functions are fsetpos, fseek, and rewind. When you switch from writing to reading, you must use an intervening call to either fflush or to a file positioning function.

In addition to the earlier values, the following characters can be appended to mode to specify the translation mode for newline characters.

mode modifier Translation mode
t Open in text (translated) mode.
b Open in binary (untranslated) mode; translations involving carriage-return and line feed characters are suppressed.

In text mode, CTRL+Z is interpreted as an EOF character on input. In files that are opened for reading/writing by using "a+", fopen checks for a CTRL+Z at the end of the file and removes it, if it’s possible. It’s removed because using fseek and ftell to move within a file that ends with CTRL+Z may cause fseek to behave incorrectly near the end of the file.

In text mode, carriage return-line feed (CRLF) combinations are translated into single line feed (LF) characters on input, and LF characters are translated to CRLF combinations on output. When a Unicode stream-I/O function operates in text mode (the default), the source or destination stream is assumed to be a sequence of multibyte characters. Therefore, the Unicode stream-input functions convert multibyte characters to wide characters (as if by a call to the mbtowc function). For the same reason, the Unicode stream-output functions convert wide characters to multibyte characters (as if by a call to the wctomb function).

If t or b isn’t given in mode, the default translation mode is defined by the global variable _fmode. If t or b is prefixed to the argument, the function fails and returns NULL.

For more information about how to use text and binary modes in Unicode and multibyte stream-I/O, see Text and binary mode file I/O and Unicode stream I/O in text and binary modes.

The following options can be appended to mode to specify more behaviors.

mode modifier Behavior
x Forces the function to fail if filename already exists. Can only be used with the «w» or «w+» specifiers.
c Enable the commit flag for the associated filename so that the contents of the file buffer are written directly to disk if either fflush or _flushall is called.
n Reset the commit flag for the associated filename to «no-commit.» This flag is the default. It also overrides the global commit flag if you link your program with COMMODE.OBJ. The global commit flag default is «no-commit» unless you explicitly link your program with COMMODE.OBJ (see Link options).
N Specifies that the file isn’t inherited by child processes.
S Specifies that caching is optimized for, but not restricted to, sequential access from disk.
R Specifies that caching is optimized for, but not restricted to, random access from disk.
T Specifies a file as temporary. If possible, it isn’t flushed to disk.
D Specifies a file as temporary. It’s deleted when the last file pointer is closed.
ccs=encoding Specifies the encoded character set to use (one of UTF-8, UTF-16LE, or UNICODE) for this file. Leave unspecified if you want ANSI encoding. This flag is separated from flags that precede it by a comma (,). For example: FILE *f = fopen("newfile.txt", "rt+, ccs=UTF-8");

Valid characters for the mode string that is used in fopen and _fdopen correspond to oflag arguments that are used in _open and _sopen, as follows.

Characters in mode string Equivalent oflag value for _open/_sopen
a `_O_WRONLY
a+ `_O_RDWR
r _O_RDONLY
r+ _O_RDWR
w _O_WRONLY (usually `_O_WRONLY
w+ _O_RDWR (usually `_O_RDWR
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=UNICODE _O_WTEXT
*ccs=UTF-8* _O_UTF8
ccs=UTF-16LE _O_UTF16

If you’re using rb mode, you don’t have to port your code, and if you expect to read most of a large file or aren’t concerned about network performance, you might also consider whether to use memory mapped Win32 files as an option.

Requirements

Function Required header
fopen <stdio.h>
_wfopen <stdio.h> or <wchar.h>

_wfopen is a Microsoft extension. For more information about compatibility, see Compatibility.

The c, n, t, S, R, T, and D mode options are Microsoft extensions for fopen and _fdopen and shouldn’t be used where ANSI portability is desired.

Example 1

The following program opens two files. It uses fclose to close the first file and _fcloseall to close all remaining files.

// crt_fopen.c
// compile with: /W3
// This program opens two files. It uses
// fclose to close the first file and
// _fcloseall to close all remaining files.

#include <stdio.h>

FILE *stream, *stream2;

int main( void )
{
   int numclosed;

   // Open for read (will fail if file "crt_fopen.c" does not exist)
   if( (stream  = fopen( "crt_fopen.c", "r" )) == NULL ) // C4996
   // Note: fopen is deprecated; consider using fopen_s instead
      printf( "The file 'crt_fopen.c' was not openedn" );
   else
      printf( "The file 'crt_fopen.c' was openedn" );

   // Open for write
   if( (stream2 = fopen( "data2", "w+" )) == NULL ) // C4996
      printf( "The file 'data2' was not openedn" );
   else
      printf( "The file 'data2' was openedn" );

   // Close stream if it is not NULL
   if( stream)
   {
      if ( fclose( stream ) )
      {
         printf( "The file 'crt_fopen.c' was not closedn" );
      }
   }

   // All other files are closed:
   numclosed = _fcloseall( );
   printf( "Number of files closed by _fcloseall: %un", numclosed );
}
The file 'crt_fopen.c' was opened
The file 'data2' was opened
Number of files closed by _fcloseall: 1

Example 2

The following program creates a file (or overwrites one if it exists), in text mode that has Unicode encoding. It then writes two strings into the file and closes the file. The output is a file named _wfopen_test.xml, which contains the data from the output section.

// crt__wfopen.c
// compile with: /W3
// This program creates a file (or overwrites one if
// it exists), in text mode using Unicode encoding.
// It then writes two strings into the file
// and then closes the file.

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <wchar.h>

#define BUFFER_SIZE 50

int main(int argc, char** argv)
{
    wchar_t str[BUFFER_SIZE];
    size_t  strSize;
    FILE*   fileHandle;

    // Create an the xml file in text and Unicode encoding mode.
    if ((fileHandle = _wfopen( L"_wfopen_test.xml",L"wt+,ccs=UNICODE")) == NULL) // C4996
    // Note: _wfopen is deprecated; consider using _wfopen_s instead
    {
        wprintf(L"_wfopen failed!n");
        return(0);
    }

    // Write a string into the file.
    wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"<xmlTag>n");
    strSize = wcslen(str);
    if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
    {
        wprintf(L"fwrite failed!n");
    }

    // Write a string into the file.
    wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"</xmlTag>");
    strSize = wcslen(str);
    if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
    {
        wprintf(L"fwrite failed!n");
    }

    // Close the file.
    if (fclose(fileHandle))
    {
        wprintf(L"fclose failed!n");
    }
    return 0;
}

See also

Stream I/O
Interpretation of multibyte-character sequences
fclose, _fcloseall
_fdopen, _wfdopen
ferror
_fileno
freopen, _wfreopen
_open, _wopen
_setmode
_sopen, _wsopen

Понравилась статья? Поделить с друзьями:
  • C42268 ошибка форд
  • C7301 kyocera ошибка
  • C42268 ошибка на мондео
  • C7104 ошибка kyocera
  • C422 64 ошибка форд фокус 3