mikrocontroller.net

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


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
while(fscanf() != ???)

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

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias schrieb:
> Welches Abbruchkriterium habe ich denn hier?

warum willst du überhaupt abbrechen?

Autor: Matthias (Gast)
Datum:

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

Autor: Peter II (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

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

Autor: Peter II (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
while(fscanf(SDTIN, "%s\n",buffer) != EOF)

so in etwa.

Autor: Peter II (Gast)
Datum:

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

Autor: hansworst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 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:
 fgets(buffer,BUFSIZE,stdin) 

nebenbei bemerkt, stdin wird wird nicht so geschrieben.

Autor: MaWin (Gast)
Datum:

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

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.