[C++] Frage zu char*

Blubbbbbber

Grünschnabel
Hallo Zusammen,
ich bin nicht so ganz fit in C++ und bräuchte deshalb eure Hilfe. Im Folgenden seht ihr ein Ausschnitt aus meinen Quellcode: die while-Schleife soll eigentlich nur von 1 bis 3 zählen und jeweils einen Ordner anlegen, dessen Name die jeweils aktuelle Zahl (akt. Stand des Iterators) sein soll.

Code:
...
int von = 1;
int bis = 3;
   
stringstream strstream;

char* finName1;
string name = "mkdir ";
string verz = "";
string strVon;
string test = " ";
  
while(von != bis)
{
     strstream << von;
     strVon = strstream.str();
     strstream.clear();

     verz = name + strVon;  

     finName1 = new char[verz.length()+1];
     strcpy(finName1, verz.c_str());
       
     system(finName1);
    
     von = von + 1000;

     verz = "";
     strVon = "";
  
     strcpy(finName1,test.c_str());  //test finName1 leeren
     //finName1 = "";
} 
...

Also als Ergebnis sollten die Ordner 1 2 3 angelegt werden... Momentan werden aber die Order
1
12
123 erzeugt.

Ich denke es liegt daran, dass ich die char*-Variable finName1 nicht richtig leer mache oder habe ich da sonst noch was übersehen. An den Strings dürfte es eigentlich nicht liegen, weil ich die ja noch extra am Ende der Schleife mit einem leeren String belege (sollte eigentlich nicht notwendig sein, aber sicher ist sicher ;))
 
Hi.

Also erstmal verstehe ich einige Sachen in deinem Code nicht. Warum addierst du denn da 1000 auf die von Variable? Du allozierst Speicher, den du aber nicht wieder freigibst (für eine Variable die du nicht brauchst).

C++:
const int von = 1, bis = 3;

for (int i = von; i <= bis; ++i) {
  ostringstream cmd;

  cmd << "mkdir " << i;

  system (cmd.str().c_str());
}
Gruß
 
Hi,

Hi.

Also erstmal verstehe ich einige Sachen in deinem Code nicht. Warum addierst du denn da 1000 auf die von Variable? Du allozierst Speicher, den du aber nicht wieder freigibst (für eine Variable die du nicht brauchst).

Das versteh ich auch nicht so ganz. Aber zur Lösung deines Problems.
Du musst dein Von aus dem stringstream wieder rausleiten:
C++:
strstream >> strVon;
Warum das so ist kann ich mir allerdings auch nicht erklären, da du ja ein clear auf den Stream machst. Vieleicht weiße es jemand anderst?
Ich würde es als einen Fehler in der beim Stringstream ansehn. Vieleicht auch einfach nur ein feat. ;)

Gruß Benny
 
Zuletzt bearbeitet von einem Moderator:
C++:
strstream >> strVon;
Warum das so ist kann ich mir allerdings auch nicht erklären, da du ja ein clear auf den Stream machst. Vieleicht weiße es jemand anderst?
Ich würde es als einen Fehler in der beim Stringstream ansehn. Vieleicht auch einfach nur ein feat. ;)
Die Methode clear() besitzt jeder Stream. Diese Methode setzt den Streamzustand zurück. Sie entfernt nicht etwa den Inhalt oder so. Es ist also kein Fehler - alles so wie erwartet.

Gruß
 
Zuletzt bearbeitet von einem Moderator:
Hi.

Also erstmal verstehe ich einige Sachen in deinem Code nicht. Warum addierst du denn da 1000 auf die von Variable? Du allozierst Speicher, den du aber nicht wieder freigibst (für eine Variable die du nicht brauchst).

Also das mit dem 1000 addieren ist natürlich hier Unsinn; ich habe für die Frage
den Quellcode einfachheitshalber etwas modifiziert und dabei die Zahl 1000 vergessen; für das Beispiel hier müsste es natürlich "... von++ ..." heißen.

Ansonsten funktioniert dein Beispiel einwandfrei. Du hast mir wirklich sehr geholfen, dafür noch mal vielen Dank :)
 
Hallo Mädels,

ich habe Euren Thread mit Interesse gelesen, aber wenn ich Eure Ratschläge befolge, die ihr gegeben habt, und versuche folgenden Code auszuführen,

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main () {
// insert code here...
stringstream strstream;
string eins ="toll";
string dummy;
int n=5;
strstream << eins << n;
cout << strstream.str() << endl;
int m=6;
strstream.clear();
strstream>>dummy;
cout << strstream.str() << endl;
strstream << eins << m;
cout << m << endl;
cout << strstream.str() << endl;

return 0;
}

dann bekomme ich folgende Ausgabe:

toll5
toll5
6
toll5

Obwohl ich beim den letzten drei Ausgaben gerne dreimal eine sechs gesehen hätte. Wisst ihr, was ich flasch mache? Wie macht man es richtig?

Schönwettergrüße!
 
Zuletzt bearbeitet:
Hallo,

um einen Ausgabe-Stringstream wiederverwenden zu können, muss man die Einfügeposition an den Anfang setzen.
Jede Ausgabe muss dann auch mit "ends" abgeschlossen werden, weil sonst evt. Reste der vorherigen Belegung ausgegeben werden (falls der alte String länger war).
C++:
ostringstream strstream;
string eins ="toll";

int n=5;
strstream << eins << n;
cout << strstream.str() << endl;

int m=6;
strstream.seekp(0);             // Einfügeposition an den Anfang
strstream << eins << m << ends; // Ausgabe mit "ends" abschließen
cout << strstream.str() << endl;
Gruß
MCoder
 
Zurück