QString in char umwandeln
-
Hallo,
Ich würde gern einen Funktion schreiben die als Eingang einen QString hat und den String dann als char zurückgibt. Folgendes hab ich probiert:char Project::QStringtoChar(QString in){ int in_L=in.length(); char in_char[in_L]; for(int i=0;i<in_L+1;i++) in_char[i]=in.toStdString()[i]; return in_char[in_L]; }
Aber leider funktioniert das nicht.
Weiß jemand was ich da falsch gemacht hab?
schönen Gruß,
Michael
-
Das kann nicht gehen, QString ist eine Zeichenkette, char ist ein einzelnes Zeichen.
edit: Und es sind noch 2 weitere Fehler drin. Die Größe eines C-Arrays muss zur Compile-Zeit bekannt sein und du würdest auf ein ungültiges Element zugreifen (inchar[in_L]).
-
QString hat die methode "at", welches ein QChar zurückliefert...
ahja und dann QChar.toLatin1() => char
-
Danke für die Antworten
@Badestrand
Wenn ich lediglichQString in; int in_L=in.length(); char in_char[in_L]; for(int i=0;i<in_L+1;i++) in_char[i]=in.toStdString()[i];
verwendefunktioniert die Umwandlungohne Probleme (oder hab ich da etwa etwas übersehen was an derFunktionalität nichts ändert aber trotzdem Probleme verursachen könnte?)
Da ich die Funktion öfter brauche ist mein Ziel folgendes zu realisieren:
QString in; char out[128]; out=in.QStringtoChar(in);
Also nur eine Zeile in der die Funktion aufgerufen wird.
Ich stehe gerade am Anfang beim C++ Programmierenund bitte daher um Nachsicht wegen meinen blöden Fragen
-
Du willst den QString also nicht in ein char, sondern in ein char-Array umwandeln
Probiers mal so:
void Project::QStringtoChar( QString in, char* dst, int maxlen ){ int len = in.length() + 1; if ( len > maxlen ) ; // Irgendwie drauf reagieren, passt jedenfalls nicht rein. for ( int i=0; i<len; i++ ) dst[i] = in.toStdString()[i]; } QString in; char out[128]; QStringtoChar( in, out, 128 );
edit:
Oder noch einfacher:void Project::QStringtoChar( QString in, char* dst, int maxlen ){ int len = in.length() + 1; if ( len > maxlen ) ; // Irgendwie drauf reagieren, passt jedenfalls nicht rein. // Hier wird einfach nur der Speicher rüberkopiert. "toStdString" gibt einen "std::string" zurück, der // eine Methode "c_str()" besitzt, die einen "const char*" zurückgibt. memcpy( dst, in.toStdString().c_str(), len ); }
-
Darf ich fragen, warum du keinen std::string oder weiterhin QString benutzen willst, sondern ein char-Array brauchst?
-
Danke für die Hilfe....funktioniert wunderbar.
Ich brauch das ganze für das zeichenweise Lesen und Schreiben von Text-Dateien
Aber eigentlich bin ich derzeit noch am rumprobieren um herauszufinden wie es am besten geht.
-
qPrintable() tut es auch
-
Michael123 schrieb:
Danke für die Hilfe....funktioniert wunderbar.
Ich brauch das ganze für das zeichenweise Lesen und Schreiben von Text-Dateien
Aber eigentlich bin ich derzeit noch am rumprobieren um herauszufinden wie es am besten geht.Dann zeig doch mal, was du so hast bei der Datei-Verarbeitung
-
Michael123 schrieb:
Ich brauch das ganze für das zeichenweise Lesen und Schreiben von Text-Dateien
Darf ich mal deine Schreib/Lesefunktion sehen, und zudem den Grund erfahren, warum du es Zeichenweise lesen/schreiben willst?
cu André
-
Hier mal mein (wahrscheinlich viel zu komplizierter) Code für eine Benutzerregistrierung:
void UserReg::writeFile() { FILE * pFile; int Username_L=Username.length(); int Password_L=Password.length(); int Forename_L=Forename.length(); int Surname_L=Surname.length(); int Location_L=Location.length(); int Email_L=Email.length(); int Phone_L=Phone.length(); int Note_L=Note.length(); char Forename_char[Forename_L]; char Surname_char[Surname_L]; char Username_char[Username_L]; char Password_char[Password_L]; char Location_char[Location_L]; char Email_char[Email_L]; char Phone_char[Phone_L]; char Note_char[Note_L]; for(int i=0;i<Username_L+1;i++) Username_char[i]=Username.toStdString()[i]; for(int i=0;i<Password_L+1;i++) Password_char[i]=Password.toStdString()[i]; for(int i=0;i<Forename_L+1;i++) Forename_char[i]=Forename.toStdString()[i]; for(int i=0;i<Surname_L+1;i++) Surname_char[i]=Surname.toStdString()[i]; for(int i=0;i<Location_L+1;i++) Location_char[i]=Location.toStdString()[i]; for(int i=0;i<Phone_L+1;i++) Phone_char[i]=Phone.toStdString()[i]; for(int i=0;i<Email_L+1;i++) Email_char[i]=Email.toStdString()[i]; for(int i=0;i<Note_L+1;i++) Note_char[i]=Note.toStdString()[i]; QString Filename=getUserHome()+"/Userdata.txt"; int Filename_L=Filename.length(); char Filename_char[Filename_L]; for(int i=0;i<Filename_L+1;i++) Filename_char[i]=Filename.toStdString()[i]; pFile = fopen (Filename_char,"w"); fprintf (pFile, "%s \n \n","<User Registration>"); fprintf (pFile, "<Username> %s %s \n",Username_char," </Username>"); fprintf (pFile, "<Password> %s %s \n",Password_char," </Password>"); fprintf (pFile, "<Forename> %s %s \n",Forename_char," </Forename>"); fprintf (pFile, "<Surname> %s %s \n",Surname_char," </Surname>"); fprintf (pFile, "<Location> %s %s \n",Location_char," </Location>"); fprintf (pFile, "<Phone> %s %s \n",Phone_char," </Phone>"); fprintf (pFile, "<Email> %s %s \n",Email_char," </Email>"); fprintf (pFile, "<Note> %s %s \n \n",Note_char,"</Note>"); fprintf (pFile, "%s \n","<End of File>"); fclose (pFile); }
Ich musste QStrings verwenden da ich mit Qt arbeite und aus den lineEdits nur QStrings rausbekomme.
-
Michael123 schrieb:
...
Ich brauch das ganze für das zeichenweise Lesen und Schreiben von Text-Dateien...Geht prima mit string. (Nachtrag: ... und mit fstream)
Michael123 schrieb:
...
Aber eigentlich bin ich derzeit noch am rumprobieren um herauszufinden wie es am besten geht.Dann ist JETZT die Zeit gekommen, es mit string (Nachtrag: ... und mit fstream) zu probieren.
Gruß,
Simon2.
-
Simon2 schrieb:
Dann ist JETZT die Zeit gekommen, es mit string zu probieren.
Dacht mir schon,d ass es irgendwie geht.
Hast eventuell auch nen kleinen Denkanstoß wie es geht da ich bisher noch nix gefunden hab
-
#include <fstream> void UserReg::writeFile() { QString Filename=getUserHome()+"/Userdata.txt"; std::ofstream file( Filename.toStdString().c_str() ); file << "<User Registration> " << " " << std::endl << " " << std::endl; file << "<Username> " << Username.toStdString() << " </Username> " << std::endl; //... file << "<End of File> " << std::endl; }
edit: Und wenn du noch global einen Operator überlädst, kannst du dir ein paar mal "toStdString()" sparen:
// Über "UserReg::writeFile" std::ofstream& operator<<( std::ofstream& o, const QString& s ) { o << s.toStdString(); return o; } // Und dann halt file << "<Username> " << Username << " </Username> " << std::endl;
-
Wow danke für den Code....Ich merk schon...es is noch ein langer Weg bis ich mich in C++ ähnlich gut zurechtfindenw erde wie in Java (bin vor 3 Wochen umgestigen)
Danke für die Hilfe!!
-
Michael123 schrieb:
Wow danke für den Code....Ich merk schon...es is noch ein langer Weg bis ich mich in C++ ähnlich gut zurechtfindenw erde wie in Java (bin vor 3 Wochen umgestigen)
Mein Weg war auch ziemlich lang, am Anfang auch sehr gebremst durch zuviel C-Code, mittlerweile geht's aber
Michael123 schrieb:
Danke für die Hilfe!!
No problemo Senoré
-
Michael123 schrieb:
Wow danke für den Code....Ich merk schon...es is noch ein langer Weg bis ich mich in C++ ähnlich gut zurechtfindenw erde wie in Java (bin vor 3 Wochen umgestigen)...
Obacht: Anscheinend gibt's irgendwelche "C++ für Javaisten"-Hilfen, die die Ärmsten immer zuerst auf eine char*-/File*-/Alles-müssen-Zeiger-sein-/...-Schiene hetzen. (vermutlich Java-Marketingfritzen
)
Deswegen mein Tipp: Eine gute Wissensquelle ist die C++-StandardLib (besonders: string, Container, Streams und Algorithms) - und nur das, was es da nicht gibt, muss man selber machen.
Z.B. einzusehen unter www.cppreference.com (kurz und knapp) oder http://www.cplusplus.com/Gruß,
Simon2.
-
Warum hast du den nen QString? Wenn du sowieso ne QT Anwendung schreibst, dann bleib auch beim QString und mach nicht unnötige Konvertierungen in std::string (der kann so nur weniger), sondern schau dir lieber mal QFile und QTextStream an.