Datei beim speichern vom Benutzer gewählten Namen geben



  • Also ich möchte eine Datei speichern.
    Der Benutzer kann sich die Dateiendung selber aussuchen...
    Erstmal mein Code:

    cout << "Dateiendung(odt=1;txt=2): " << endl;
    	int d;
    	cin >> d;
    	switch(d)  {
    		case 1:
    	f.open("test.odt",ios::out);
    	break;
    		case 2:
        f.open("test.txt",ios::out);
    	break;
    		default:
        cout << "Ungültige Dateiendung!" << endl;
    	break;
    	}
    

    Wie kann ich nun den Namen jedes mal ändern.
    Also wieder eine "cout-Abfrage" ,in string --> nun habe ich den Namen.
    Aber ich kann dann doch keine Variable zwischen den Anführungszeichen einbauen.
    Also dieses "test" soll der Benutzer jedesmal frei wählen können und er soll sich selber einen Namen ausdenken...daher fällt eine switch-case Variante aus.

    mfg
    Summernoon



  • Hey Ya

    Naja, dein Benutzer könnte einfach den ganzen Namen eintippen...

    #include <fstream> 
    #include <iostream> 
    #include <string>
    
    using namespace std;
    
    int main() {
        cout << "Bitte Dateinamen eingeben: ";
        string name;
        cin >> name;
    
        fstream file(name.c_str());
    
        return 0;
    }
    

    Die Endung anzuhängen geht mit einem C++ string allerdings ebenfalls denkbar einfach:

    name += ".txt";
    

    Da seh' ich wirklich kein Problem...



  • Danke für die schnelle Antwort;funktioniert.

    Habe allerdings noch 2 Fragen zum Verständnis:
    1)gibt

    c_str()
    

    an, dass nach dem Punkt im Namen die Dateiendung folgt ?

    2)Wodurch unterscheiden sich diese beiden Varianten:

    fstream file(name.c_str());
    

    und

    f.open("test.txt",ios::out);
    

    Jetzt wird keine Datei mehr erstellt.

    mfg
    Summernoon



  • Summernoon schrieb:

    Habe allerdings noch 2 Fragen zum Verständnis:
    1)gibt

    c_str()
    

    an, dass nach dem Punkt im Namen die Dateiendung folgt ?

    Nein. c_str() ist eine Funktion der Klasse std::string und liefert einen const char* zurück, für die Aufrufe die nicht mit std::string laufen. Die Dateiendung wird vorher z.b. wie folgt angehangen:

    std::string datei = "test";
    datei += ".txt"; // std::string erlaubt direktes "aufaddieren" von Strings
    

    Summernoon schrieb:

    2)Wodurch unterscheiden sich diese beiden Varianten:

    fstream file(name.c_str());
    

    und

    f.open("test.txt",ios::out);
    

    Dadurch das das eine C ist, und das andere C++ (Unter C++ verwendet man die Streamklassen).

    cu André



  • asc schrieb:

    Summernoon schrieb:

    2)Wodurch unterscheiden sich diese beiden Varianten:

    fstream file(name.c_str());
    

    und

    f.open("test.txt",ios::out);
    

    Dadurch das das eine C ist, und das andere C++ (Unter C++ verwendet man die Streamklassen).

    Lass Dir keinen Unfug erzählen. fstreams und vor allem die c_str-Methode habe ich in C noch nicht gesehen (ja ich weiß, asc hat sich vermutlich nur verlesen :D)

    Das erste erzeugt einen fstream "file" und eröffnet gleich eine Datei. Dabei wird der Dateiname aus der Variablen "name" entnommen. Die Datei wird zum Lesen und Schreiben geöffnet, aber nicht erzeugt, falls sie noch nicht existiert.

    Die zweite Variante öffnet eine Datei auf einem bereits vorher angelegten fstream "f", nimmt dabei den fest verdrahteten Dateinamen "test.txt" und eröffnet die Datei nur zum Schreiben, wobei sie auch erzeugt wird, wenn sie nicht existiert.



  • Danke für die Antworten.

    EDIT: Ich habe

    #include<string>
    

    .

    1)Das mit

    .c_str()
    

    ist mir immer noch nicht klarer geworden.

    2)kann man die Dateiendung auch als Variable machen ?
    theoretisch so:

    name += endung;
    

    (klappt so auf jeden fall nicht)

    3)kann ich die Zeile so ändern ?

    f.open(name.c_str());
    f << stringMitText << endl;
    f.close();
    

    --> Es soll eine Datei erstellt werden.

    mfg
    Summernoon[/cpp]



  • .c_str () gibt dir einen C-String zurück, da gewisse Funktionen einen solchen erwarten und keinen std::string.

    Zu den anderen Problemen würde es sicher helfen <string> zu inkludieren. (Wie schon erwähnt).



  • es gibt ja folgende möglichkeiten:

    char* test0 = "test mit charpointer";
    char test1[] = "test mit chararray";
    std::string test2 = "test mit string0";
    std::string test3("test mit string1");
    

    ist das einleuchtend?
    einmal ein char pointer der auf eine zeichenkette aus chars zeigt
    ein char array das zeicehn beinhaltet
    und der STanDart string mit 2 verschiedenen konstruktoren

    wenn man nun eine zeichenkette in einer funktion haben will
    kann man folgendes machen:

    #include <string>
    
    void testfunc0(std::string const& teststring)
    {
        // bla bla bla...
    }
    
    void testfunc1(char *test)
    {
        // bla bla bla...
    }
    
    int main()
    {
        char* test0 = "test mit charpointer";
        char test1[] = "test mit chararray";
        std::string test2 = "test mit string0";
        std::string test3("test mit string1");
    
        testfunc0(test2);    // geht
        testfunc0(test3);    // geht auch
       testfunc0(test0);     // geht nicht und auch testfunc0(&test0) wird nicht klappen
       testfunc0(test1);     // geht auch nicht
    
        testfunc1(test0);    // geht
        testfunc1(test1);    // geht auch
       testfunc1(test2);     // klappt nicht
       testfunc1(test3);     // klappt auch nicht
    
        testfunc1( test2.c_str() );  // geht
    }
    

    ergo ist die string methode c_str() dazu da um aus einem STanDart string eine charpointer/chararray zeichenkette zu machen(ok sind eh nur zeiger;))

    denn viele (alte) funktionen erwarten einen char zeiger auf eine zeichenkette...

    zu deiner zweiten frage:

    ja man kann das natürlich als dateiendung machen...

    aber wenn du die beide separat abfragst kansnt dud ich fragen obs nicht sinnvoller wäre wenn du sie in einem schritt holst

    #include <string>
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        string name, endung;
        cout<<"Dateiname: ";
        cin>> name;
        cout<<"Dateiendung: ";
        cin>> endung;
    
        string ganzername;
        ganzername = name + ".";
        ganzername = ganzername + endung;   // += verwende ich deshalb nicht weil ich nicht weis ob es den operator gibt, sprich ob er überladen ist ;)
    
        ostream out;
        out.open(ganzername.c_str(), ios::out | ios::in);  // kA ob das richtig ist, ich hab bis jez nix mit dateien zu tun gehabt
    }
    

    so sollte das ungefähr klappen


Anmelden zum Antworten