char array in string umformen ?
-
Oh Gott bin ich ein depp ! Habe meinen Fehler jetzt rausgefunden : Ich hatte am anfang std: deklariert ! Läuft jetzt alles rund ! Vielen Dank an Alle die mir geholfen haben !!!
PS : Wird nicht meine lezte Frage hier gewesen sein
-
Mist ! Dadurch konnte mein Problem doch nicht gelöst werden ! Ich poste am besten mal den quellcode :
#include <iostream> #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string> using namespace std; int main() { string user_name_string; char user_name[255]; char computer_name[255]; DWORD nSize; //Computer Name herrausbekommen nSize = sizeof( computer_name ); GetComputerName( computer_name, &nSize ); cout << "Computername: " << computer_name << endl; //User Name herrausbekommen nSize = sizeof( user_name ); GetUserName( user_name, &nSize ); cout << endl; getchar(); user_name_string = user_name; CopyFile("C:\\Dokumente und Einstellungen\\" + user_name_string + "\\Eigene Dateien\\Eigene Bilder\\Beispielbilder\\Blaue Berge.jpg", "C:\\BILD.jpg" , false); }
So wenn ich mein proggi ausführe sagt Code:Blocks : C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\test\main.cpp|35|error: cannot convert `std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to `const CHAR*' for argument `1' to `BOOL CopyFileA(const CHAR*, const CHAR*, BOOL)'|
...
-
Das ist auch nicht wirklich Standard-C++, was du da machst.
Was erwartet denn
CopyFile()
für Argumente? Der Fehlermeldung nach sollte das erste vom Typconst char*
sein. Du kannst zuerst einenstd::string
deklarieren und dann überc_str()
den Zeiger aufconst char
erhalten:std::string MyString = "...."; CopyFile(MyString.c_str(), ...);
Vielleicht kannst du auch
std::string::append()
benutzen, um Strings zusammenzuketten. Oder du rufst den Konstruktor mitstd::string("Text")
explizit auf.
-
Wenn ich mal ein wenig rumpfuschen darf ...
#include <iostream> #include <windows.h> // #include <stdio.h> Kein Standard C++ Header, richtig wäre <cstdio> // #include <stdlib.h> Kein Standard C++ Header, richtig wäre <cstdlib> // #include <sys/types.h> Wofür? // #include <sys/stat.h> Wofür? Die letzten 4 Header werden nicht benötigt, raus damit! #include <string> // using namespace std; // Auf using namespace sollte man, wenn möglich, verzichten. int main() { // char user_name[255]; // char computer_name[255]; // Bitte keine rohen Arrays in C++ std::vector<char> user_name(UNLEN + 1); // Richige Grösse verwenden -> siehe MSDN std::vector<char> computer_name(MAX_COMPUTERNAME_LENGTH + 1); // Richtige Grösse verwenden -> siehe MSDN // DWORD nSize; Bitte keine ungarische Notation! Ist aber Geschmacksache ... DWORD size = computer_name.size(); // nSize = sizeof( computer_name ); überflüssig jetzt. GetComputerName(&computer_name[0], &size); std::cout << "Computername: " << &computer_name[0] << std::endl; //User Name herrausbekommen // nSize = sizeof( user_name ); überflüssig jetzt. size = user_name.size(); GetUserName(&user_name[0], &size); std::cout << std::endl; // getchar(); Das ist C, hat in C++ nichts zu suchen! std::cin.get(); // <- macht das gleiche. // Als nächstes, für Pfadangaben, kann man unter Windows auch den Slash '/' nehmen. // Das macht es einfacher zu schreiben. std::string user_name_string = "C:/Dokumente und Einstellungen/"; user_name_string.append(&user_name[0], user_name.size() - 1); // ^ ohne das \0 Zeichen. user_name_string.append("/Eigene Dateien/Eigene Bilder/Beispielbilder/Blaue Berge.jpg"); CopyFile(user_name_string.c_str(), "C:/BILD.jpg", FALSE); // user_name_string.c_str() -> Hole einen null terminierten String // Zudem muss man oder sollte man TRUE/FALSE verwenden bei WinAPI Funktionen. // Weil die kennen bool eigentlich nicht. return 0; }
Zudem bitte C/C++ Code Tags verwenden.
C++ Referenz: http://www.cplusplus.com/reference/Und natürlich sollte man bei den WinAPI Funktionen noch überprüfen, ob sie erfolgreich waren oder nicht. Dazu war ich jetzt aber zu faul, es auch noch in den obigen Code reinzunehmen.
Grüssli
-
soo da bin ich wieder ! hatte die letzte zeit leider nicht genügend zeit (xD) um hier nen blick reinzufwerfen ! Ich habe jetzt deinen Quellcode kopiert und versucht zu starten doch meine neue IDE (habe jezzt Visual Studio express edition) beklagt sich über 17 Fehler !!! hier die Liste :
Fehler 1 error C2039: 'vector': Ist kein Element von 'std' c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 19
Fehler 2 error C2065: 'vector': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 19
Fehler 3 error C2062: 'char'-Typ unerwartet c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 19
Fehler 4 error C2039: 'vector': Ist kein Element von 'std' c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 20
Fehler 5 error C2065: 'vector': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 20
Fehler 6 error C2062: 'char'-Typ unerwartet c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 20
Fehler 7 error C2065: 'computer_name': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 23
Fehler 8 error C2228: Links von ".size" muss sich eine Klasse/Struktur/Union befinden. c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 23
Fehler 9 error C2065: 'computer_name': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 27
Fehler 10 error C2065: 'computer_name': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 28
Fehler 11 error C2065: 'user_name': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 32
Fehler 12 error C2228: Links von ".size" muss sich eine Klasse/Struktur/Union befinden. c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 32
Fehler 13 error C2065: 'user_name': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 34
Fehler 14 error C2065: 'user_name': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 45
Fehler 15 error C2065: 'user_name': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 45
Fehler 16 error C2228: Links von ".size" muss sich eine Klasse/Struktur/Union befinden. c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 45
Fehler 17 error C2664: 'CopyFileW': Konvertierung des Parameters 1 von 'const char *' in 'LPCWSTR' nicht möglich c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 50
-
Entweder du hast:
a) #include <vector> vergessen
b) using namespace std; vergessen
oder
c) vector<X> statt std::vector<X> (besser als b) ) geschrieben
-
Hey ! Danke hat geklappt lag am fahlenden vector ! jetzt sind es nur noch 4 Fehler :
Fehler 1 error C2065: 'UNLEN': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 20
Fehler 2 error C2664: 'GetComputerNameW': Konvertierung des Parameters 1 von 'char *' in 'LPWSTR' nicht möglich c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 28
Fehler 3 error C2664: 'GetUserNameW': Konvertierung des Parameters 1 von 'char *' in 'LPWSTR' nicht möglich c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 35
Fehler 4 error C2664: 'CopyFileW': Konvertierung des Parameters 1 von 'const char *' in 'LPCWSTR' nicht möglich c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 51
-
Entweder du benutzt Unicode (L"string" + std::wstring), oder su stellst dein Projekt mal auf Multibyte.
(Konfigurationseigenschaften->Allgemein->Zeichensatz auf Multi-Byte stellen).
-
wie gesagt ich fange gerade erst an und weis nicht wie ich dieses unicode benutze !!! kannst du mir des anhand code zeigen ??
-
FedoX schrieb:
wie gesagt ich fange gerade erst an und weis nicht wie ich dieses unicode benutze !!! kannst du mir des anhand code zeigen ??
Machs dir einfach und stell vorerst einfach auf Multibyte. Sofern du nicht vorhast eine japanische Version deines Programmes zu liefern, sollte das reichen.
Ansonsten schau mal hier im FAQ, oder Magazin nach. Da hat es IIRC etwas über das Thema.
-
Mann ! Ih find das in den Optionen nicht !!! Weis jemand wo ich diese Einstellung vornehmen kann ?
^^japanische versionen wirds noch nciht geben ! Erstmal reicht mir Europa und Amerika xD
-
drakon schrieb:
Entweder du benutzt Unicode (L"string" + std::wstring), oder su stellst dein Projekt mal auf Multibyte.
(Projekt->[Projektname]-Eigenschaften->Konfigurationseigenschaften->Allgemein->Zeichensatz auf Multi-Byte stellen).So.. Das sollte reichen.
(hab noch das fette hinzugefügt)
-
FUA ! Es klappt ! Nur noch 1 einger Fehler !!!
Fehler 1 error C2065: 'UNLEN': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\rg\rg\rg.cpp 20
ich bin schon wieder überfordert !!! aber aus Fehlern lernt man(n) , nich ?
-
Na. Doppelklick mal auf die Meldung und lies sie genau. Du hast UNLEN nicht deklariert.
-
was ist UNLEN denn ? ich weis ja noch nicht einmal wofür die gebraucht wird !? Das mit dem vector is mir auhc neu!
-
FedoX schrieb:
was ist UNLEN denn ? ich weis ja noch nicht einmal wofür die gebraucht wird !? Das mit dem vector is mir auhc neu!
Mach Doppelklick auf die Fehlermeldung, dann kommst du zu der Zeile Code, wo das drin steht. Sag mal so das ist. (und/oder zeig die Stelle Code mal..)
-
[cpp]#include <iostream> #include <windows.h> // #include <stdio.h> Kein Standard C++ Header, richtig wäre <cstdio> // #include <stdlib.h> Kein Standard C++ Header, richtig wäre <cstdlib> // #include <sys/types.h> Wofür? // #include <sys/stat.h> Wofür? Die letzten 4 Header werden nicht benötigt, raus damit! #include <string> #include <vector> // using namespace std; // Auf using namespace sollte man, wenn möglich, verzichten. int main() { // char user_name[255]; // char computer_name[255]; // Bitte keine rohen Arrays in C++ [quote]std::vector<char> user_name(UNLEN + 1); // Richige Grösse verwenden -> siehe MSDN[/quote] std::vector<char> computer_name(MAX_COMPUTERNAME_LENGTH + 1); // Richtige Grösse verwenden -> siehe MSDN // DWORD nSize; Bitte keine ungarische Notation! Ist aber Geschmacksache ... DWORD size = computer_name.size(); // nSize = sizeof( computer_name ); überflüssig jetzt. GetComputerName(&computer_name[0], &size); std::cout << "Computername: " << &computer_name[0] << std::endl; //User Name herrausbekommen // nSize = sizeof( user_name ); überflüssig jetzt. size = user_name.size(); GetUserName(&user_name[0], &size); std::cout << std::endl; // getchar(); Das ist C, hat in C++ nichts zu suchen! std::cin.get(); // <- macht das gleiche. // Als nächstes, für Pfadangaben, kann man unter Windows auch den Slash '/' nehmen. // Das macht es einfacher zu schreiben. std::string user_name_string = "C:/Dokumente und Einstellungen/"; user_name_string.append(&user_name[0], user_name.size() - 1); // ^ ohne das \0 Zeichen. user_name_string.append("/Eigene Dateien/Eigene Bilder/Beispielbilder/Blaue Berge.jpg"); CopyFile(user_name_string.c_str(), "C:/BILD.jpg", FALSE); // user_name_string.c_str() -> Hole einen null terminierten String // Zudem muss man oder sollte man TRUE/FALSE verwenden bei WinAPI Funktionen. // Weil die kennen bool eigentlich nicht. return 0; } [/cpp]
-
UNLEN : UserName LENgth
maximale Länge von Usernames eben
findet sich im Windowsheader lmcons.h
-
Ich hatte ja hingeschrieben, du sollst in der MSDN nachschauen. Also nehmen wir zum Beispiel www.altavista.ch, geben MSDN UNLEN ein (http://ch.altavista.com/web/results?itag=ody&q=MSDN+UNLEN&kgs=1&kls=0) und bekommen als erstes Resultat:
http://msdn.microsoft.com/en-us/library/ms724432.aspxUnd dort drin steht:
lpBuffer [out]
A pointer to the buffer to receive the user's logon name. If this buffer is not large enough to contain the entire user name, the function fails. A buffer size of (UNLEN + 1) characters will hold the maximum length user name including the terminating null character. UNLEN is defined in Lmcons.h.
Im übrigen reicht ein einziges Satzzeichen. Man muss nicht immer drei hinschreiben, sowas nervt nur beim Lesen. Es kommt sehr kindisch rüber.
Grüssli
-
ohh jawoll ! DAAANKE ! vielen vielen dank das ihr mir geholfen habt ! Echt Klasse dieses Forum ! es gibt nur noch eine Funktionsbeeinträchtigung : Das Kopieren des Bildes Funktioniert nicht ! Da sProggi läuft fehlerfrei durch jedoch wird das bild einfach nciht kopiert ! auch als ich den pfad gekürzt hab : (von C:/ordner/bild.jpg nach C:/bild.jpg) passierte nichts ! wenn ich textdateien kopieren will klappt es auch nicht . Was kann man da machen ?