char in Array speichern
-
Nimm für die Zeile std::string und für das Array std::vector (also std::vectorstd::string), dann erübrigen sich gleich einige Probleme, wie z.B. deine Zuweisung.
-
dann erkläre ich das noch mal ausführlicher:
ich habe mehrere chars:
char str1[30] = "Das ist ein" char str2[30] = "kleiner Test" char str3[30] = "zur Veranschaulichung" char str4[30] = "Punkt Ausrufezeichen"Jetzt möchte ich gerne str2 und str4 (irgendwo) speichern, um Sie später wieder abzurufen. Soll dann auch nicht mehr str1-4 heißen. Dachte da an ein Array. Denke mal das ist ein einfaches Problem, nur kenne ich die beste Vorgehensweise nicht.
-
Die beste Vorgehensweise wurde bereits genannt:
vector<string> lines; lines.push_back("Das ist ein"); lines.push_back("kleiner Test"); // Du kannst auch schon bemi Erstellen des Objekts zwei Zeilen anlegen: vector<string> lines(2); lines[0] = "Das ist ein"; lines[1] = "kleiner Test";Du hast keine Buffer Overflows mehr (da sich die Größe eines std::string automatisch anpasst), Kopiersemantik (string1 = string2 funktioniert, nicht so wie bei rohen C-Strings, wo du strcpy brauchst) und keinen Aufwand mit der Speicherverwaltung, den du hast, wenn du auf dynamische C-Strings umsteigst.
-
Danke erstmal für die viele Hilfe !
Bei mir heißt str aber immer Zeile und nicht str1 oder str2...Dies liegt daran
das ich ein Textdokument zeilenweise einlese. Auch der Zeilentext ist immer anders. Möchte zum Beispiel die oben genannten Zeilen einlesen und immer wenn ein A drin vorkommt soll er die Zeilen speichern. Irgendwann schreibe ich diese Zeilen dann nochmals in ein Text-File. Geht es auch so:Einlesen tue ich so:
int CCv::E( char *FileName, char *PreFileName ) { FILE * fpIn, * fpOut; char Zeile[300], while (( fgets( Zeile, 200, fpIn )) != NULL ) { ??? fprintf( fpOut, "%s", Zeile ); } fclose( fpIn ); fclose( fpOut ); return 1; }und dort wo die drei Fragezeichen sind soll hat die Abfrage rein. Kommt irgendwas in der Zeile vor? Wenn ja speichern in lines.
-
FILEist auch C-Stil. Womit lernst du C++?Ich würd der Funktion im folgenden Code gerne einen schönen Namen geben, aber unter
CCv::Ekann ich mir beim besten Willen nichts vorstellen. Du solltest sprechende Namen verwenden.vector<string> lines; ifstream in("dateiname.txt"); string line; while(getline(in, line)) { if(line.find('A') != string::npos) lines.push_back(line); }Hier gibts ne gute C++-Referenz, in der du Funktionen nachschlagen kannst, die du nicht kennst. Aber du solltest dir auch ein Buch schnappen, um diese Grundlagen zu lernen.
-
Hallo Michael,
habe leider ein Programm übernehmen müssen, welches schon in C geschrieben ist.
Muss halt nur dieses Problem einbauen. Danke für die Reference, da muss ich mich am Wochenende wohl nochmal hinsetzen !Nur eins noch:
Wie kann ich die Zeile in die Textdatei schreiben ?vector<string> lines; ifstream in("dateiname.txt"); string line; while(getline(in, line)) { if(line.find('A') != string::npos) lines.push_back(line); }Ich bin erstaml bei dem C-Stil geblieben und füge in meine Abfrage folgendes ein:
fprintf( fpOut, "%s", lines );Nur leider kommt da der Fehler:
"Der Vorgang READ konnte auf dem Speicher nicht ausgeführt werden" ??
-
Du kannst C (fprintf) und C++ (vector) nicht mischen und erwarten, dass dies funktioniert.
-
Ich konnte mir ja fast schon denken, dass dies daran liegt !

Wie funktioniert dies in C++ ?
-
Du kannst das schon mischen, du solltest nur nicht erwarten, dass etwas funktioniert was keinen Sinn ergibt.
Wenn du aus deinem
vectoreinenstringmitprintfausgeben willst dann musst du dir zuerst denstringholen, das kannst du zum Beispiel mit der Methodeat(position). Und danach musst du eine Methode aufrufen, die einen C-String aus dem String zurück gibt. Die trägt den treffenden Namec_str().printf("%s", lines.at(0).c_str()); // besser cout << lines.at(0);0 ist das erste Element im
vectorund so weiter bislines.size() -1.
-
Danke dir...Funktioniert wirklich super ! Allerdings wollte ich mich gestern mal
belesen, aber sowas finde ich ihn keinem meiner C++-Bücher:lines.at(i).c_str()Also kann man das auch nicht zu Grundlagen zählen, oder ?
-
Was meinst du, die Verkettung von den Methoden? Man kann zumindest das Verständnis dafür als Grundlagen auffassen.
at(i)→ gibt eine Referenz vom Typ (bei dir)stringzurück, dass sollte soweit klar sein und kann als Grundlage [Objekt,Referenz,Methode] gesehen werden.
Das Objekt vom Typstring, stellt aber wieder eigene Methoden (zB.c_str()) zur Verfügung. Somit liegt es nahe die Operationen zusammen zufassen. Das was du sicher kennst und für dich am Anfang deutlicher ist, ist das speichern desstringauf ein temporäres Objekt und damit weiter zu arbeiten.std::string temp = lines.at(0); temp.c_str();Im Normalfall gibt das auch kein Problem, weil der Compiler das Zwischenobjekt für dich weg optimieren kann. Wenn du aber eine Klasse mit eigenen Kopierkonstruktor hast, dann weiß der Compiler nicht, was beim Kopieren alles vor sich geht und kann nicht einfach annehmen, dass dort nichts wichtiges passiert. Ausnahme ist, der Kopierkonstruktor ist
inline.inlineselber ist aber so eine eigene Sache die nur schwer beeinflussbar ist. Außer du schreibst nur Einzeiler, da wird der Compiler wohl kaum um dasinlinerum kommen.
Auch sieht es oft schöner aus, wenn man keine temporären Hilfsobjekte im Code hat.