Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Zeichenweise aus einer Datei auslesen und in ein Memofeld schreiben?

Empfohlene Antworten

Veröffentlicht

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

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

Sorry tut mir leid.

Realisieren mit Borland C++ Builder 5

Meinte eigentlich auch fgetc

kaffeemacher

Hi @all,

und wie realisiere ich das? Ich versuche schon die ganze Zeit, aber irgendwi raff ichs nicht.

Bitte helft mir...

thx kaffeemacher

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);

}

}

-------

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

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]

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

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

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).

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

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

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.

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

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.

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]

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

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)

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

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

Guten Morgen,

danke für deine Antwort. Ich werde es so versuchen, wie du es mir beim letzten posten geschildert hast. ;)

Danke. :)

greetz kaffeemacher

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.