Forum: PC-Programmierung xml datei einlesen und in Textdatei umwandeln


von Anton (Gast)


Lesenswert?

hallo,

ich habe eine Aufgabe die ich zu lösen habe und zwar:
ich muss eine xml datei einlesen und mit hilfe von C programmiersprache 
den Inhalt von dieser Datei in einer Textdatei umwandeln, wobei der alle 
overhead rausgenommen werden muss. iwe man anfängt weiss ich nicht. 
Bitte können Sie mich helfen.
Danke im voraus!!!!!

von TestX .. (xaos)


Lesenswert?

google: c xml reader, c xml lib => tutorial der gefundenen quellen 
lesen..

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Anton schrieb:
> den Inhalt von dieser Datei in einer Textdatei umwandeln, wobei der alle
> overhead rausgenommen werden muss.

Nun, sieh Dir mal eine XML-Datei mit einem einfachen Texteditor an (wie 
z.B. Notepad) und sieh Dir dann an, wie dieselbe Datei "ohne allen 
Overhead" laut Aufgabenstellung aussehen soll.

Ohne die Spezifikation, wie das von "allem Overhead" befreite Ergebnis 
auszusehen hat, brauchst Du auch gar nicht anzufangen.

von Frank (Gast)


Lesenswert?

Eine XML-Datei ist eine Textdatei, diese Tatsache ist Bestandteil der 
XML-Definition.
Das was du als "Overhead" bezeichnest ist die Strukturierung. Ohne die, 
nützt dir die Datei aber fast Nichts - ziemlich komische 
Aufgabenstellung ...

von Anton (Gast)


Lesenswert?

Frank schrieb:
> hne die,
> nützt dir die Datei

Genau an dieser Stelle ist meine Frage . dieses Strukturierung 
(klammern) müssen von meinem C Programme code herausgefiltert werden und 
dann bleibt nur die brauchbaren Daten die in eine Text Datei geschrieben 
werden muss.

welche c Funktion braucht man dafür????

von Max (Gast)


Lesenswert?

Anton schrieb:
> welche c Funktion braucht man dafür????

Hast doch schon genügend Tips gekriegt. Alles andere ist jetzt deine 
Sache, wir sind nicht dazu da dir deine Hausaufgaben zu machen.

von Anton (Gast)


Lesenswert?

Max schrieb:
> Hast doch schon genügend Tips

ich habe niemals gesagt, dass du die code für mich schreibt. sondern nur 
Hinweise

von Karl H. (kbuchegg)


Lesenswert?

Anton schrieb:
> Max schrieb:
>> Hast doch schon genügend Tips
>
> ich habe niemals gesagt, dass du die code für mich schreibt. sondern nur
> Hinweise


Ich denke der Hinweis gleich im ersten Antwortposting ist mehr als 
genug.

Welche XML Parser Libraries hast du dir den bisher angesehen?


> welche c Funktion braucht man dafür????

Nicht: Funktion
Sondern: Funktion_en_

eine XML Parser Library stellt dir einen Satz von Funktionen zur 
Verfügung, mit denen man komfortabel XML Files bearbeiten kann. Viele 
Funktionen müssen zusammenspielen, damit du dein Ziel erreichst.

Sonst wäre Programmieren ja auch banal und jeder könnte ein 
Schachprogramm schreiben

int main()
{
  play( "chess" );
}

Fertig.
Aber so einfach ist das nun mal nur auf der Enterprise.

von Εrnst B. (ernst)


Lesenswert?

Anton schrieb:
> sondern nur
> Hinweise

Also:
Schnapp dir eine Bibliothek zum parsen. SAX reicht, DOM wäre overkill. 
geeignet wäre z.B. das Urgestein "expat".

http://expat.sourceforge.net/

Dann Parser initialisieren,
einen character-data-handler setzen,
input reinstreamen,
fertig.

von datenrichtung (Gast)


Lesenswert?

Anton schrieb:
> Genau an dieser Stelle ist meine Frage . dieses Strukturierung
> (klammern) müssen von meinem C Programme code herausgefiltert werden und
> dann bleibt nur die brauchbaren Daten die in eine Text Datei geschrieben
> werden muss.
Du hast es doch schon erkannt: die Tags sind durch Spitze Klammern 
gekennzeichnet:
1
<tag>Ich bin ein Datensatz und möchte von Tags befreit werden!</tag>
Dann könnte dein Programm so aussehen:
1
für alle Zeichen:
2
    wenn Zeichen=='<':
3
        setze Flag
4
    wenn Flag gelöscht:
5
        schreibe Zeichen in Datei
6
    wenn Zeichen=='>'
7
        lösche Flag

Anton schrieb:
> welche c Funktion braucht man dafür????
überlegt doch mal der Reihe nach:
1. die Daten müssen eingelesen werden
2. die Daten müssen verarbeitet werden
3. die Daten müssen ausgegeben werden
Also musst du dich informieren über:
1. öffnen einer Datei
   lesen einer Datei
2. Stringverarbeitung bzw. XML Bibliothek
3. schreiben einer Datei

von Anton (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> eine XML Parser Library

ich muss kein XML Parser benutzen, sondern in C programmiern. kennst du 
funktionen die mir helfen kann

von xXx (Gast)


Lesenswert?

Egal was du da machst, ob beruflich oder schulisch - mach' was Anderes. 
Du bist dafuer nicht geeignet.

von DirkB (Gast)


Lesenswert?

Anton schrieb:
> ich muss kein XML Parser benutzen, sondern in C programmiern. kennst du
> funktionen die mir helfen kann

Schau mal bei http://www.cplusplus.com/reference/clibrary/ Dort sind die 
Funktionen aus der Standard C-Library erklärt. Mehr Funktionen gibt es 
erst mal nicht bei C. Wenn du andere Funktionen haben möchtest, musst du 
dir andere Libraries besorgen oder aus den Standardfunktionen selber 
schreiben.

Und wie mehrmals gesagt, gibt es auch Libraraies die XML parsen.

von Karl H. (kbuchegg)


Lesenswert?

Anton schrieb:
> Karl Heinz Buchegger schrieb:
>> eine XML Parser Library
>
> ich muss kein XML Parser benutzen,

Du musst nicht, aber du sparst dir viiiieeeel Arbeit, wenn du es tust.

> sondern in C programmiern. kennst du
> funktionen die mir helfen kann

Wo liegt das Problem?
Deinem Arbeitgeber gegenüber den Mund zu voll genommen, dass du 
programmieren könntest?
Dann wärs besser, wenn du ihm jetzt reinen Wein einschenkst. Er wird dir 
sowieso drauf kommen.
Für einen geübten C-Programmierer ist das eine Sache auf ein paar 
Nachmittage (1 bis 2), wenn er noch nie mit einem XML-Parser gearbeitet 
hat. Hat er das schon mal, ist das eine Sache auf 1 oder 2 Stunden. D.h. 
du bist nach 3 Tagen sowieso schon mehr als überfällig.

von ausfüllen (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wo liegt das Problem?
Das frage ich mich auch. Wenn es wirklich nur darum geht aus einer Datei 
wie
1
<xml>blabla
2
<irgendwas>blub<weiter>
3
lalala
sowas
1
blabla
2
blub
3
lalala
zu machen sind das selbst in C inkl. Fehlerbehandlung nur ~30 Zeilen 
(und das ist schon die ausführliche Variante). Ich habs gerade 
ausprobiert, inkl. Debuggen (es ist noch früh...) keine Viertelstunde.

Also, @TO, wo ist das Problem?

von Peter II (Gast)


Lesenswert?

ausfüllen schrieb:
> Ich habs gerade
> ausprobiert, inkl. Debuggen (es ist noch früh...) keine Viertelstunde.
und das Programm kommt mit xml-kommentaren und "<" im Text klar?

von ausfüllen (Gast)


Lesenswert?

Hm, da kommt mir eine gute Idee: Wie wäre es mit einem kleinen (I)OCC? 
Wer schreibst das kleinste/undurchsichtigste Programm was eine Datei wie 
oben von allen <bla> befreit?

Zeilenlänge sagen wir mal max. 250 Zeichen, Dateiname als ersten und 
einzigen Parameter, Fehlerbehandlung optional, Ausgabe auf stdout.

Hat jemand Langeweile?

von ausfüllen (Gast)


Lesenswert?

Peter II schrieb:
> ausfüllen schrieb:
>> Ich habs gerade
>> ausprobiert, inkl. Debuggen (es ist noch früh...) keine Viertelstunde.
> und das Programm kommt mit xml-kommentaren und "<" im Text klar?
Nö, aber das könnte man ja einbauen. "<" im Text muss ja irgendwie 
escaped sein, das sollte kein Problem sein das zu erkennen und wie die 
Kommentare aussehen müsste ich nachgucken (wie bei HTML?). Geschachtelte 
<> wären auch kein Problem, müsste nur zwei Zeilen ändern. War ja auch 
nur eine kleine Spielerei beim Frühstücken.

von Karl H. (kbuchegg)


Lesenswert?

Peter II schrieb:
> ausfüllen schrieb:
>> Ich habs gerade
>> ausprobiert, inkl. Debuggen (es ist noch früh...) keine Viertelstunde.
> und das Programm kommt mit xml-kommentaren und "<" im Text klar?

und mit Umlauten und Sonderzeichen? Zeilenumbrüche?
Kann Attribute auswerten, etc. etc.

Wenn man ein spezielles XML hat, bei dem man weiß, dass gewisse Dinge 
nicht vorkommen, ist das eine Sache. Aber ein XML-Parser macht solche 
Dinge eben aus dem Stand heraus richtig.

Was nicht heißt, dass man nicht einen einfachen XML Redaer selbst machen 
kann. Schon klar.

von Robert L. (lrlr)


Lesenswert?

und mit UTF-8 / UFT-16 ;-)

solange nicht klar ist, was das Programm machen soll, wir man dem TO 
nicht helfen können

von Karl H. (kbuchegg)


Lesenswert?

Robert L. schrieb:
> und mit UTF-8 / UFT-16 ;-)
>
> solange nicht klar ist, was das Programm machen soll, wir man dem TO
> nicht helfen können

Ich würds so formulieren:
So lange nicht klar ist, was das Programm machen soll, ist seine absolut 
beste Option, eine fertige XML Parser Lib zu benutzen.

Wenns allerdings eine Hausübung in seinem C-Kurs ist, die auf 
Stringverarbeitung und Filehandling abzielt, dann hat er ein Problem. 
Ein mächtiges Problem. Und das wird ihm hier keine lösen, denn recht 
viel mehr als Grundlagen in diesen beiden Bereichen braucht man dazu 
nicht. Ist einfach nur viel Arbeit.

von ausfüllen (Gast)


Angehängte Dateien:

Lesenswert?

Karl Heinz Buchegger schrieb:
> und mit Umlauten und Sonderzeichen? Zeilenumbrüche?
> Kann Attribute auswerten, etc. etc.
Ach menno, das war ne kleine Spielerei beim Frühstücken. maul ;-)

Umlaute, Sonderzeichen und Zeilenumbrüche sollten gehen, ich sehe da 
jetzt kein Problem, einzig > im Text mag das Ding nicht. Ach probiert es 
doch einfach selber, s. Anhang. Quellcode will ich nicht rausrücken 
solange der TO mitliest (wenn er es denn noch tut), der hochkomplexe 
Algorithmus wurde oben gepostet.

von Karl H. (kbuchegg)


Lesenswert?

ausfüllen schrieb:
> Karl Heinz Buchegger schrieb:
>> und mit Umlauten und Sonderzeichen? Zeilenumbrüche?
>> Kann Attribute auswerten, etc. etc.
> Ach menno, das war ne kleine Spielerei beim Frühstücken. maul ;-)

:-)
Ist schon klar.
(Ich möchte aber auch für den TO den Eindruck vermeiden, dass man sowas 
mal im Handumdrehen machen könne)

> Umlaute, Sonderzeichen und Zeilenumbrüche sollten gehen, ich sehe da
> jetzt kein Problem,

http://www.devtrain.de/artikel_296.aspx

von ausfüllen (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> (Ich möchte aber auch für den TO den Eindruck vermeiden, dass man sowas
> mal im Handumdrehen machen könne)
Ok, verstehe ich. Ob Handumdrehen oder nicht ist halt die Frage ob man 
wirklich "komplettes" XML braucht oder nur sowas wie ich oben gepostet 
habe.

> http://www.devtrain.de/artikel_296.aspx
Och nö, das ist ja Arbeit! :-) Auf strncpy und Co. hab ich heute keine 
Lust und ohne wird das wohl nichts...

von Karl H. (kbuchegg)


Lesenswert?

ausfüllen schrieb:
> Karl Heinz Buchegger schrieb:
>> (Ich möchte aber auch für den TO den Eindruck vermeiden, dass man sowas
>> mal im Handumdrehen machen könne)
> Ok, verstehe ich. Ob Handumdrehen oder nicht ist halt die Frage ob man
> wirklich "komplettes" XML braucht oder nur sowas wie ich oben gepostet
> habe.

Wenns wirklich eine Firmenarbeit ist, gehe ich jede Wette ein, dass es 
da noch so nette Nebenbedingungen gibt, wie zb Umstrukturieren der 
Eingabe in eine Record-Struktur im Textfile. Damit dann eben aus
1
<Lager>
2
  <Bauteil>
3
    <Name>M8-Schraube</Name>
4
    <Bestand>2850</Bestand>
5
    <Einkauf>Aldi Hamburg</Einkauf>
6
  </Bauteil>
7
  <Bauteil>
8
    <Name>Gabelschl&#252;ssel</Name>
9
    <Bestand>55</Bestand>
10
    <Einkauf>H&M Nord</Einkauf>
11
  </Bauteil>
12
</Lager>
so was wird (zb ein CSV File)
1
"M8-Schraube"; "Aldi Hamburg"; 2850
2
"Gabelschlüssel"; "H&M Nord"; 55

von ausfüllen (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wenns wirklich eine Firmenarbeit ist, gehe ich jede Wette ein, dass es
> da noch so nette Nebenbedingungen gibt, wie zb Umstrukturieren der
> Eingabe in eine Record-Struktur im Textfile.
Die Wette gewinnst du, das ist was für einen echten Parser.

Aber mal im IOCC-Stil, ich war mir sicher dass das ganze in eine Zeile 
passt, inklusive passende Geschichte zum Thema Schule.

Wer macht es besser?

SCNR :-)
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4
#define ausrechnen fgets
5
6
int main(int argv, char *argc[])
7
{
8
FILE *f;char zeile[250];"Mathestunde:";int i,v,l=0;"Lehrer: Was ist PI?",f=fopen(argc[1],"r");f==NULL?exit("Schüler:"):(void)0;for("PI ist:";ausrechnen(zeile,250,f);3.14)for("wenigstens",i=0;"so",i<strlen(zeile);(l+=(1*(zeile[i]=='<')-1*v=(zeile[i]=='>'))))?0:!v?printf("%c",zeile[i]):0,"ungefähr!",i++);fclose(f);return (int)"Schüler bekommt ne 1"*0;
9
}

von ausfüllen (Gast)


Lesenswert?

Argh, 4 Zeichen zu viel.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4
#define ausrechnen fgets
5
6
int main(int argv, char *argc[])
7
{
8
FILE *f;char zeile[250];"Mathestunde:";int i,v,l=0;"Lehrer: Was ist PI?",f=fopen(argc[1],"r");f==NULL?exit("Schüler:"):(void)0;for("PI ist:";ausrechnen(zeile,250,f);3.14)for("wenigstens",i=0;"so",i<strlen(zeile);(l+=((zeile[i]=='<')-(v=zeile[i]=='>'))))?0:!v?printf("%c",zeile[i]):0,"ungefähr!",i++);fclose(f);return (int)"Schüler bekommt ne 1"*0;
9
}

Jetzt muss ich erstmal einkaufen. :-(

von ausfüllen (Gast)


Lesenswert?

OK, zeile hätte man noch durch z ersetzen können und der eine Cast auf 
void ist wohl überflüssig.

von Εrnst B. (ernst)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wenns wirklich eine Firmenarbeit ist, gehe ich jede Wette ein, dass es
> da noch so nette Nebenbedingungen gibt, wie zb Umstrukturieren der
> Eingabe in eine Record-Struktur im Textfile

Wenns aber eine Firmenarbeit ist, dann ist dem Scheffe egal, ob's mit C 
oder z.B. mit xslt gelöst wird.

Notfalls : Per "system" o.Ä. einfach xsltproc aus C heraus ausführen ;)

von Robert L. (lrlr)


Lesenswert?

> dann ist dem Scheffe egal,

sollte es ihm aber nicht sein (ich mein jetzt allgemein, nicht in diesem 
Zusammenhang..)

wenn man für jeden "sch.." eine neues "Werkzeug" verwendet hast du 
irgendwann so einen Haufen an unterschiedlichen Sachen zu warten (bzw. 
brauchst auch leute die sich auskennen usw.)

deshalb ist es sicher oft besser, man nimmt etwas das man schon in 
Verwendung hat (auch wenn es nicht 100% passt)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Robert L. schrieb:
> wenn man für jeden "sch.." eine neues "Werkzeug" verwendet

Naja, XML ist aber mittlerweile weit davon entfernt, unter "jeder
Sch..." zu rangieren, und XSL ist die erste Wahl, wenn man XML-Daten
nachbearbeiten will.  Das Problem des TE ließe sich damit nämlich
gänzlich ohne Programmierung mit folgendem Einzeiler lösen:
1
echo '<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"></xsl:stylesheet>' |\
2
xsltproc - myxmfile.xml

von Karl H. (kbuchegg)


Lesenswert?

Jörg Wunsch schrieb:

> Naja, XML ist aber mittlerweile weit davon entfernt, unter "jeder
> Sch..." zu rangieren, und XSL ist die erste Wahl, wenn man XML-Daten
> nachbearbeiten will.

Allerdings.

Drum werd ich auch aus dem Urposting nicht wirklich schlau

Zum einen passt das Beharren auf "ich MUSS C benutzen" nicht wirklich zu 
einer beruflichen Situation. Warum muss er? In einer Firmensituation 
kommt es auf das Ergebis an.
Auf der anderen Seite ist das für einen Studenten, der gerade mit C 
angefangen hat, viel zu schwer (wenn man es ordentlich macht). Und wenn 
ein Student schon einigermassen programmieren kann, dann sollte das 
eigentlich nicht zur Frage "Wie fange ich an?" führen.

Wie ich anfangen würde, weiß ich - wenn ich das selber ausprogrammieren 
müsste. Ich würde das erst mal als Syntaxparsing Problem auffassen, EBNF 
für XML aufstellen und meine Compilerbautools drauf loslassen um einen 
Parser zu generieren :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Auf der anderen Seite ist das für einen Studenten, der gerade mit C
> angefangen hat, viel zu schwer (wenn man es ordentlich macht).

Wenn man aber nicht auf 23000 Sonderfälle wie absurde encodings und
dergleichen achten muss (weil's eh' nur eine Übungsaufgabe ist), dann
ist es natürlich eine relativ einfache Übung zur Datei- und simplen
Textverarbeitung in C:
1
int main(){int f=0;while(read(0,&f,1))if((f&255)=='\74')f=01000;else if(f==0x23e)f=0;else write(1,&f,1);}

(Ich hoffe mal, dass der Lehrer dieses Geschreibsel nicht durchgehen
lassen würde. :-)  Randbedingung: muss auf einer little-endian
Maschine laufen; wird als Filter benutzt, also mit stdin/stdout.)

von ausfüllen (Gast)


Angehängte Dateien:

Lesenswert?

Jörg Wunsch schrieb:
>
1
> int main(){int f=0;while(read(0,&f,1))if((f&255)=='\74')f=01000;else
2
> if(f==0x23e)f=0;else write(1,&f,1);}
3
>
Liegts an mir oder geht das nicht richtig? (s. Anhang) Das Flag was du 
da setzt (=01000 - oktal kommt selten vor!) wird ja von read wieder 
flachgebügelt... Oder ist mein PC big-endian?

von Εrnst B. (ernst)


Lesenswert?

<we<it>er> ist kein gültiges XML, insofern ist es OK wenn da ein ">" 
stehen bleibt... Eigentlich müsste das Program die "Annahme verweigern", 
wenn es sich "XML-Konform" schimpfen möchte...

von Robert L. (lrlr)


Lesenswert?

ich glaub es sollte f=010000 lauten

von Robert L. (lrlr)


Lesenswert?

und hier:
f==0x23e

müsste doch f==0x13e

oder ?

von ausfüllen (Gast)


Lesenswert?

Εrnst B✶ schrieb:
> <we<it>er> ist kein gültiges XML, insofern ist es OK wenn da ein ">"
> stehen bleibt... Eigentlich müsste das Program die "Annahme verweigern",
> wenn es sich "XML-Konform" schimpfen möchte...

Stimmt schon wenn du das sagst, aber guck mal genauer: Das Programm 
entfernt nur '<' und '>', nicht die Zeichen die dazwischen sind.

Ich hab meine Version mal umgebaut, wer bietet weniger? Los, ich will 
mal wissen wie das die Profis mit >100kLOC IOCC-mäßig lösen!
1
int main(){char i,v,l=0;while(read(0,&i,1))(l+=(i==60)-(v=(i==62)))?0:!v?write(1,&i,1):0;}

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

ausfüllen schrieb:
> Das Flag was du
> da setzt (=01000 - oktal kommt selten vor!) wird ja von read wieder
> flachgebügelt...

Sollte nicht: read liest ja nur ein Byte, aber 01000 liegt im zweiten
Byte.  Aber du hast natürlich Recht, ein Logikfehler war noch drin.
Hier also meine korrigierte Version:
1
int main(){int f=0;while(read(0,&f,1))if((f&255)=='\74')f=01000;else if(f==0x23e)f=0;else if(f<255)write(1,&f,1);}

Aber ich muss neidlos zugeben, deine ist noch schöner geworden. ;-)

von ausfüllen (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> ausfüllen schrieb:
>> Das Flag was du
>> da setzt (=01000 - oktal kommt selten vor!) wird ja von read wieder
>> flachgebügelt...
>
> Sollte nicht: read liest ja nur ein Byte, aber 01000 liegt im zweiten
> Byte.
Wow, da muss man erstmal drauf kommen! Respekt, ein echter C-Profi.

> Aber ich muss neidlos zugeben, deine ist noch schöner geworden. ;-)
:-) Mal sehen ob Karl-Heinz auch noch dazukommt, bin gespannt.

von Karl H. (kbuchegg)


Lesenswert?

ausfüllen schrieb:

>> Aber ich muss neidlos zugeben, deine ist noch schöner geworden. ;-)
> :-) Mal sehen ob Karl-Heinz auch noch dazukommt, bin gespannt.

War grad in einer Besprechung.

Uff. Da hast du ja schon ganz schön was vorgelegt. Mal sehen ob mir da 
noch was dazu einfällt :-)

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:
> ausfüllen schrieb:
>
>>> Aber ich muss neidlos zugeben, deine ist noch schöner geworden. ;-)
>> :-) Mal sehen ob Karl-Heinz auch noch dazukommt, bin gespannt.
>
> War grad in einer Besprechung.
>
> Uff. Da hast du ja schon ganz schön was vorgelegt. Mal sehen ob mir da
> noch was dazu einfällt :-)

Das ist natürlich schon verdammt kreativ
1
(l+=(i==60)-(v=(i==62)))?0:!v?write(1,&i,1):0;

(wozu du das v brauchst hab ich noch nicht durchschaut)

Hmm. Ausnutzen der Shortcut-Evaluation von && bzw. ||
1
(l+=(i==60)-(v=(i==62)))?0:!v&&write(1,&i,1);

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:

> (wozu du das v brauchst hab ich noch nicht durchschaut)

ok, habs

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:


> Hmm. Ausnutzen der Shortcut-Evaluation von && bzw. ||
>
1
> (l+=(i==60)-(v=(i==62)))?0:!v&&write(1,&i,1);
2
>


Das müsste aber auch mit dem ersten ? gehen
1
!(l+=(i==60)-(v=(i==62)))&&!v&&write(1,&i,1);

Schaut aber besser noch mal drüber. 100% sicher bin ich mir nicht.

(&& ist ein Sequence Point, die Änderung und Abfrage von v ist daher 
legal und definiert)

von ausfüllen (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Das müsste aber auch mit dem ersten ? gehen
>
>
1
> !(l+=(i==60)-(v=(i==62)))&&!v&&write(1,&i,1);
2
>
>
> Schaut aber besser noch mal drüber. 100% sicher bin ich mir nicht.
Passt. Verflixt, ein Zeichen besser/kürzer. Irgendwann krieg ich dich 
mal!

von Karl H. (kbuchegg)


Lesenswert?

ausfüllen schrieb:

> Passt. Verflixt, ein Zeichen besser/kürzer. Irgendwann krieg ich dich
> mal!


Ach, das ist nicht schwer. So gut bin ich nicht.

Dafür müsste man noch was kürzeres finden
l+=(i==60)-(v=(i==62))

Ich geh jetzt erst mal eine rauchen :-)

von ausfüllen (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Dafür müsste man noch was kürzeres finden
> l+=(i==60)-(v=(i==62))
Ich bin jetzt bei Gleichstand, mal sehen ob man das noch optimieren 
kann... Code folgt.

von ausfüllen (Gast)


Lesenswert?

OK, jetzt führe ich. :-) 86 Zeichen.
1
int main(){char i,v,l=0;while(read(0,&i,1))!(l+=!(i^60)-!(v=i^62))&&v&&write(1,&i,1);}

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Wird wenn kein return-type angegeben wird nicht implizit int angenommen? 
Würde nochmal 4 Zeichen sparen ;)

von ausfüllen (Gast)


Lesenswert?

Läubi .. schrieb:
> Wird wenn kein return-type angegeben wird nicht implizit int angenommen?
> Würde nochmal 4 Zeichen sparen ;)

Stimmt, habs gerade ausprobiert.

Aber das Ganze ist sowieso nicht ganz koscher, der GCC beschwert sich 
vollkommen zu Recht dass kein Rückgabewert angegeben ist.
>warning: control reaches end of non-void function

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

ausfüllen schrieb:

> Aber das Ganze ist sowieso nicht ganz koscher, der GCC beschwert sich
> vollkommen zu Recht dass kein Rückgabewert angegeben ist.

Klar, es gibt ja noch genügend weitere Schweinereien da drin, wie
die Benutzung nicht deklarierter Funktionen.  Aber wir wolltem dem
OP ja auch hier nicht seine Hausaufgaben abgabefertig erledigen. :-)

von Peter II (Gast)


Lesenswert?

ausfüllen schrieb:
> Aber das Ganze ist sowieso nicht ganz koscher, der GCC beschwert sich
> vollkommen zu Recht dass kein Rückgabewert angegeben ist.
das ist die Frage ob es c oder c++ ist. Bei c++ muss main kein return 
haben (auch bei int).

von Dani Zwirner (Gast)


Lesenswert?

Hallo zusammen

Ich habe mit grossem Vergnügen Eure Lösungen verfolgt und möchte mit 
meiner Version die Latte auf 73 Zeichen setzen:
1
main(){char i,x=0;while(read(0,&i,1))i==60?x=1:x?i==62?x=0:0:putchar(i);}

von guenther (Gast)


Lesenswert?

Irgendwie erinnert mich der TE an das hier:
Beitrag "rfid mit mc controller anschliessen und programieren"

von Peter II (Gast)


Lesenswert?

jetzt wollte ich es aber wissen:
1
main(i,t){for(;read(0,&i,1);t&=!(i==60),write(1,&i,t),t|=i==62);}

[schon patentiert]

von Peter II (Gast)


Lesenswert?

noch eins weniger:
1
main(i,t){for(;read(0,&i,1);write(1,&i,t),t|=i==62)t&=!(i==60);}

von Peter II (Gast)


Lesenswert?

so das wars aber für jetzt erstmal
1
main(i,t){for(;read(0,&i,1);write(1,&i,t),t|=i==62)t&=i!=60;}

von ausfüllen (Gast)


Lesenswert?

Peter II schrieb:
> so das wars aber für jetzt erstmal
>
> main(i,t){for(;read(0,&i,1);write(1,&i,t),t|=i==62)t&=i!=60;}

Boah!! Mehr fällt mir da nicht mehr ein, ich kann halt nicht mit den 
Profis mithalten. Respekt!

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Ja lustig. Aber wäre Kranke oder sagen wir 'auffällig' nicht besser?
Wird euer Code dann auch entsprechend kurz an Laufzeit und 
Assemblercode?

Jedenfalls auch ne Form von Verschlüsselung. Schön zippen vielleicht 
noch.


Habe gerade mal ausprobiert was der Web-Browser dazu sagt: Der machts 
anscheinend von ganz alleine. Wiki meinte er bräuche dafür ein extra 
Tag.

von ausfüllen (Gast)


Lesenswert?

Abdul K. schrieb:
> Ja lustig. Aber wäre Kranke oder sagen wir 'auffällig' nicht besser?
Da gibt es schlimmere "Krankheiten"... Kennst du IOCC?

> Wird euer Code dann auch entsprechend kurz an Laufzeit und
> Assemblercode?
Gute Frage. A propos Assembler, das wäre auch noch eine Herausforderung 
(bin aber raus, kann nur AVR ASM).
>
> Jedenfalls auch ne Form von Verschlüsselung. Schön zippen vielleicht
> noch.
Verschlüsselung!?! Ich bitte dich, die Version von Peter II mit ein paar 
Zeilenumbrüchen und Leerzeichen versehen ist doch klar und einfach 
nachzuvollziehen (das war aber auch ein Geniestreich das write in den 
Kopf der Schleife zu packen!)


> Habe gerade mal ausprobiert was der Web-Browser dazu sagt: Der machts
> anscheinend von ganz alleine. Wiki meinte er bräuche dafür ein extra
> Tag.
Was macht der?

von Ersa (Gast)


Lesenswert?

Abdul, die Herren üben sich gerade im Wettbewerb "C-Hacker of the day".

Übersichtlicher als die heutzutage gerne gescholtenen 
goto-BASIC-Kauderwelsch-Konstrukte der Fans unlesbaren Spaghetticodes 
ist das aber wahrlich auch nicht!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ersa schrieb:
> Übersichtlicher als die heutzutage gerne gescholtenen
> goto-BASIC-Kauderwelsch-Konstrukte der Fans unlesbaren Spaghetticodes
> ist das aber wahrlich auch nicht!

Das war ja auch nicht der Sinn der Übung. ;-)  Das überlassen wir
gern dem TE, der bitteschön seine Hausaufgaben selbst lösen möge.
Letztendlich laufen all diese "kranken" Lösungen ja auf das in
diesem Posting schon gegebene Kochrezept hinaus:

Beitrag "Re: xml datei einlesen und in Textdatei umwandeln"

Als Übung für die Programmiersprache C taugt so ein Wettbewerb
natürlich allemal (der IOCCC wurde ja nun schon ein paar Jahre lang
nicht mehr ausgetragen), auch wenn natürlich niemand, der bei Trost
ist, in der Realität sowas hinschreiben würde.

Auf die Idee, die Argumente von main() als Variablen zu missbrauchen,
war ich auch schon gekommen, allerdings war mir nicht mehr bewusst,
dass man diese bei K&R-Style-Funktionsköpfen ja nicht zwingend
deklarieren muss.  Damit spart man natürlich dann nochmal. ;-)

Peter, bitte benutze künftig [c]-Markierungen.  Ich habe die mal
nachgereicht.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

wieso? ist doch lesbar? Allerdings werden einige Compiler da ein wenig 
mosern :-)
1
main(i,t)
2
{
3
  for(; read(0, &i, 1); write(1, &i, t), t |= i==62)
4
    t &= i!=60;
5
}


---
Ich stand nach Experimenten mit dem MS Managed XML Reader (schweinelahm, 
ok, auch wegen der Marshal-Funktionen, um wieder nach C (char *) zu 
kommen) auch mal vor der Entscheidung: "Xerces oder was eigenes?" und 
hab mich dann entschieden, nen eigenen XML reader zu schreiben. Das ist 
gar nicht mal schwer. Der ist so kompakt, dass er weniger Code braucht, 
als für die Initialisierung von Xerces benötigt wird **LOL**.

Falls es jemandem was sagt, der Reader steckt im SVDConv und liesst 
CMSIS - SVD xml Dateien ein, interpretiert sie, und generiert C 
Headerfiles und was proprietäres.


VG,
/th.

von Karl H. (kbuchegg)


Lesenswert?

1
  ..... write(1,&i,t) ....

geniale Idee, die Entscheidung ob geschrieben werden muss oder nicht, 
dem write mit dem Argument t selbst zu überlassen.

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Erinnert mich irgendwie an Assembler-Code, der den nachfolgenden Code 
als Daten hinter sich reinschreibt. Kein Cache-Dirty gesetzt und die 
68040 beschwerte sich...
Der Anwender sah dann 'effektiven' Absturz.

von Karl H. (kbuchegg)


Lesenswert?

> auch wenn natürlich niemand, der bei Trost ist, in der Realität
> sowas hinschreiben würde.

Natürlich nicht.
Aber das wirklich geniale an solchen Spielereien besteht darin, dass man 
die Sprache mit all ihren Feinheiten und manchmal auch obskuren 
Nebeneffekten bis in den letzten Winkel beherrschen muss bzw. das 
'Decodieren' solcher Dinge einem recht schonungslos seine Schwächen 
desselben aufzeigt.

Zb muss ich mir hier

   .... i==60?x=1:x?i==62?x=0:0:putchar(i);

nochmal die ?: Syntax genauer ansehen. Es sieht alles logisch aus, dann 
aber rinnt mir eine Gänsehaut den Buckel runter, wenn ich die beiden : : 
da am Ende betrachte.

Und zu guter letzt sieht man dann so manchesmal auch einen "Trick", den 
man tatsächlich gut gebrauchen kann.

von dall (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> (der IOCCC wurde ja nun schon ein paar Jahre lang
> nicht mehr ausgetragen)

Da freut es dich vielleicht zu hören dass es ihn wieder gibt: 
http://www.ioccc.org/

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.