Forum: PC-Programmierung C++ Dateininhalt auslesen und einteilen


von Martin C. (Gast)


Lesenswert?

Hallo,

ich möchte ein Programm in C++ (Borland C++ 6) schreiben, dass aus einer 
Datei eine Bezeichnung und dann einzelne Zeichenfolgen (Datensätze aus 
z.B. jeweils 3 Zeichenfolgen) in Strings einliest (in ein Array?), die 
ich in einem Stringgrid anzeigen und ändern kann. Danach sollte der 
bearbeitete Teil wieder an die ursprünglichen Position in die Datei 
zurückgeschrieben werden. Da die Datei von einem anderen Programm 
benutzt wird, darf ich am Aufbau der Datei nichts ändern.

Die Datei besteht komplett eigentlich nur aus 0-Bytes. Am Anfang steht 
die Bezeichnung (Byte 0 bis 39), an weiteren bestimmten Positionen 
befinden sich dann für die einzelnen Datensätze die Zeichenfolgen 
"Daten" (3x) bestimmter Länge:

Bezeichnung 00 00 00 00 00 00 00 Daten0,0 00 00 00 00 Daten0,1 00 00 00 
00 Daten0,2 00 00 00 00 00 Daten1,0 00 00 00 00 Daten1,1 00 00 00 00 
Daten1,2 00 00 00 00

Mein Problem ist derzeit: wie lese ich die Zeichenfolgen ein, teile sie 
ein, und wie schreibe ich sie wieder aus dem Stringgrid in ihre 
ursprüngliche Position zurück? Welche Funktionen wären mir dazu 
nützlich?
Das Stringgrid selbst ist bereits fertiggestellt.

Vielleicht kann mir ein C++-Profi den Weg weisen, hierfür schon einmal 
vielen Dank!

von Klaus W. (mfgkw)


Lesenswert?

Es gibt natürlich viele Wege; welche sinnvoll sind kann man so
pauschal nicht sagen.
"z.B. jeweils 3 Zeichenfolgen" ist eine eher schwammige Beschreibung.

Eine Möglichkeit wäre, die Datei (Stichwort "Binärdatei" auf
jeden Fall) byteweise vom Anfang weg zu lesen und sich die Info
zusammen zu sammeln.

Wahrscheinlich sinnvoller wäre es (wenn du die Positionen kennst)
jeweils den Dateizeiger zu positionieren und dann dort die
Werte zu lesen.

Dann musst du dir für jedes Datum merken, wo es herkommt und
wie lang es ist (falls du es nicht anderweitig implizit weisst),
z.B. in einer kleinen class mit Position, Länge, Wert.

Zum Schluß halt alle abklappern und zurückschreiben.

Soweit ich die Aufgabenstellung verstanden habe, hört es
sich jetzt eher nach Fleißarbeit an, aber vielleicht sind
mir die echten Probleme entgangen.

Viele Leute finden das Bearbeiten von Binärdateien mit den
Funktionen aus <cstdio> (fread, fwrite, fputc, fgetc) einfacher
und einleuchtender als mit den Streams aus C++ (<iostream>).

von Karl H. (kbuchegg)


Lesenswert?

Martin C. schrieb:

> Vielleicht kann mir ein C++-Profi den Weg weisen, hierfür schon einmal
> vielen Dank!

In deinem Fall dürfte es tatsächlich der einfachste Weg sein, zunächst 
zu vergessen, dass es sich um Strings handelt.

Du hast ein File mit dem Aufbau

     Array von 40 Bytes
     Datensätze, jeweils bestehnd aus
        Array von x Bytes für Daten 1
        Array von x Bytes für Daten 2
        Array von x Bytes für Daten 3


und genau so würde ich die auch erst mal einlesen.
mittels fopen das File aufmachen und dann die jeweilige Anzahl Bytes 
mittels fread einlesen.

Wie es dann weitergeht, hängt davon ab, wie genau das Stringgrid 
aussieht. Eventuell den 'Umweg' gehen und aus den Arrays String-Objekte 
machen (bzw. entsprechende String Objekte befüllen), die dann ins String 
Grid Objekt zur Bearbeitung übergeben werden.

Anstelle von fopen bzw. fread/fwrite könnte man natürlich auch die C++ 
File-Stream Objekte benutzen. Als alter Hardcore-C Programmierer sind 
mir allerdings die fopen/fread/fwrite/fseek Calls lieber als die Stream 
Objekte, aber das muss IMHO jeder für sich entscheiden.

von Martin C. (Gast)


Lesenswert?

Hallo nochmal,

erst einmal vielen Dank für eure schnelle Hilfe.
Dann werde ich mich heute abend mal genauer mit fread & Co. befassen.
Die Positionen der einzelnen Daten innerhalb der Datei kann ich ja 
selbst per Hex-Editor auszählen. "Learning by doing" - ich werde mich da 
jetzt mal stückchenweise durchhangeln.

Einen schönen Abend noch
Martin

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.