Forum: PC-Programmierung fscanf - Abbruchbedingung while-Schleifenkörper


von Matthias (Gast)


Lesenswert?

Guten Abend.

In einem Beispiel mit fscanf, bei dem Daten aus einer csv-Datei 
ausgelesen werden, bricht die while-Schleife bei Erreichen der Bedingung 
!= EOF ab.

Ein gängiges Beispiel, welches man fast bei allen üblichen/gängigen 
verdächtigen c-Autoren zu finden ist.

Nun habe ich das Problem, dass ich fscanf gerne im Rahmen eines 
Eventhandlers einsetzen würde, welcher im Falle eines Events Meldungen 
in der Shell ausgibt, welche dann widerum via fscanf auf einen Buffer 
geschrieben werden sollen.

Welches Abbruchkriterium habe ich denn hier?
1
while(fscanf() != ???)

Vielleicht \r\n, weil die Shell ja jedes event in einer neuen Zeile 
ausgibt?

von Peter II (Gast)


Lesenswert?

Matthias schrieb:
> Welches Abbruchkriterium habe ich denn hier?

warum willst du überhaupt abbrechen?

von Matthias (Gast)


Lesenswert?

Bei jedem Event wird eine Zeile in der Standardausgabe ausgegeben, 
welche ich mittels fscanf in eine File schreiben möchte.

Das Zeilenende ist das Abbruchkriterium.

von Peter II (Gast)


Lesenswert?

Matthias schrieb:
> Das Zeilenende ist das Abbruchkriterium.

nein ist es nicht.


Das Abbruchkriterium ist, wenn die Pipe geschlossen wird. (müsste auch 
EOF sein).

du willst einfach jeden Zeile einlesen, dafür braucht man keine 
Abbruchbedingung.

von Matthias (Gast)


Lesenswert?

Sorry und wie würdest Du dann mittels fscanf die Zeilen einlesen? Kurzes 
Example?

von Peter II (Gast)


Lesenswert?

Matthias schrieb:
> Sorry und wie würdest Du dann mittels fscanf die Zeilen einlesen? Kurzes
> Example?

genauso wie du in jedem Beispiel findest. Es gibt kein unterschied ob du 
von einer Datei oder einer pipe einliest.

Du solltest erst mal hinschreiben, wie du dir genau deinen Aufruf 
vorstellt.

von Matthias (Gast)


Lesenswert?

1
while(fscanf(SDTIN, "%s\n",buffer) != EOF)

so in etwa.

von Peter II (Gast)


Lesenswert?

Matthias schrieb:
> while(fscanf(SDTIN, "%s\n",buffer) != EOF)
>
> so in etwa.

grundsätzlich ja, aber %s bedeutet bis zum ersten Leerzeichen. Das 
willst du vermutlich nicht. Verwende lieber fgets

von hansworst (Gast)


Lesenswert?

1
 fscanf(SDTIN, "%s\n",buffer)

Finger weg von der Tastatur. Jemand der so Programmiert sollte nicht 
Programmieren, bevor er nicht gelesen hat was ein String, ein Array und 
was ein Bufferoverflow ist und warum man sowas unbedingt vermeiden 
sollte.

Bessere Lösung:
1
 fgets(buffer,BUFSIZE,stdin)

nebenbei bemerkt, stdin wird wird nicht so geschrieben.

von MaWin (Gast)


Lesenswert?

Matthias schrieb:
> Welches Abbruchkriterium habe ich denn hier?

Irrelevant, denn wie willst du die vom Event-Handler in die shell 
geschriebene Ausgabbe in dein fscnaf bekommen ?

fscanf liest nicht von der shell, sondern aus einer Datei.

Und selbst wenn der event-Handler in stdout geschruieben hat, kommt dein 
fscanf noch lange nicht per stdin an die Daten.

Und wenn du eine Inter-Process-Pipe aufbaust, klönnten zwar die Daten 
von einem in die Pipe geschriebn  werden und von anderen geelesen 
werden, aber sie kommen nie in die shell.

SO geht es also schon mal nicht.

Hast du die Datenzeile auf welche Art auch immer bekommen, dann hilft 
ein sscanf, um sie zu zerlegen.

Wenn es aber wirklich CSV-Format sein sollte, reicht ein sscanf mit 
seinen Formaten nicht, um legale CSV auch fehlerfrei und decodiert 
einzulesen. Da braucht man schon einen CSV-Parser, der Leerzeichen 
überspringt, Gänsefüsschen entfernt, Escapes berücksichtigt, und 
vielleicht sogar den Zeichensatz transponiert.

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.