geloescht_Kaffeemacher Geschrieben 24. Juni 2003 Geschrieben 24. Juni 2003 Good Morning @all, könnt ihr mir bitte helfen. Wie erreiche ich es, Zeichenweise aus einer Datei z.B "Beispiel.dat" auszulesen und den Text dann in ein Memofeld zu schreiben. Mit "getc"? Wer kann mir helfen? Danke für eure Hilfe. thx kaffeemacher Zitieren
Goos Geschrieben 24. Juni 2003 Geschrieben 24. Juni 2003 Schulligung wenn ich ne Gegenfrage hab, aber was bitte ist ein Memofeld? ...und dazu kommt dann auch gleich noch die Frage womit du das ganze realisieren willst. (VC, Borland, was weiss ich was) Goos Zitieren
Guybrush Threepwood Geschrieben 24. Juni 2003 Geschrieben 24. Juni 2003 Wenn du es wirklich nur Zeichenweise machenwillst dann kannst du fgets() nehemen. Zitieren
geloescht_Kaffeemacher Geschrieben 24. Juni 2003 Autor Geschrieben 24. Juni 2003 Sorry tut mir leid. Realisieren mit Borland C++ Builder 5 Meinte eigentlich auch fgetc kaffeemacher Zitieren
geloescht_Kaffeemacher Geschrieben 24. Juni 2003 Autor Geschrieben 24. Juni 2003 Hi @all, und wie realisiere ich das? Ich versuche schon die ganze Zeit, aber irgendwi raff ichs nicht. Bitte helft mir... thx kaffeemacher Zitieren
Goos Geschrieben 24. Juni 2003 Geschrieben 24. Juni 2003 Oki dann poste doch mal den Code wo du`s schon versucht hast...wir helfen dann beim verbessern Goos Zitieren
geloescht_Kaffeemacher Geschrieben 25. Juni 2003 Autor Geschrieben 25. Juni 2003 Hier der Code: ------------------ ---- File *datei; char hilf[80]; void __fastcall TForm1::Button1Click(TObject *Sender) { datei = fopen("c:\\uebungsdatei.dat", "r") if(datei == NULL) { Application->MessageBox("Die Datei existiert nicht!", "Achtung", MB_OK); } else { for(int i=0; i < ... ; i++) { for(int j=0; j < ... ; j++) { Memo1->Lines->Strings[j].c_str() = fgetc(datei); } } fclose(datei); } } ------- Zitieren
Goos Geschrieben 25. Juni 2003 Geschrieben 25. Juni 2003 Moin, koenntest mal so in der Art probieren: FILE *datei; datei = fopen("c:\\uebungsdatei.dat", "r"); int chr; if(datei == NULL) { Application->MessageBox("Die Datei existiert nicht!", "Achtung", MB_OK); } else { for(int i=0;(i < 50 ) && (feof(datei) == 0); i++) { chr = fgetc( datei ); Memo1->Lines->Strings[i].c_str() = (char)chr; } fclose(datei) }[/PHP] Vorsicht.....nicht getestet Goos Zitieren
Knuddlbaer Geschrieben 25. Juni 2003 Geschrieben 25. Juni 2003 Hallo, zu Zeiten von C++ kann man sich das einfacher machen mit dem Zeilenweise auslesen: #include <iostream> #include <fstream> #include <string> std::fstream datei("c:\\1.dmp"); std::string temp; while(getline(datei,temp)) // liest ALLE Zeilen ein. Egal wie groß sie sind. // Du hast in temp dann immer EINE Zeile stehen. { std::cout<<temp<<'\n'; // Hier mach irgendwas mit der Zeile. Tip: wenn Du const char* brauchst: temp.c_str() } [/PHP] Zitieren
Goos Geschrieben 25. Juni 2003 Geschrieben 25. Juni 2003 Original geschrieben von Knuddlbaer Hallo, zu Zeiten von C++ kann man sich das einfacher machen mit dem Zeilenweise auslesen: Der Ersteller hatte aber ursprünglich Zeichenweise und nicht Zeilenweise geschrieben Goos Zitieren
geloescht_Kaffeemacher Geschrieben 25. Juni 2003 Autor Geschrieben 25. Juni 2003 BEI Memo1->Lines->Strings.c_str() = (char)chr; TRITT DER FEHLER [C++ Fehler] Unit1.cpp(33): E2277 L-Wert erwartet AUF... An was könnte dies liegen???? thx kaffeemacher Zitieren
Guybrush Threepwood Geschrieben 25. Juni 2003 Geschrieben 25. Juni 2003 und das: Memo1->Lines->Strings[j].c_str() = fgetc(datei); bringt keinen Fehler? Zitieren
Knuddlbaer Geschrieben 25. Juni 2003 Geschrieben 25. Juni 2003 Original geschrieben von Goos Der Ersteller hatte aber ursprünglich Zeichenweise und nicht Zeilenweise geschrieben Goos Ah... Hubs... :floet: Ich sollte erst :mod: dann schreiben. Sorry Versuch mal: Memo1->Lines->Strings[j] += fgets(); (Wobei ich immer noch Zeilenweise einlesen und Zeilenweise zuordnen sinvoller halte und ich meine das das Memofeld auch eine MEthode lodfromfile o.ä. anbietet). Zitieren
Goos Geschrieben 25. Juni 2003 Geschrieben 25. Juni 2003 Original geschrieben von Kaffeemacher BEI Memo1->Lines->Strings.c_str() = (char)chr; TRITT DER FEHLER [C++ Fehler] Unit1.cpp(33): E2277 L-Wert erwartet AUF... An was könnte dies liegen???? thx kaffeemacher Ich hab kein Borland hier und wie schon erwaehnt auch keine Ahnung was ein Memofeld ist, oder wie man dieses befuellt. Mein (char)chr liefert jedenfalls einen Character zurueck. Wie fuellst du denn dein Memofeld normalerweise? Goos Zitieren
geloescht_Kaffeemacher Geschrieben 25. Juni 2003 Autor Geschrieben 25. Juni 2003 Nach deiner Verbesserung kommt wieder an der gleichen Stelle diese Fehlermeldung: [C++ Fehler] Unit1.cpp(32): E2277 L-Wert erwartet An was könnte dies liegen? thx kaffeemacher Zitieren
Guybrush Threepwood Geschrieben 25. Juni 2003 Geschrieben 25. Juni 2003 L-Wert erwartet beduetet das der Compiler auf der linken Seite des = Operators einen Wert erwartet dem er etwas zuweisen kannst. Was genaus ist den c_str() ? Ich denke mal das das eine Funktion ist und der Kannst du ja keinen Wert zuweisen. Zitieren
Knuddlbaer Geschrieben 25. Juni 2003 Geschrieben 25. Juni 2003 c_str() ermöglicht es den AnsiString an eine Funktion zu übergeben die char * erwartet. (bzw. const char *) const char * AnsiString::c_str(); Dies kann nicht als L Wert verwendet werden. Zitieren
geloescht_Kaffeemacher Geschrieben 25. Juni 2003 Autor Geschrieben 25. Juni 2003 Genau. So funktioniert es fast: FILE *datei; datei = fopen("c:\\uebungsdatei.dat", "r"); int chr; if(datei == NULL) { Application->MessageBox("Die Datei existiert nicht!", "Achtung", MB_OK); } else { for(int i=0;(i < 50 ) && (feof(datei) == 0); i++) { Memo1->Lines->Strings = fgetc(datei); } fclose(datei); } } ALLERDINGS: ========= Ich hab in die Datei einen vierzeiligen Text hineingeschrieben und im Memofeld stand: 100 150 An was könnte dies liegen. Muss man da erst noch etwas umkonvertieren? thx kaffeemacher Zitieren
Knuddlbaer Geschrieben 25. Juni 2003 Geschrieben 25. Juni 2003 Hallo Memo1->Lines->Strings = fgetc(datei); Hi! int fgetc(); Es sieht so aus als hätte AnsiString einen Operator=(int); So geht es nicht. Vesuch folgendes: mo1->Lines->Strings = static_cast<unsigned char>(fgetc(datei)); Wieso liest Du aber Zeichenweise ein ? Zeilenweise wäre einfacher bzw. die Methoden des Memos direckt zu verwenden. Was genau hast Du vor ? Mir erscheint die Art wie Du das Memofeld füllen willst ungeeignet. Beschreibe mal bitte was Du machen möchtest bzw. warum es ausgerechnet zeichenweise sein muss. Zitieren
PuppetMaster Geschrieben 27. Juni 2003 Geschrieben 27. Juni 2003 Hi! Nur noch so zur Info. Wenn du Memo1->Lines->Strings schreibst und dann 'i' in der for-Schleife hochzählst, schreibst du jeden Buchstabe in eine neue Zeile. Aber die Frage von Knuddlbaer ist eigentlich berechtigt, da zeielenweise einlesen schneller geht. Allerdings hat das Memo eine eigene Funktion dafür, die da lautet Memo1->Lines->LoadFromFile("C:\DeineDatei.dat") Ist sogar noch bequemer, da du dir sogar das mit fstream usw sparst P.S. AnsiString akzeptiert auch char über den op = AnsiString AS; char c[20] = "Hallo Welt!"; //Funktioniert ohne weiteres AS = c; [/PHP] Zitieren
geloescht_Kaffeemacher Geschrieben 29. Juni 2003 Autor Geschrieben 29. Juni 2003 Hi @all, lange nichts mehr von mir hören lassen. Ihr fragt euch zu Recht "Wieso liest er nicht zeilenweise aus?". Die Sache ist die, es ist 'ne Hausaufgabe von der Berufschule. Ich hab mir das ganze noch einmal überdacht und bin zu dem Ergebnis gekommen, dass es nicht so gut ist, wenn jeder hier die Aufgaben für mich macht. Besser wäre es wenn ihr mir helfen würdet, wie ich zu der Lösung komme. * * * Was ihr vielleicht noch wissen solltet * * * Benutze den Borland C++ Builder 5.0. Die Aufgabe lautet, wenn auf einen Button geklickt wird, dann soll aus einer Datei "uebungsdatei.dat" ZEICHENWEISE ausgelesen und in ein Memofeld (eine Art Textfeld) übertragen werden. Vielleicht könnt ihr mir weiterhelfen! Mein bisheriges Ergebnis: ---------- Quellcode: ---------- #include <vcl.h> #inlcude <stdio.h> FILE *datei; void __fastcall TForm1::Button1Click(TObject *Sender) { //öffne die Datei datei = fopen("C:\\uebungsdatei.dat", "r+"); //Wenn die Datei nicht geöffnet werden kann, erfolgt eine Fehlermeldung if(datei == NULL) { Application->MessageBox("Die Datei kann nicht geöffnet werden", "Fehler", MB_OK); } //Ansonsten... else { //Hilfsvariablendeklartion char chr; //lies zeichenweise solange aus, bis EndOfFile eintritt while( (chr = fgetc(datei)) != EOF ) { //Übertrage die Zeichen ins Memofeld und konvertiere von AnsiString /* hier weiss ich leider nicht weiter - und auch den CODE*/ Memo1->Lines-> ... = ...; //Wenn du auf ein Nullterminierungszeichen triffst, erfolgt ein Zeilenumbruch //im Memofeld if(chr == '\O') { /* hier leider auch nicht - und auch den CODE*/ /* '\n' wird wahrscheinlich auch nicht stimmen, oder? */ fputc('\n', ...); } } //Schließe die Datei fclose(datei); } } [/PHP] Ich bedanke mich für Eure Bemühungen. thx kaffeemacher Zitieren
Knuddlbaer Geschrieben 29. Juni 2003 Geschrieben 29. Juni 2003 Hi! Das Memofeld->Lines->String oder wie das was (Borland is ne weile her) speichert immer eine Zeile! d.h. Du hast 2 Möglichkeiten: 1. den Sring zuvor "zusammenbauen" da würde ich aber vom plain C weggehen und C++ nehmen (std::string) 2. Memofeld->Lines->String += DasEineZeichen verwenden und i erhöhen wenn Du eine neue Zeile brauchst. (Das wird aber langsam). Mein Tipp wäre also: Schreibe Dir eine Funktion die einliest bis das Kriterium für eine neue Zeile erreicht ist. Wenn Du das erreicht hast: Schreibe nun eine Funktion die obrige Funktion verwendet um das Memofeld zeilenweise zu füllen. Vorteile: 1. Du liest zeichenweise aus wie Du es sollst 2. Du füllt das Memo zeilenweise wie es am praktischsten ist O:o) 3. Du kannst später die Funktion wegwerfen und Memo::loadFromFile o.ä. direckt verwenden ;o) Zitieren
geloescht_Kaffeemacher Geschrieben 29. Juni 2003 Autor Geschrieben 29. Juni 2003 Danke für deinen Beitrag, Allerdings würde ich schon gerne diesen Aufbau beibehalten. Ich weiss den Code halt nicht dafür, wie man dem Memofeld ein Zeichen zuweis und danach umkonvertiert im C++ Builder. Es muss nicht unbedingt Memo1->Lines heissen, es bezieht sich ja dann auf die Zeilen und nicht auf Zeichen. Richtig? Und dann sollte man die Zeichen auch noch umkonvertieren. Dann kommt noch dazu, dass ein Zeilenumbruch folgen muss. greetz kaffeemacher Zitieren
Knuddlbaer Geschrieben 29. Juni 2003 Geschrieben 29. Juni 2003 Dein Problem ist das das Memofeld ZEILENorientiert ist, nicht zeichenorientiert. Entweder Du ruft lines->String += auf oder baust Dir die Zeilen vorher zusammen. Ich hab keine Idee wo Dein Problem ist. Versuchs mal von einer anderen Seite zu erläutern, so kommen wir nicht weiter. thx Michael Zitieren
geloescht_Kaffeemacher Geschrieben 30. Juni 2003 Autor Geschrieben 30. Juni 2003 Guten Morgen, danke für deine Antwort. Ich werde es so versuchen, wie du es mir beim letzten posten geschildert hast. Danke. greetz kaffeemacher Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.