www.mikrocontroller.net

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


Autor: Martin C. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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>).

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin C. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.