Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Trennzeichen für eine Liste (in einer txt-Datei)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
28.11.2009, 14:49 Uhr
~cppbeginner
Gast


Hallo,

ich möchte eine Funktion schreiben, die mehrere alphanumerische
Zeichenketten in eine Liste (eine .txt-Datei) schreibt.

Der Aufbau ist wie bei einer Tabelle:
id1;name1;bezeichnung1;irgendwas1
id2;name2;bezeichnung2;irgendwas2
id3;name3;bezeichnung3,irgendwas3

Als Trennzeichen möchte ich Zeichen verwenden, die _keine_ alphanumerischen
Zeichen sind. µ und ^ sind ebenfalls ausgeschloßen.

Später muss ich diese Elemente aus der Tabelle wieder abholen.


Was könnte ich als Trenner verwenden?


Herlichen Dank fürs Helfen

P.S. Ich muss diese Tabelle in eine Liste speichern, da auf dem Zielsystem
von diesem Programm kein Platz für eine Datenbank zur Verfügung steht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.11.2009, 16:07 Uhr
ao

(Operator)


Das ist im Prinzip völlig egal, es müssen nur Zeichen sein, die in den Feldern nicht vorkommen.

Entscheidend sind die Rahmenbedingungen:
* Wird die Datei ausschließlich von Programmen bearbeitet oder auch von Menschen?
* Wie kritisch ist die Größe? Kann man es sich z.B. leisten, 10 bis 20 Prozent Leerzeichen zu verteilen, um die Lesbarkeit für Menschen um 1000 % zu verbessern, oder ist das eine inakzeptable Platzvergeudung?
* Wenn das Zielsystem keinen Platz für eine DAtenbank hat, dann scheint es was Kleineres zu sein. Hat es genug Leistung für etwas String-Formatierung und Parsing?
* Ist die Regel "nur alphanumerische Zeichen" auch in Zukunft verlässlich? Oder ist es nur eine Frage der Zeit, bis die ersten Sonderzeichen eingefügt werden (Klammern, Währungssymbole, Jokerzeichen, Plus/Minus, Zahlen mit Dezimalpunkt oder Tausender-Gruppierung, Uhrzeiten mit Doppelpunkt)?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.11.2009, 16:58 Uhr
0xdeadbeef
Gott
(Operator)


SQLite?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.11.2009, 17:36 Uhr
~cppbeginner
Gast


@ao:
* nur von Programmen
* da Leerzeichen in den Zeichenketten also den Elemeten der Tabelle
vorkommen können, möchte ich eine bestimmte Anzahl an Leerzeichen
als Trenner vermeiden.
* Es ist ein Alixboard mit 500mHz
* Diese Regel ist auch in Zukunft verlaässlich.
Der alphanumerische Zeichensatz ist nach meiner Auffassung:
a..z, A..Z, 0..9, !"§$%&/()=?,.-;:_+*#'
(Die Wikipedia Definition finde ich etwas verwirrend)

Bei µ als Trennzeichen habe ich allerdings das Problem, dass auf
einmal ^A vor dem µ in den Listen steht, was zu Fehler beim Auslesen
führt.


@0xdeadbeef:
Auf eine Datenbank möchte ich vorerst verzichten, da die Funktionen
zum Auslesen und Beschreiben der Datei schon geschrieben sind.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.11.2009, 20:11 Uhr
Hans
Library Walker
(Operator)


Wie wäre es mit Tabulatoren ('\t' bzw. ASCII-Code 9) als Trennzeichen? - Oder mit einem gesetzten Bit 7, d.h. einem ASCII-Code >= 128?
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.11.2009, 16:43 Uhr
~cppbeginner
Gast


Das klingt gut. Ich brauche an die neun verschiedenen Trennzeichen.

"ASCII-Code >= 128" wie würde das genau aussehen?
char c = 'x'; //x?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.11.2009, 20:50 Uhr
Lensflare




Zitat von ~cppbeginner:

"ASCII-Code >= 128" wie würde das genau aussehen?
char c = 'x'; //x?


man kann variablen vom datentyp char auch direkt numerische werte zuweisen:

C++:
char c = 128;



Bei werten >= 128 sollte man jedoch "unsigned char" verwenden.
Denn es kann sein, dass der compiler für char einen wertebereich von -128 bis 127 vorsieht und nicht 0 bis 255.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 29.11.2009 um 20:59 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.11.2009, 00:40 Uhr
0xdeadbeef
Gott
(Operator)


Vorsicht damit; Umlaute liegen in dem Bereich.

Wie dem auch sei, bei dem Aufbau wirst du dir ein Zeichen suchen müssen, das in den Daten nicht enthalten ist. Welches sich da empfiehlt, kann ich dir nicht sagen; ich kenne deine Anwendung nicht.

Ansonsten ließe sich das Problem mit Escape-Zeichen (und womöglich Quoting) umgehen, wie man das im Code direkt auch kennt. Allerdings wird der Parser dadurch natürlich wesentlich komplexer.

Übrigens: "Alphanumerisch" bedeutet üblicherweise, dass ein Zeichen im Alphabet enthalten oder eine Zahl ist. Je nach Umständen und ggf. Locale kann das Umlaute, ß, akzentierte Buchstaben (é, ñ) beinhalten oder nicht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
30.11.2009, 01:24 Uhr
Hans
Library Walker
(Operator)


Hi,

wieso 9 verschiedene Trennzeichen? - Eigentlich müssten für Tabellen doch zwei ausreichen: eines das die Zellen bzw. Spalten trennt, und eines fürs Zeilenende.

Zitat:
"ASCII-Code >= 128" wie würde das genau aussehen?
char c = 'x'; //x?

Naja, nicht ganz. Eher so:

C++:
unsigned char c;
...
c = 'x' + 128;
...
if ((c&127)>0)  // Code ist >= 128



Wenn Du allerdings mit noch mehr Trennzeichen hantieren willst, ist der Vorschlag mit den Escape-Zeichen sehr gut. Dann schreibst Du einfach den ASCII-Code 27 = ESC = Escape und ein weiteres Zeichen, dessen Bedeutung Du selbst definierst, in die Daten rein, und kannst sie entsprechend auswerten. Das könnte etwa so aussehen:

C++:
unsigned char inputline[100];
int i;

// Trennzeichenabfrage
if (inputline[i]==27) // Escape
  { if (inputline[i+1]==Q1) // erstes selbst definiertes Trennzeichen?
     ... // tue was
     else if (inputline[i+1]==Q2) // zweites selbst definiertes Trennzeichen?
     ... // tue was anderes
    // alle Varianten durch
  }
else // kein Escape
  // tue was damit


Hier gehe ich davon aus, das Du die Tabelle zeilenweise in den Speicher bzw. einen Puffer holst, und auswertest. Den Eingabepuffer hab ich inputline genannt. Q1 und Q2 sind Bezeichner für die selbst definierten Trennzeichen, die für irgendwelche Zahlenwerte stehen.

Bei dieser Vorgehensweise wirst du die Tabelle allerdings nicht mehr problemlos mit Standardfunktionen einlesen bzw. schreiben können, die auf Strings spezialisiert sind. Es empfiehlt sich dabei, die Datei als Binärdatei zu behandeln, weil dadurch keine Zeichenanpassungen vorgenommen werden, wie sie bei Textdateien auftreten können.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
30.11.2009, 02:17 Uhr
0xdeadbeef
Gott
(Operator)


Eigentlich dachte ich dabei eher an "foo\,bar,ba\\z" um "foo,bar" und "ba\z" in verschiedene Felder zu schreiben, vergleichbar mit der Shell oder C(++)-String-Literalen. Auf die Art lässt sich das ganze auch in einem Editor eingeben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: