Zum Inhalt springen

Zeichenweise aus einer Datei auslesen und in ein Memofeld schreiben?


Empfohlene Beiträge

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

}

}

-------

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...