Textdatei einlesen, bearbeiten, auslesen
-
Hallo allerseits,
Ich habe folgendes Problem:
Ich möchte eine Textdatei mit unbekannter Länge einlesen, bearbeiten und wieder als Textdatei ausgeben.Ich kann momentan nur die Datei bis zu einer Stelle n einlesen (aber eben nicht variabel) -> er soll also die Datei bis zum -Ende- auslesen.
So sieht im moment der Code von dem Button "Einlesen" aus den ich in meiner Form erstellt habe. TLstatus ist ein Label was das eingelesene direkt anzeigt.
char bufferA[100]; ifstream dateiA; dateiA.open("c:\\quelle.txt", ios_base::out | ios_base::in); dateiA.read(bufferA,99); dateiA.close(); TLstatus->Caption = bufferA; cin.peek();Den Code oben hat mir ein Freund geschrieben. Z.T. verstehe ich ihn auch, deshalb würde es mir entgegenkommen, wenn ihr in dem "Stil" mir weiterhelfen würdet.
Vielen Dank schonmal für die Hilfe! -Bitte beschreibt was die einzelnen Befehle machen (denn ich will ja was lernen und nicht einfach nur die Lösung bekommen)
THX
-Benutze C++ Builder 4
-
Suchst du das:
while (!dateiA.eof()) { char buffer[200]; dateiA.getline(buffer, sizeof(buffer), '\n'); // dein Code ... }Rob'
-
Ich bekomme jetzt nur die letzte Zeile angezeigt
Ich denke mal es würde so funktionieren, wenn es in der Konsole wäre.
Da ich hier aber ein Label verwende, löscht er den alten Inhalt des Labels und setzt den neuen also so:Labelzeile Datei-Inhalt
Zeile 1: Inhalt der ersten Zeile aus der Datei
Zeile 2: ""Zeile 1: Inhalt der zweiten Zeile aus der Datei
Zeile 2: ""Gibts ein anderes Formular (Textbox oder so) oder Option damit ich die Infos untereinander schreiben kann (also das der den Inhalt des Labels nicht löscht)?
-
die komponente heißt richedit und du findest sie bei win 32
-
Danke! Aber ich habe damit noch nicht gearbeitet... wie schreibe ich denn da etwas rein?
-
Hallo
Aber ich habe damit noch nicht gearbeitet... wie schreibe ich denn da etwas rein?
TRichEdit RichEdit; ... AnsiString NewLine; ... RichEdit->Lines->Add(NewLine);steht alles in der Hilfe zu RichEdit
bis bald
akari
-
War das hier nicht das Borland Forum ?
Für ein Memo:
Memo1->Lines->LoadFromFile("c:\\quelle.txt");Für ein RichEdit:
RichEdit1->Lines->LoadFromFile("c:\\quelle.txt");
-
Ok prima! Danke für die Hilfe.
Ich habe jetzt beide Versionen laufen und es läuft alles wie geschmiert

Jetzt möchte ich aber noch den Text bearbeiten. Da kann ich doch den Move-Befehl nehmen, oder? und: wie kann ich dann einen Teil kopieren bearbeiten und wieder reinsetzen?
-
Du liest den Text in eine StringList.
Schaust dir in der Hilfe die Methoden von AnsiString an.
Bearbeitest deinen Text und speicherst ihn wieder ab.
-
Die Methode mit der StringListe ist wahrscheinlich die bessere, aber so geht es auch:
#include <vector>
std::vector <char> mein_Text;
mein_Text.resize(meine Dateigröße);
dein Read Befehl
-
Aaaah super... das klappt alles wie am Schnürchen...
Ich hab jetzt eine (für mich) etwas komplexere Frage:
Ich habe auf meiner GUI mehrere Checkboxen (die wiederrum Textfelder mit Inhalten aktivieren oder deaktivieren), jenachdem ob sie Aktiviert sind oder nicht bekommt eine Variable den Wert 0=deaktiviert oder 1=aktiviert.
Da sich meine Textausgabe nach diesen Häckchen richtet, würde ich gerne wissen, ob ihr eine günstige Lösung des Problems habt.
Ausgabeformat:
Inhalt1 | Inhalt2 | Inhalt3 | Inhalt4
Die Inhalte sind unterschiedlich groß. Wenn sie aktiviert sind soll dahinter die Zeichenfolge Leer-Strich-Leer also: " | " <--das ohne "". Bis auf den letzten Inhalt! Da sollen keine Extrazeichen dahinter.
Also müsste ich doch nachfragen, wieviele Inhalte ich hab, allen ein " | " dahinter setzen und dann den letzten Inhalt abfragen und das " | " wieder löschen, find ich am günstigsten, oder??
-> Oder ich lasse die Inhalte setzen, schreibe die Striche in das RichEdit Modul rein und positioniere den Cursor so, dass er jeweils die Inhalte reinsetzt...
was haltet ihr davon und vorallem wie realisiere ich das?
Danke für die Hilfe schonmal -> habt mir schon enorm weitergeholfen!!!
-
Ich würde das so machen wie deine erste Idee:
Zuerst alles reinschreiben:
#define CheckBox_Anzahl //Wert #define Edit_Anzahl CheckBox_Anzahl TCheckBox *meine_Checkbox[CheckBox_Anzahl] = //meine Checkboxes auf dem Formular TEdit *mein_Edit[Edit_Anzahl] = //meine Edits auf dem Formular String meine_Ausgabe = ""; for (int i = 0; i < CheckBox_Anzahl; i++) { if (meine_Checkbox[i]->Checked) meine_Ausgabe = meine_Ausgabe + mein_Edit[i] + " | "; } meine_Ausgabe = meine_Ausgabe.SubString(1, meine_Ausgabe.Length()-3);
-
Uff, kann sein das es schon zu spät ist und das ich einfach blutiger Anfänger in Sachen C++ bin, aber ich verstehe deinen Code beim besten willen nicht...
allerdings hast du mir dadurch gezeigt wie ich mit IF das Checked meiner Checkbox abfragen kann (hab immer geschrieben: IF (CheckBox1->Checked=true){} )
Ich denke ich werde erstmal die etwas noobige und umständliche Version wählen und das mit If-Abfragen realisieren (dank dir trotzdem!)
Ein Problem gibts trotzdem (wo ich auch bereits auf vielen Seiten nachgeschaut habe): Wenn ich das hier mache:
RichEdit1->Lines->Add("abc");
RichEdit1->Lines->Add("def");...schreibt er mir das in 2 Zeilen... ich will es aber hintereinander haben-> also die Position des Cursors in einem RichEdit bestimmen...
weis jemand wie das geht? (bräuchte ich früher oder später sowieso
)
-
Hi,
also entweder fügst Du die Zeilen vor dem Einfügen ins das RichEdit zusammen, oder Du mußt die Zeile aus dem RichEdit auslesen, den neuen String anhängen und wieder in das RichEdit zurückschreiben. Schau Dir hierzu mal die Eigenschaft Lines des RichEdits an.