Anzeige:
Ergebnis 1 bis 3 von 3

Thema: Hilfe bei Entwicklung von Dateiformat

  1. #1
    Registrierter Benutzer
    Registriert seit
    23.10.2005
    Beiträge
    25

    Hilfe bei Entwicklung von Dateiformat

    Hallo zusammen,

    ich habe hier ein Problem ( zwar in C++ die Lösungen kann man auch auf andere Programmiersprachen übertragen, daher habe ich es hier gepostet ) :

    Ich habe eine Klasse Kunden
    Code:
    class Kunde
    {
          public:
                 Kunde(std::string vName,std::string nName,std::string text);
                 const std::string &getNachname(void)const; // Vornamen ausgeben
                 const std::string &getVorname(void)const;  // Nachnamen ausgeben
                 const std::string &getText(void)const;     // Optionaler Text
          private:
                  std::string vorname;
                  std::string nachname;
                  std::string text;
    }
    Neben dieser Klasse existier eine weiter Klasse :

    Code:
    class KundeDB
    {
          public:
                 KundeDB();
                 void addNeuKunde(Kunde k);
          private:
                  std::vector<Kunde> kunden_vector;
    }
    Ich kann diesen Vector nun speicher usw, dabei speichert er mit je einen Kunden in eine Zeile z.B.

    Hans,Mustermann,Text
    Karl,Mustermann,Text
    Diese lese ich mir nun mit getline(...,std::string var,","); aus, was auch wunderbar funktioniert. Wenn der Text nun aber über mehr als eine Zeile geht z.B.

    Hans,Mustermann,Text
    über mehr als eine Zeile
    Karl,Mustermann,Text
    Bei einem solchen Text schlägt das lesen nun fehl, da ich die einzelnen Text Segmente immer mit einem "," teile und pro Zeile genau ein Kunde vorhanden ist.

    Ich muss mir also irgendein Dateiformat basteln, wo ich die Kunden richtig speichern/lesen kann. Wie kann man sich ein solches Dateiformat basteln, hat einer eine Kreative Idee, mir fällt da nur wenig zu sein .

    Danke im voraus.

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.12.2001
    Ort
    anywhere before EOF
    Beiträge
    236
    1. Wenn in den Feldinhalten alle Zeichen zulässig sein sollen:
    a)
    • Nach jedem Feld (auch dem letzten also hier dem Text) kommt ein Trennzeichen (von mir aus ein ',');
    • Soll dieses Trennzeichen im Feldinhalt vorkommen wird es "escaped" also z. B. durch vorangestelltes '\';
    • Soll das "Escape-Zeichen" selbst im Text vorkommen wird es ebenfalls escaped;
    • Um den Inhalt in ein Feld zu schreiben (in der Datei) wird jedem '\' und jedem ',' ein '\' vorangestellt;
    • Um den Inhalt eines Feldes zu lesen wird vom Ende des letzten Feldes (dessen Trennzeichen plus eins oder Dateianfang) bis ausschliesslich zum ersten vorkommen eines ',' ohne vorangegangenes '\' gelesen;
      "\," wird im Text durch "," erstezt und "\\" durch "\";
    • Ein Datensatz Trennzeichen ist dann nicht mehr nötig, ein Datensatz ist dann zu Ende wenn das letzte Trennzeichen des letzen Feldes eines Datensatzes erreicht wurde;

    b)
    • Wenn es nur das Newline-Zeichen ist das Probleme macht, dieses einfach beim schreiben z. B. durch "\n" ersetzen und sämtliche Vorkommen von "\" im Feldinhalt durch "\\" ersetzen;
    • Beim lesen sämtliche "\\" durch "\" erstzen und "\n" durch Newlines;

    c)
    • Maximale Feldlängen definieren, z. B. Nachname gleich 255 Zeichen, Vorname gleich 255 Zeichen und optionaler Text gleich 65536 Zeichen;
    • Zu jedem Datensatz die tatsächlich benutze Feldlänge mit abspeichern, also hier zum Beispiel immer ein Byte für die Länge des Nachnamens, eines für die Länge des Vornamens und zwei für die Länge des optionalen Textes;
      An relativ fester Postion (z. B. direkt nach den Längenangaben) die eigentlichen Daten beginnen lassen und ohne Trennzeichen schreiben;
    • Beim Lesen zuerst die Längen auswerten und dann wieder an der relativ festen Postion anfangen die angegeben Anzahl Zeichen für jedes Feld zu lesen (Länge des vorherigen Feldes kommt natürlich zum Offset dazu);


    2. Wenn du bestimmte Zeichen im Inhalt ausschliessen kannst:
    a)
    • Feste Feldlängen definieren, z. B. Nachname gleich 64 Zeichen, Vorname gleich 64 Zeichen und optionaler Text gleich 1024 Zeichen;
    • Beim Schreiben eingegebenen Feldinhalt auf die entsprechende Länge mit Null-Bytes auffüllen und direkt nebeneinander schreiben;
    • Beim lesen vom Feldanfang der gleich dem Offset des Anfangs des vorangegangenen Feldes plus dessen Länge ist bis ausschliesslich zum ersten Vorkommen eines Null-Bytes lesen oder bis die maximale Feldlänge erreicht ist;
    • Nachteil: Null-Bytes sind im Feldinhalt nicht möglich;

    b)
    • Denk dir Trennzeichen aus, die im Feldinhalt nicht vorkommen dürfen und lass die Eingabe dieser im Programm nicht zu, also man darf z. B. kein ',' und kein NL Eingeben;
    • lass den Rest wie gehabt, bzw pass es auf ggf. geänderte Trennzeichen an;
    • Nachteil: die Trennzeichen sind im Feldinhalt nicht möglich;


    Läuft auf jeden Fall darauf hinaus, dass du entweder vom zeilenweise Lesen (mit getline() ganz wegkommen musst (ausser bei 1. b) und 2. b) wenn du echt das NL verbietest), oder zumindest ggf. wenn das gefundene Newline noch kein Datensatzende war noch ggf. mehrere Zeilen dazu lesen musst...

    P. S.: Die Listen haben keinen Anspruch auf Vollständigkeit, gibt sicher noch andere Möglichkeiten oder Verfeinerungen oder Variationen der angegebenen Möglichkeiten.
    Geändert von sticky bit (15-10-2006 um 11:43 Uhr)
    chmod -R +t /*

  3. #3
    Registrierter Benutzer
    Registriert seit
    23.10.2005
    Beiträge
    25
    Danke fuer die lange Antwort, ich habe es jetzt relativ einfach gelöst,

    Einzelne String werden durch das ASCII Zeichen 186 getrennt, so habe ich keine Probleme, wenn auch mal ein "," in einem String vorkommt. In den einzelnen Strings ersetze ich das \n durch das ASCII Zeichen 187, beim lesen der umgekehrte Weg und es klappt ganz gut.

    Merke : Nie um 4 Uhr morgens versuchen Kreativ zu arbeiten

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •