ofstream und %userprofile%

lemon03

Grünschnabel
Hallo, ich bin noch ein blutiger Anfänger in C++ und stehe vor folgendem Problem:

Code:
ofstream ausgabe("%userprofile%/desktop/beispiel.txt"); 
ausgabe << beispiel;
ausgabe.close();

Mit %userprofile% wird einfach keine Datei erzeugt. Wie muss ich in dem Fall vorgehen?
 
%var% funktioniert soweit ich weiß nur in einer Shell bzw in diversen Skriptsprachen.
In C oder C++ muss man die Win-API bemühen. Ohne Kommentare und Fehlerbehandlung sind es nur 5 Zeilen Code.

C:
#include <stdio.h>
#include <windows.h>

int main()
{
    // kein Gebrauch der Unicode-Typedefs und -Makros
    //   DWORD ist unsigned long, LPCTSTR und LPTSTR char*
    //   -> damit nicht mehr Unicode-kompatibel

    // der Name der env-Variable, die ausgelesen werden soll
    char *envName = "USERPROFILE";

    // Speicher reservieren für den Wert der env-Variable; 256 bit sollten
    //   i.A. ausreichen, falls nicht, kann man hierfür bis zu 2^15 - 1 bit reservieren
    unsigned long nSize = 255;
    char *envValBuffer = (char*) malloc (sizeof(char) * nSize);

    unsigned long apiRetVal = GetEnvironmentVariable(envName, envValBuffer, nSize);

    // Wenn Rückgabewert 0, ist der API-Call gescheitert oder die Variable nicht vorhanden, exit.
    if (apiRetVal == 0)
    {
        printf("GetEnvironmentVariable() failed. Error code %d\n", (int)GetLastError());
        return 1;
    }

    printf ("%s = %s\n", envName, envValBuffer);

    // alloziierten Speicher freigeben
    free (envValBuffer);
    return 0;
}

Traveller
 
Zuletzt bearbeitet:
%var% funktioniert soweit ich weiß nur in einer Shell bzw in diversen Skriptsprachen.
So weit richtig.

In C oder C++ muss man die Win-API bemühen.
Muss man nicht, wenn man die Standardbibliothek-Funktion getenv verwendet. Dann sind es sogar mit Fehlerbehandlung nur fünf Zeilen:

C++:
#include <cstdlib>
#include <iostream>

int main() {
  char *value = std::getenv("USERPROFILE");
  if (value == NULL) {
    std::cerr << "User profile not found" << std::endl;
    return EXIT_FAILURE;
  }
  std::cout << "User profile is " << value << std::endl;
  return EXIT_SUCCESS;
}

Noch ein paar Kommentare zu deinem Code:
C:
    // der Name der env-Variable, die ausgelesen werden soll
    char *envName = "USERPROFILE";
Besser wäre const char *envName, da das genau der Typ einer Zeichenkettenkonstante ist.

C:
    // Speicher reservieren für den Wert der env-Variable; 256 bit sollten
    //   i.A. ausreichen, falls nicht, kann man hierfür bis zu 2^15 - 1 bit reservieren
    unsigned long nSize = 255;
Bits? Wohl eher Zeichen. Außerdem verstehe ich nicht, warum du im Kommentar von 256 „Bit“ redest, dann aber nur Platz für 255 Zeicher reservierst. Am besten wäre es, wenn man die benötigte Zeichenanzahl ermittelt, anstatt zu raten:
C++:
DWORD requiredNumChars = GetEnvironmentVariable(envName, NULL, 0);
if (requiredNumChars == 0) {
  // Fehlerbehandlung, Umgebungsvariable nicht auslesbar
}
char *envValBuffer = new char[requiredNumChars];
DWORD numChars = GetEnvironmentVariable(envName, envValBuffer, requiredNumChars);
if (numChars == 0 || numChars >= requiredNumChars) {
  // Fehlerbehandlung, ggf. neuer Versuch beim zweiten Fall (Umgebungsvariable wurde zwischen
  // den Aufrufen von GetEnvironmentVariable auf einen längeren Wert geändert).
}
delete[] envValBuffer;

Grüße,
Matthias
 
Zuletzt bearbeitet von einem Moderator:
Vielen Dank soweit :)

Wie kann ich jetzt zu dem obigen value einen String addieren?

Code:
ort=getenv("USERPROFILE")+"/Desktop/"

Bekomme die Meldung, das zwei Zeiger nicht addiert werden können.
 
Zurück