problem mit %windir%, funktioniert nicht?

GeileEier

Mitglied
hallo,
ich habe ein problem mit syntax, die SUFU hat nix ergeben....
ich will eine datei erstellen und in diese schreiben...
geht auch wunderbar mit C:\\windows... oder C:\\windows\\programme...
aber weil nicht jeder rechner die ordner "windows" und "programme" hat will ich das über %windir% oder %programdir% machen... geht aber irgendwie nicht... woran kann das liegen

funktioniert
fstream outfile;
outfile.open("C:\\windows\\test.txt",ios::out|ios::ate);
outfile<<"zeile_1\n";
outfile<<"zeile_2\n";
outfile.close();

funktioniert nicht :(
fstream outfile;
outfile.open("%windir%\\test.txt",ios::out|ios::ate);
outfile<<"zeile_1\n";
outfile<<"zeile_2\n";
outfile.close();
 
%windir% ist falsch -> ShGetFolderLocation, SHGetSpecialFolderLocation oder ExpandEnvironmentStrings. Zum Kopieren kann man auch SHFileOperation verwenden.
So hab ich das in erinnerung bin mir aber nicht mehr ganz sicher^^
hoffe das mit dem falsch kann vielleicht jemadn anderes klären.
aus jedenfall:

Code:
cout << getenv("windir")<<endl;
funktioniert das bei mir einwandfrei.

also
Code:
getenv("windir")

oder eben
PHP:
DWORD WINAPI GetEnvironmentVariable(
LPCTSTR lpName,
LPTSTR lpBuffer,
DWORD nSize
);

Code:
char buff[256];
DWORD dwSize = sizeof(buff);
GetEnvironmentVariable("windir",buff,dwSize);
 
Das kommt vom %d für int etc bei Funktionen wie printf
Wenn du %irgendwas schreibst, wird generell angenommen, dass es so ein Formatspezifierer ist.

In dem Fall brauchst du aber wirklich das Prozentzeichen, dafür musst du es nur doppelt schreiben, genau wie beim Backslash

also
"%windir%\\xyz"
wird zu
"%%windir%%\\xyz"

gruß

PS: 3cyber war schneller, aber warum nicht windir verwenden
Funktioniert ja wohl, und da solltest du nur einmal in die Registrypfade schauen...alles voll damit
 
Das kommt vom %d für int etc bei Funktionen wie printf
Wenn du %irgendwas schreibst, wird generell angenommen, dass es so ein Formatspezifierer ist.
Das ist Unsinn. Das ist nur bei Funktionen wie scanf und printf der Fall. Generell gilt das nur für den Backslash.

PS: 3cyber war schneller, aber warum nicht windir verwenden
Funktioniert ja wohl, und da solltest du nur einmal in die Registrypfade schauen...alles voll damit
Nein, es funktioniert nicht.

@3cyber: deine Tipps waren schon ganz richtig.

Gruß
 
hmm... verwirrt mich irgendwie....wie bekomme ich das am besten hin...
mein code sieht bisher so aus...

PHP:
#include <windows.h>
#include <fstream>
 
using namespace std;
 
 int main ()
 {

fstream outfile;
outfile.open("%windir%\\test.txt",ios::out|ios::ate);
outfile<<"zeile_1\n";
outfile<<"zeile_2\n";
outfile.close(); 

    return 0;
}
 
Hallo,

die Bezeichner "%windir%" & Co. sind Environment-Variablen des Windows-Systems, die vor der eigentlichen Verwendung erst in ihre tatsächlichen Werte (z.B. Pfade) umgesetzt werden müssen. Die Klassen der C++ Standardbibliothek leisten das natürlich nicht, da sie an der Stelle plattformunabhängig sind.

Die API-Funktion zum Ermitteln der Windows Verzeichnisses heißt GetWindowsDirectory oder du benutzt einen der Vorschläge von 3Cyb3r.

Gruß
MCoder
 
ok... danke erstmal für die hilfe.
hab das jetz so gemacht:

PHP:
#include <windows.h>
#include <fstream>
 
using namespace std;
 
 int main ()
 {

	char path[MAX_PATH];
	GetWindowsDirectory(path,MAX_PATH);

fstream outfile;
outfile.open(path, "\\test.txt",ios::out|ios::ate);
outfile<<"zeile_1\n";
outfile<<"zeile_2\n";
outfile.close(); 

    return 0;
}
kommen aber fehler beim compilieren.... da stimmt der pfad nicht oder was?
 
PHP:
#include <windows.h>
#include <fstream>
#include <string>
#include <stdlib.h>
#include <iostream>
 
using namespace std;

#define PATH 256

int main(int argc, char* argv[])
{
    char path[PATH];
    DWORD dwSize = sizeof(path);
    GetEnvironmentVariable("windir",path,dwSize);

    strcat(path,"\\test.txt");
    cout<<path<<endl;

	fstream outfile;
	outfile.open(path,ios::out|ios::ate);
	outfile<<"zeile_1\n";
	outfile<<"zeile_2\n";
	outfile.close();  

	system("pause");

	return 0;
}
 
Zurück