Wie man von fopen zu fopen_s wechselt

Lesezeit: 4 Minuten

Benutzeravatar von beatleman
Beatlemann

Visual Studio beschwert sich über fopen. Ich kann die richtige Syntax zum Ändern nicht finden. Ich habe:

FILE *filepoint = (fopen(fileName, "r"));

zu

FILE *filepoint = (fopen_s(&,fileName, "r"));

Was ist der Rest des ersten Parameters?

  • fopen_s ist bei MSDN dokumentiert. Der erste Parameter soll a sein FILE**und der Rückgabewert ist an errno_t.

    – Michael

    24. Februar 2015 um 9:02 Uhr


  • google “MSDN fopen_s”

    – pmg

    24. Februar 2015 um 9:02 Uhr

  • Funktioniert F1 nicht mehr in Visual Studio?

    – molbnilo

    24. Februar 2015 um 9:33 Uhr

  • Ich würde einfach die Compiler-Einstellungen so einstellen, dass die Warnmeldung geknebelt wird.

    – Jive Dadson

    17. Januar 2018 um 2:17 Uhr

  • Verwenden Sie nicht sowohl das c-Tag als auch das c++-Tag, es sei denn, Sie fragen nach dem Unterschied zwischen C und C++.

    – Spencer

    1. August um 12:48 Uhr


Benutzeravatar von chqrlie
chqrlie

fopen_s ist ein “sicher” Variante von fopen mit ein paar zusätzlichen Optionen für den Mode-String und einer anderen Methode zur Rückgabe des Stream-Zeigers und des Fehlercodes. Es wurde von Microsoft erfunden und hat seinen Weg in den C-Standard gefunden: Es ist im Anhang K.3.5.2.2 des neuesten Entwurfs des C11-Standards dokumentiert. Natürlich ist es vollständig in der Microsoft Online-Hilfe dokumentiert. Sie scheinen das Konzept der Übergabe eines Zeigers an eine Ausgabevariable in C nicht zu verstehen. In Ihrem Beispiel sollten Sie die Adresse von übergeben filepoint als erstes Argument:

errno_t err = fopen_s(&filepoint, fileName, "r");

Hier ist ein vollständiges Beispiel:

#include <errno.h>
#include <stdio.h>
#include <string.h>
...
    FILE *filepoint;
    errno_t err;
    
    if ((err = fopen_s(&filepoint, fileName, "r")) != 0) {
        // File could not be opened. filepoint was set to NULL
        // error code is returned in err.
        // error message can be retrieved with strerror(err);
        fprintf(stderr, "cannot open file '%s': %s\n",
                fileName, strerror(err));
        // If your environment insists on using so called secure
        // functions, use this instead:
        char buf[strerrorlen_s(err) + 1];
        strerror_s(buf, sizeof buf, err);
        fprintf_s(stderr, "cannot open file '%s': %s\n",
                  fileName, buf);
    } else {
        // File was opened, filepoint can be used to read the stream.
        ...
        fclose(filepoint);
    }

Die Unterstützung von Microsoft für C99 ist klobig und unvollständig. Visual Studio erzeugt Warnungen für gültigen Code und erzwingt die Verwendung standardmäßiger, aber optionaler Erweiterungen, scheint dies jedoch in diesem speziellen Fall nicht zu unterstützen strerrorlen_s. Weitere Informationen finden Sie unter Fehlende C11-strerrorlen_s-Funktion unter MSVC 2017.

Erschwerend kommt hinzu, dass die Microsoft-Implementierung vieler ihrer sicher Funktionen haben eine andere Semantik als die in Anhang K dokumentierte Standard-Semantik, was dazu führte, dass andere Systeme diese Funktionen ablehnten und sich weigerten, sie zu implementieren. Es wird daher empfohlen, sie aus Gründen der Portabilität zu vermeiden.

Um Standardfunktionen wie z fopen() Mit Visual Studio können Sie diese 3 Zeilen am Anfang Ihrer Quelldateien vor der ersten hinzufügen #include Richtlinie:

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

Das Beispiel wird:

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <errno.h>
#include <stdio.h>
#include <string.h>
...
    FILE *filepoint;
    
    if ((filepoint = fopen(fileName, "r")) == NULL) {
        // File could not be opened. filepoint was set to NULL
        // error code was stored in errno.
        // error message can be retrieved with strerror(err);
        fprintf(stderr, "cannot open file '%s': %s\n",
                fileName, strerror(errno));
    } else {
        // File was opened, filepoint can be used to read the stream.
        ...
        fclose(filepoint);
    }

  • strerror hat ein ähnliches Problem wie fopen. Erwägen Sie eine Überarbeitung, um die Verwendung von strerror_s für eine +1 von mir anzuzeigen?

    – Assimilator

    15. April 2016 um 20:34 Uhr

  • @Assimilater: Es gibt kein echtes Problem mit fopen. Visual Studio erzeugt möglicherweise eine Warnung, die Benutzer auffordert, weniger portierbaren Code mit zu schreiben fopen_s(). Die hinzugefügte Semantik in fopen_s bezüglich der Default-Berechtigungen und des exklusiven Modus werden am besten mit adressiert fdopen wenn verfügbar. strerror_s erfordert, dass der Benutzer einen Puffer bereitstellt, dessen Länge zuerst durch Aufrufen berechnet werden soll strerrorlen_s(err). Ein Kopfschmerz, der die Mühe kaum wert ist.

    – chqrlie

    16. April 2016 um 19:15 Uhr

  • @Assimilater: Trotzdem habe ich die Antwort bearbeitet und Code für beide Ansätze bereitgestellt.

    – chqrlie

    16. April 2016 um 19:21 Uhr

  • Ich meinte, dass ich bei der Verwendung von strerror(err) dieselbe Warnung von Visual Studio (die mich am Kompilieren hinderte) wie bei fopen erhielt. :/

    – Assimilator

    10. Mai 2016 um 3:54 Uhr

  • @nurp: Die Unterstützung von Microsoft für C99 ist klobig und unvollständig. VS gibt Warnungen für gültigen Code aus und erzwingt die Verwendung optionaler Standarderweiterungen, scheint dies jedoch in diesem speziellen Fall nicht zu unterstützen strerrorlen_s. Weitere Informationen finden Sie unter stackoverflow.com/questions/44430141/….

    – chqrlie

    25. November 2017 um 11:35 Uhr

1386960cookie-checkWie man von fopen zu fopen_s wechselt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy