Frage zu Arrays



  • Hallo zusammen,

    vorab, ich bin absoluter Anfänger. Bin jetzt vor 2-3Wochen in C++ eingestiegen. Finde auch alles soweit recht gut. Nutze den Borland C++ Builder 1.0 Standart. Die anderen kann ich mir nicht leisten.

    Zu meiner Frage. Ich arbeite natürlich mit der Entwicklungsumgebung. Ich will aus drei Eingabe Felder eine Datei abspeichern. Alle Informationen die im Eingabefeld stehen sollen dann auch in der txt datei stehen. Später sollen sie auch wieder ausgelesen werden. Bzw. bei belieben immer wieder erweitert werden. Ohne das die anderen Zeilen darüber gelöscht werden. Hier mal mein Ansatz. Komme aber jetzt irgendwie nicht weiter!

    const String dateiname="projekttage.kpt";
        TStringList *ausgabe;
        ausgabe=new TStringList;
        String ausgabe[3];
    
        ausgabe->Add (thema->Text);
        ausgabe->SaveToFile(dateiname);
    

    Auch schön wäre wenn mir jemand sagen kann das ich eine Datei erstelle aus einer Variable. Also ich habe ein Eingabefeld dort schreibt man hallo rein nun soll die erstelle datei wo hallo und andere dinge drin stehen noch hallo.txt heißen. Wie kann ich das machen.

    Gruß
    Ursa


  • Mod

    Hallo

    zb so

    AnsiString dateiname = "C:\\temp\\xxx.yyy"
    ausgabe->SaveToFile(dateiname.c_str());
    

    Mfg
    Klaus



  • Hallo

    du darfst auch nicht einen Symbolnamen doppelt vergeben

    TStringList *ausgabe;
    String ausgabe[3];
    

    desweiteren ist

    Komme aber jetzt irgendwie nicht weiter!

    keine Fehlerbeschreibung/Frage.

    bis bald
    akari



  • Hi,

    okay stimmt. So kann man mir nicht helfen.

    Wie gesagt, ich habe drei Felder wo ich eine eingabe tätigen kann. Dann habe ich einen Button, der diese drei eingaben in eine datei speichern soll. Einen Wert kann ich speichern. Die anderen 2 aber nicht. Wenn ich eine neue Eingabe mache. Dann wird der alte Eintrag überschrieben. Das soll auch nicht sein. Wie kann ich das jetzt bewerkstelligen, dass ich alle drei einträge speichern kann und darunter wieder neue. Später möchte ich das dann auch wiederauslesen können.

    Ich bin soweit, das ich weiß, das ich Arrays dafür brauche. Weiß aber nicht so genau wie ich sie richtig einsetze. Mein bisheriger Code.

    const String dateiname="projekttage.txt";
        TStringList *ausgabe;
        ausgabe=new TStringList;
        ausgabe->Add (thema->Text); //hier sollen noch zwei weitere Felder in der gleichen Zeile eingetragen werden!
        ausgabe->SaveToFile(dateiname);
    


  • Hallo

    wo liegt das Problem?

    ausgabe->Add (thema->Text); // Wert von Control thema wird eingetragen 
    ausgabe->Add (thema2->Text); // Wert von Control thema2 wird eingetragen
    ausgabe->Add (thema3->Text); // Wert von Control thema3 wird eingetragen
    ausgabe->SaveToFile(dateiname); // Alles zusammen speichern
    

    bis bald
    akari



  • Richtig. Das geht. Aber es sollen jetzt noch weitere Daten in die Datei geschrieben werden. Sprich. Ich leere meine Eingabefelder schreibe etwas neues hinein und jetzt soll das auch in der Datei stehen. Wie geht sowas denn.



  • Hallo

    indem du die bestehende Datei vorher einliest

    TStringList *ausgabe;
    ausgabe=new TStringList;
    ausgabe->LoadFromFile(dateiname); // bestehenden Dateiinhalt einlesen
    ausgabe->Add (thema->Text);
    ausgabe->SaveToFile(dateiname);
    delete ausgabe; // nicht vergessen !
    

    bis bald
    akari



  • Hi,

    gut okay. Hätte mir auch selber einfallen können. Aber mal noch eine Frage zu dieser Thematik. Ich trage nun in die Textdatei jeweils immer drei neue Daten ein. Diese Daten gehören an sich zusammen. Wie kann ich es jetzt machen das ich diese drei zusammenhängenden Daten wieder zusammen auslesen kann?



  • Hallo

    da lädts die Datei in eine TStringList. Dort kannst du die Zeilen mit dem Array TStringList->Strings[] von 0 bis TStringList->Count durchgehen. Da bei die immer drei Zeilen zusammengehören, kannst du also immer drei Zeilen einem Eintrag zuordnen.

    bis bald
    akari



  • KlausB schrieb:

    ausgabe->SaveToFile(dateiname.c_str());
    

    Wieso ".c_str()"?


  • Mod

    Hallo

    du hast recht c_str() ist Quatsch - ist doch nur ein AnsiString
    (sollte mal etwas weniger arbeiten und gleichzeitig hier posten)

    MfG
    Klaus



  • Hmm,

    okay. Also so oder wie?

    Label5->Caption = eingabe->Strings[2];

    ?



  • Hallo

    ja, das holt die dritte Zeile aus eingabe. Achtung : wenn es die nicht gibt, kommt eine Exception, also die Grenzen des Arrays beachten.

    bis bald
    akari



  • und wie kann ich alle auslesen?

    while schleife? oder wie!



  • UrsaMajor schrieb:

    while schleife? oder wie!

    Jepp. Oder for(...; ...; ...), falls dir das besser liegt.



  • Hi,

    sry das ich nochmal so doof frage, aber.

    Ich habe dann eine while schleife wie kann ich ihm sagen das nun schluss ist. das er nicht weiterzählt? und alle daten sollen in einem feld ausgegeben werden?



  • Ich zitier da einfach mal jemand anders (im Übrigen auch aus diesem Thread):

    akari schrieb:

    Dort kannst du die Zeilen mit dem Array TStringList->Strings[] von 0 bis TStringList->Count durchgehen.



  • Hallo

    da eingabe bereits ein Array ist, läßt du alle Werte dort drinnen, und holst dir nur die gerade anzuzeigenden Werte :

    TStringList *eingabe;
    ... // Datei in eingabe einlesen
    int RecordCount = eingabe->Count / 3; // Anzahl der vorhandenen Einträge bestimmen
    ...
    int CurrRecord = 2; // Dritter Eintrag soll gelesen werden
    AnsiString Text1 = eingabe->Strings[CurrRecord *3]; // erste Zeile des dritten Eintrags
    AnsiString Text2 = eingabe->Strings[CurrRecord *3 +1]; // zweite Zeile des dritten Eintrags
    AnsiString Text3 = eingabe->Strings[CurrRecord *3 +2]; // dritte Zeile des dritten Eintrags
    

    bis bald
    akari



  • Hi nochmal,

    danke für die gute hilfe. eine sache ist dennoch komisch! Folgender Code:

    const String dateiname="projekttage.kpt";
    	TStringList *eingabe;
    	eingabe=new TStringList;
    	eingabe->LoadFromFile (dateiname);
        int maxeintrag = eingabe->Count / 3;
        Label5->Caption = maxeintrag;
        int welchereintrag = 0;
        for (int a=1;a<maxeintrag;a++) {
        AnsiString texta = eingabe->Strings[welchereintrag *3];
        AnsiString textb = eingabe->Strings[welchereintrag *3 +1];
        AnsiString textc = eingabe->Strings[welchereintrag *3 +2];
        AnsiString text, mastertext;
        mastertext = texta+"\n"+textb+"\n"+textc+"\n"+text;
        text = mastertext;
        Label6->Caption = mastertext;
        welchereintrag=welchereintrag+a;
    

    Der mastertext wird ausgegeben, jedoch immer nur das letzte array. es sollen aber alle angezeigt werden. ist doch so richtig oder?



  • Hallo

    also mir kommen da doch ein paar Bedenken...

    - wo ist denn die Schleife zuende? Ich seh nur öffnende Klammer.
    Dies ist wichtig, da dadurch nur der letzte Wert deine Schleife verläßt, denn alle Variablen werden in der Schleife deklaraiert und damit auch initialisert

    - was stellst du dir denn unter der Bedingung der Schleife vor?

    for (int a=1;a<maxeintrag;a++) {
    ...
    welchereintrag=welchereintrag+a;
    

    nur a ist dein Index, wozu brauchst du welchereintrag

    - was soll das ?
    [cpp]mastertext = texta+"\n"+textb+"\n"+textc+"\n"+text;
    text = mastertext;[/cpp]
    Du hast viel zuviele Variablen, und weist denn kreuz und quer Zeug zu.

    - wohin soll denn die Ausgabe erfolgen? Beachte : Es macht keinen Sinn, die einzelnen Zeilen aus der StringList in einen String zu schreiben!
    Und wenn, dann nimm ganz einfach TStringList->Text

    - /Edit : Wenn du alle Daten auf einmal anzeigen willst, nimm doch statt TEdit ein TListBox

    ListBox1->Items->Assign(StringList);
    

    fertig.

    bis bald
    akari


Anmelden zum Antworten