streams: Dateiname per eingabe festlegen

TheDuke1984

Grünschnabel
Hallo,

Ich will mit streams einen beliebigen dateiname (txt)erzeugen lassen
weis aber nicht wie ich das umsetzen soll:
So sieht mein verusuch aus:

wäre super wenn ihr mir helfen würdet !!
Danke schon im vorraus
....

string name;

cout <<"Name der Datei eingeben"<<endl;
cin >>name;
name = "c:\\" + name +".txt";

cout <<name<<endl;

mesk.open (name,ios::out|ios::app|ios::binary);
mesk.close();

...


Ich weis nicht was ich im open befehl schreiben muss damit er mir die erzeugte variablen-datei dorthin ünernimmt
 
Mit Mingw bekomme ich als Fehlermeldung, dass keine passende Funktion gefunden werden kann. Open() nimmt keine Strings als Paramter an, aber CStrings werden akzeptiert. Mit der Methode c_str() kannst du ganz einfach einen String in ein CString umwandeln.
Also sieht's dann so aus:
C++:
mesk.open (name.c_str(),ios::out|ios::app|ios::binary);
Sollte so klappen, aber womöglich gibts noch eine elegantere Möglichkeit(?).
 
Super danke das hat so geklappt :)

hätte noch ne zweite frage

Ich will das mein Programm überprüft ob die datei schon vorhanden ist und wenn nicht wird sie erzeugt und es wird etwas rein geschrieben

Hier mein versuch:
...
fstream mesk;
string schirm;

cout <<"Name der Datei eingeben die erzeugt werden soll"<<endl;
cin >>name;
name = "c:\\" + name +".txt";

if (!name.c_str()){
cout <<name<<endl;
mesk.open (name.c_str(),ios::out|ios::app|ios::binary);
mesk.close();

cout <<"Datei erzeugt"<<endl;
mesk.open (name.c_str(),ios::in|ios::out|ios::trunc|ios::binary);

mesk <<"Programmieren ist 1 Prozent Inspiration und 99 Prozent Transpiration"<<endl;
mesk.seekg(0,ios::beg);

while (mesk >> schirm){
cout <<schirm<<endl;

}
}
else{
cout <<"Datei Bereits Vorhanden, es wurde nichts geaendert"<<endl ;
}

...
 
Zuletzt bearbeitet:
In deinem Quellcode ist jetzt einiges durcheinander geraten.

1.
C++:
if (!name.c_str()){
Das macht so keinen Sinn. Statt zu überprüfen, ob die Datei vorhanden ist, überprüfst du, ob der CString name == false ist. Richtig ist, die Datei zu öffnen und dann zu überprüfen, ob das Öffnen fehlgeschlagen ist. Also
C++:
mesk.open(name.c_str());
if (!mesk) {
  cout << "Öffnen Fehlgeschlagen. Datei nicht vorhanden!" << endl;
} else {
  cout << "Öffnen geglückt! Datei ist vorhanden!" << endl;
  datei.close();
}

2.
Die Parameter, die du bei open angibst sind teilweise überflüssig.
Wenn du eine fstream Objekt erzeugt hast und eine Datei mit open() lädst wird die Datei standardmässig schreibend und lesend geöffnet. ios::in|ios::out ist also überflüssig.
ios::trunc macht nur Sinn, wenn du eine bereits vorhandene Datei überschreiben willst. Wenn du eine neue Datei anlgelegt hast, ist es also überflüssig.
ios::binary solltest du nur verwenden, wenn du wirklich vorhast binäre Daten zu schreiben. In deinem Beispiel wird nur Text ausgegeben und die Angabe dieses Parameters ist überflüssig.

3.
Warum willst du die Datei lesend öffnen, wenn du sie gerade neu angelegt hast? Es macht mehr Sinn sie nur schreibend zu öffnen.

4. Willst du mit einem fstream-Objekt eine Datei öffnen, nachdem du bereits ein datei geöffnet/geschlossen hattest, musst du mesk.clear() aufrufen.
Besser ist, wenn du nur einmal die Datei öffnest.
 
Hei danke für die detailierte Antwort
ich probiers so bald wie möglich aus !

Macht alles Sinn was du geschrieben hast, ja stimmt ich hab mich au schon gewundert warum ich 2 mal mit fstream öffne , s blöde isch das des mein lehrer uns so beigebracht hat !? hab mir schon gedacht das die aufschriebe von ihm murks sind.

Irgednwie komm ich mit den Streams no net klar, hat jemand n gutes Tutorial

Cooles Forum üprigens hier !!
 
Hi, hab nochma ne kleine frage:
Ich will ein programm schreiben das mir den inhalt einer txt mit "x" überschreibt
mein versuch: (der natürlich net funktioniert)

...
mesk.open ("c:\\mesk.txt",ios::in|ios::out);
mesk.seekg (0,ios::beg);

do {
mesk.seekg (+1,ios::cur);
mesk.put ('x');

}
while (mesk.eof());
...

hab das gefühl das ich was mit dem eof net verstanden hab.
aber er sollte doch jetzt eigtnluich solang x schreiben bis er eof ereicht hat oder ?
DANKE schonmal für die Hilfe :-)
 
Hi, hab nochma ne kleine frage:
Ich will ein programm schreiben das mir den inhalt einer txt mit "x" überschreibt
mein versuch: (der natürlich net funktioniert)

...
mesk.open ("c:\\mesk.txt",ios::in|ios::out);
mesk.seekg (0,ios::beg);

do {
mesk.seekg (+1,ios::cur);
mesk.put ('x');

}
while (mesk.eof());
...

hab das gefühl das ich was mit dem eof net verstanden hab.
aber er sollte doch jetzt eigtnluich solang x schreiben bis er eof ereicht hat oder ?
es schreibt aber immer nur ein x
DANKE schonmal für die Hilfe :-)
 
Hi, hab nochma ne kleine frage:

aber er sollte doch jetzt eigtnluich solang x schreiben bis er eof ereicht hat oder ?
es schreibt aber immer nur ein x

Hihihi, da kommen die Feinheiten des Englischen zu Tage. :-)

<klugschei.ss>
dt. bis = engl. until
dt. während = engl. while
</klugschei.ss>

Dem eingedenk könnte man deine Schleife also so formulieren:
Code:
MACHE
  Positioniere Dateizeiger
  Schreibe ein "x" in die Datei
WÄHREND das Dateiende erreicht ist.

Klingt komisch, oder?

Wie wäre es mit
Code:
MACHE
  Positioniere Dateizeiger
  Schreibe ein "x" in die Datei
WÄHREND das Dateiende nicht erreicht ist.

was dann so aussähe
Code:
do {
mesk.seekg (+1,ios::cur);
mesk.put ('x');

}
while (!mesk.eof());

Klar, was ich meine?
 
danke für die schnelle Antwort

hm nein ich denke noch net ganz:
wenn ich mit " ! " schreibe dann hat es doch nie eine ende - habs auch getestet
die text datei wird immer voller aber eof wird wohl nie erreicht , ausserdem schreibt es keine x , sondern ein anderes zeichen.

Das EOF soll doch dann ereicht sein wenn der letzte buchstabe in der txt überschrieben wurde

Ausser du willst damit sagen das das mit While garnicht möglich ist !?
 
Ich würde das so machen:
C++:
    fstream mesk;
    int laenge=0;
   
    mesk.open("test.txt");
    
    //Zeichen-Anzahl bestimmen
    mesk.seekg(0, ios::end);
    laenge = mesk.tellg();
    
    //put-Zeiger auf den Anfang 
    mesk.seekp(0, ios::beg);
    
    //jedes Zeichen mit 'x' überschreiben
    for (int i=0; i<laenge; i++) {
        mesk.put('x');
    }
Nachteil ist, dass auch Steuerzeichen (z.B. Zeilenumbruch) überschrieben werden. Dafür erspart man sich die Arbeit den Lese- und Schreibzeiger immer neu zu positionieren. Denn mit dem get und put gleichzeitig zu hantieren ist etwas tricky (oder ich habe etwas falsch gemacht als ich es gerade probiert habe).

Zur While-Schleife: Du kannst eine While- Schleife benutzen, aber eine do.. While Schleife solltest du nicht verwenden. Die do... While-Schleife wird ja mindestens einmal ausgeführt. Ist die Datei leer, würde Sie mit einem Kreuz gefüllt werden. Ich denke mal, dass willst du nicht.

Zur eof()-Abfrage: Das eof-Bit wird gesetzt, nachdem bei einem Lese-Vorgang das Datei-Ende festgestellt wurde. Da du keine Lese-Operation verwendest wird das eof-Bit nie gesetzt.
Eine bessere Überprüfung (ohne eof() ) könnte so aussehen:
C++:
char Zeichen;
while ( mesk.get(Zeichen) ) {
    //...
}
Wenn du dann in der Schleife put() benutzt, kann das positionieren der Lese/schreibzeiger, wie bereits erwähnt, tricky werden.
 
Zurück