Textdatei mit iostream erzeugen



  • Hallo zusammen,

    ich brauche noch mal eure Hilfe mit iostream.

    Ich habe eine Abfrage, ob eine Text-Datei vorhanden ist, wenn sie nicht da ist, dann soll das Programm die Text-Datei erzeugen.

    Der Dateiname steht allerdings im Edit9.

    Das Anlegen mit std::ofstream("Test.txt") funktioniert.

    Wie bekomme ich statt der "Test.txt" den Text von Edit9->Text da rein???

    if(FileExists(Edit9->Text))
      {
       // Datei existiert
       ShowMessage ("Die Datendatei existiert!");
      }
    
    else
    
      {
       // Datei exisitiert nicht
       ShowMessage ("Die Datendatei existiert nicht!");
    
       // z.B. char filename = (Edit9->Text);
       std::ofstream("Test.txt");
    
       ShowMessage ("Die Datendatei erzeugt!");
      }
    


  • const char* filename = Edit9->Text.c_str(); // bei AnsiString
    // bzw.
    const wchar_t* filename = Edit9->Text.c_str(); // bei UnicodeString
    // oder
    const char* filename = Edit9->Text.t_str(); // bei UnicodeString
    

    Du solltest lernen, in die Doku zu schauen: UnicodeString (und dann z.B. weiter unter "UnicodeString Members").



  • Vielen Dank für die Antwort, ich hatte schon viel in der Hilfe gesucht.

    So funktioniert es:

    if(FileExists(Edit1->Text.c_str()))
       {
    	// Datei existiert
    	ShowMessage ("Die Datendatei existiert!");
       }
    
     else
    
       {
    	// Datei exisitiert nicht
    	ShowMessage ("Die Datendatei existiert nicht!");
    
    	std::ofstream( (Edit1->Text.c_str())   );
    
    	ShowMessage ("Die Datendatei erzeugt!");
       }
    


  • Th69 schrieb:

    const char* filename = Edit9->Text.c_str(); // bei AnsiString
    // bzw.
    const wchar_t* filename = Edit9->Text.c_str(); // bei UnicodeString
    // oder
    const char* filename = Edit9->Text.t_str(); // bei UnicodeString
    

    Du solltest lernen, in die Doku zu schauen: UnicodeString (und dann z.B. weiter unter "UnicodeString Members").

    UnicodeString uString = U"Привет мир".
    Char mtext[] = uString.t_str();

    Die Ausgabe des Char mtext erzeugt dann "???????" soetwas in der Art.

    Was soll das also bringen einen UnicodeString in einen Char zu konvertieren ?



  • Wo erhältst du denn die Ausgabe "????"?



  • DocShoe schrieb:

    Wo erhältst du denn die Ausgabe "????"?

    OK habe den Code so nicht zum laufen gebracht aber hier so läuft er und die Ausgabe ist in der ShowMessage(). Jedenfalls kommt als Ausgabe "????? ???" heraus.

    UnicodeString uString = U"Привет мир";
    char *mtext = AnsiString(uString).c_str();
    ShowMessage(mtext);

    Egal wie man den UnicodeString konvertiert in ein char,
    es kommt nicht das heraus was im UnicodeString steht.
    Deshalb ist es in meinen Augen sinnlos von Unicode nach char zu konvertieren. Wenn es doch geht wäre ich natürlich daran mal interessiert.



  • Du machst gleich zwei Fehler:

    1. der AnsiString ist temporär und der Zeiger, den c_str() zurückliefert ist ungültig. Leg´ den AnsiString aufm Stack und benutz´ dann c_str().

    2. Wenn du kein Unicode benutzt musst du eine Codepage zur Ausgabe festlegen.
      Normalerweise ist das Windows-1252, und die kann keine kyrillischen Zeichen anzeigen, daher die "??????". Wenn du AnsiStrings und kyrillisch möchtest musst du die Codepage auf Windows-1251 umstellen.
      Bei der VCL musst du den Charset des Fonts der entsprechenden Komponente auf RUSSIAN_CHARSET einstellen.



  • Ok vielen Dank.

    So gehts dann mit dem char Zeiger ?

    AnsiString Test = "Hallo Welt";
    char *mtext = Test.c_str();
    

    Wobei ich mir nicht sicher bin ob der AnsiString nun aufm Stack angelegt wird.


  • Mod

    Ahnungslos_911 schrieb:

    Wobei ich mir nicht sicher bin ob der AnsiString nun aufm Stack angelegt wird.

    Wird er. Wichtig ist aber nicht, wo er liegt, sondern dass er
    a) Noch existiert, wenn das Ergebnis des c_str-Aufrufes benutzt wird.
    b) Nicht verändert wurde zwischen c_str-Aufruf und Benutzung des Ergebnisses (oder genauer: Nur zulässige Änderungen gemacht wurden).

    a ist natürlich gewissermaßen eine Folgerung aus b, denn "Zerstörung" fällt ganz klar unter "Änderung". Da es aber so wichtig ist, habe ich es nochmal extra aufgeführt. Das ist es auch, was du falsch gemacht hast, denn das temporäre Objekt AnsiString(uString) aus deinem ersten Code lebte genau bis zum Semikolon, also nicht mehr beim ShowMessage(mtext) , das mtext zeigte dadurch zu der Zeit auf eine nicht mehr gültige Zeichenkette. Das Objekt Test aus deinem zweiten Code lebt hingegen bis zum Ende des aktuellen Codeblocks (d.h. bis die aktuelle geschweifte Klammerebene {...} aufhört). Ein eventuelles ShowMessage erfolgt hoffentlich im gleichen Codeblock.



  • das klingt alles sehr übel, ich muss noch vieles lernen bzw. solche nicht für mich unbedingt offensichtlichen Fehler vermeiden.
    Aber das geht nur wenn man es auch wirklich verstanden hat was da eigentlich passiert und genau daran hapert es, nicht immer aber doch immer wieder mal.

    Man kann also soweit wie ich es jetzt verstanden habe keine temporären-Umwandlungen an einen Zeiger weitergeben. Ich dachte da es nicht zur Laufzeit geschieht (dynamisch) kann man das so machen, denn der Codeablauf ist ja immer der selbe statische. Der char Zeiger zeigt also in dem Fall auf einen Speicherbereich der so gar nicht in der Form existiert und somit kann die Sache nicht funktionieren sobald man mit dem char Zeiger etwas anfangen will, selbst wenn es geht ist es also komplett falsch, es leuchtet ein.

    UnicodeString uString = U".911.";
    char *mtext = AnsiString(uString).c_str(); //ungültige Zuweisung an einen Zeiger
    ShowMessage(mtext);
    

Log in to reply