C++Builder->"Variabel"-Speichern



  • Wie kann ich es realisieren das mein Program für jeden unterschiedlichen Namen eine neute Textdatei speichert, bisher siehts bei mir so aus..

    AnsiString letter=lb_letter->Caption;
    AnsiString name=(ed_nname->Text&ed_vname->Text);
    fstream f(\\data\"&letter&"\"&name".txt",ios::out|ios::in);

    Bei z.B. dem Namen: Max Mustermann soll es wiefolgt ablaufen
    name=MustermannMax
    letter=M
    und soll dann gespeichert werden in: ~verzeichniss des programm\*M*\*MustermannMax*.txt

    Wie mach ich das am besten 😞

    CompilerFehler: [C++ Fehler] eintrag.cpp(85): E2015 Mehrdeutigkeit zwischen '_fastcall Variant::operator bool() const' und '_fastcall Variant::operator __int64() const'



  • Kannst Du den Code mit Code-Tags posten? (Ist '&' ein Feh&ler o&der e&&in Ko&nve&rtie&&rungsproblem?)

    weiterhin:
    - Strings mit +-Operator zusammenfügen.
    - Unterverzeichnisse anlegen lassen.



  • Hallo

    Der &-Operator ist dafür nicht zuständig, sondern der +-Op.

    AnsiString letter=lb_letter->Caption;
    AnsiString name= AnsiString("\\data\\letter\\") + ed_nname->Text + ed_vname->Text + ".txt";
    fstream f(name.c_str(),ios::out|ios::in);
    

    Und bitte beachten : sfds

    bis bald
    akari



  • Danke für die schnelle Antwort!
    Habs auch gleich ausprobiert, der Compiler zeigt nun keine Fehler mehr an, jedoch wenn ich es probiere läuft es schief 😕

    AnsiString letter=lb_letter->Caption;
    AnsiString name= AnsiString("\\data\\letter\\") + ed_nname->Text + ed_vname->Text + ".txt";
    fstream f(name.c_str(),ios::out|ios::in);
    if (f.good())
     for (int i=0;i<=memo_datensatz->Lines->Count-1;i++)
      f<<memo_datensatz->Lines->Strings[i].c_str()<<endl;
     else
      ShowMessage("Fehler");
     f.close();
    

    Also ich bekomm immer die Meldung fehler.
    Aber was stimmt den nun mit dem Stream nicht? Die unterordner hab ich schon angelegt...
    Und eine Frage zu Zeile 2 -> erkennt das programm "letter" als variable? oder als text bzw string?



  • Hallo

    Ich empfehle dir erstens deinen Code ordentlich einzurücken und zu klammern. Hat zwar keine funktionale Auswirkung, aber sieht doch schon übersichtlicher aus

    AnsiString letter=lb_letter->Caption;
    AnsiString name= AnsiString("\\data\\letter\\") + ed_nname->Text + ed_vname->Text + ".txt";
    fstream f(name.c_str(),ios::out); // Brauchst sicher nur out, kein in
    if (f.good())
    {
      for (int i=0;i<memo_datensatz->Lines->Count;i++) // Ist mit < besser zu lesen als mit <= -1
        f<<memo_datensatz->Lines->Strings[i].c_str()<<endl;
    }
    else
    {
      ShowMessage("Fehler");
    }
    // f.close(); // Brauchst du nicht, macht fstream am Ende selber
    

    Der Fehler kommt weil fstream die angegebene Datei nicht öffnen/erstellen kann. Vermutlich weil das angegebene Verzeichnis nicht vorhanden ist.

    bis bald
    akari



  • Warum überhaupt streams?
    Memo1->Lines->SaveToFile() ist einen Blick wert...

    letter ist eine Variable vom Typ AnsiString.



  • Verzeichnisse müssten alle vorhanden sein denn
    in dem ordner wo der builder das projekt speichert, also da wo auch die exe liegt, ist der ordner "data" und in dem sind alle ordner von "A" biz "Z"...



  • Aha, und woher soll das Programm wissen, dass Du die Pfadangabe relativ zum Ausführungspfad der EXE angibst?

    Mit DirectoryExists() oder FileExists() kannst Du überprüfen, ob ein bestimmtes Verzeichnis oder eine bestimmte Datei existieren.

    [Edit] Und in ed_nname steht auch nur ein einzelner Buchstabe?!?



  • Joe_M. schrieb:

    Warum überhaupt streams?
    Memo1->Lines->SaveToFile() ist einen Blick wert...

    letter ist eine Variable vom Typ AnsiString.

    Hab es damit mal ausprobiert, dann kam "Datei\data\letter\MustermannMax.txt konnte nicht erstellt werden.
    demnach hat das programm "letter" als "letter" angesehen und nicht als "M"
    aber hab auch nen ordner namens "letter" in "data"
    jetzt versteh ich nicht warum er nicht klappt

    und ne frage so am rande, was ist der unterschied zwischen string und ansistring?
    in der schule lernen wir nur pascal und bin daher in c++ ganz neu und mich da am durchmogeln

    edit: Und wie verwende ich dieses DirectoryExists() oder FileExists()?

    in ed_nname steht der ganze nachname, der einzelne buchstabe steht in lb_letter..



  • AnsiString letter=lb_letter->Caption.SubString(1,1); // nur ersten Buchstaben verwenden
    AnsiString name= ExtractFilePath(Application->ExeName) + "\\data\\" + letter + "\\" + ed_nname->Text + ed_vname->Text + ".txt";
    

    Wenn Du letter als Variable verwenden willst, musst Du letter auch als Variable verwenden. Direkt in einem Stringliteral wird letter natürlich nicht als Variable interpretiert.



  • vielen vielen dank Joe_M. 🙂
    funktioniert jetzt mit dem savetofile
    lass das stream dann jetzt aussen vor
    danke für die hilfe! 👍


Anmelden zum Antworten