INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
gsucht: internals zu fprintf) und scanf()
24.02.2015, 17:27 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015 17:33 von HaWe.)
Beitrag #1
gsucht: internals zu fprintf) und scanf()
hallo,
ich versuche ja immer noch mimics von fprintf() und fscanf() zu implementieren.

ich habe ntl die entsprechenden Seiten in cplusplus.com etc gelesen, aber ganz klar ist es mir nicht...

Meine Frage also an die C-Profis, erstmal zu fprintf:

wenn ich mit Standard-ANSI-C per fprintf mehrere Variablen auf einen Rutsch in ein File schreibe
Beispiel:
fprintf (myFile, "%s %d %f %f", "Test", 2, 3.14159265, 1.1);


1.) welche Trennzeichen werden standardmäßig verwendet?
(ein Leerzeichen ? oder ein Komma? oder Tabs '\t' ? oder '\0' oder was ? )

2.) Was steht am Schluss der Reihe (hinter der letzten Variable) an zusätzlichen Steuerzeichen ?
ein'\n' oder ein '\0' oder ein'\r' oder eine Kombination ?

3.) hat ein string innerhalb dieser Reihe eine zusätzliche Nullterminierung, bevor der Begrenzer kommt?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 17:42
Beitrag #2
RE: gsucht: internals zu fprintf) und scanf()
Hi,
warum sollte das irgendwelche Begrenzer reinschreiben, die nicht im Formatstring stehen? Ich hoffe doch mal nicht.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 18:07 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015 18:10 von HaWe.)
Beitrag #3
RE: gsucht: internals zu fprintf) und scanf()
hoffen tu ich es auch nicht, aber hoffen heißt nicht wissen Wink

irgendwas muss aber ja zwischen den Variablen stehen, sie werden kaum dicht an dicht geschrieben werden.
Dann ist eben genau die Frage, ob fprintf ähnlich wie bei SD.println noch ein \n nach jeder Schreibaktion dazupackt, um hier quasi "Zeilen-weise" die Eingaben zu trennen.

Hinterher muss es ja kompatibel zu fscanf sein, und auch hier stellt sich dann die Frage, wie fscanf nach Formatstring die verschiedenen Variablen getrennt erkennt.
Folgen z.B. eine Float- und eine Integerzahl direkt nacheinander, muss fscanf ja erkennen können, wo bei 3.1234200 die Floatzahl aufhört und die Integerzahl beginnt - also ein zusätzliches Trennzeichen muss auf jeden Fall hinter jeder Variablen eingefügt werden; dieses wird aber nicht im fprintf-Formatstring explizit vorgeschrieben. Wie könnte das sonst bei "%s%f%s geschehen - was darf sein, was muss sein?

Also die 1. Frage ist die nach den speziellen Trennzeichen (implizit oder explizit?).
Dann die Frage, ob Strings Nullterminiert gespeichert werden oder nur als Buchstaben-Array.
Dann die Frage, ob jeder einzelne Aufruf noch am Schluss ein CR dazuschreibt, genau wie die SD-println-Methode (heißt die so? bin mir jetzt unsicher)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 18:23 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015 18:25 von Thorsten Pferdekämper.)
Beitrag #4
RE: gsucht: internals zu fprintf) und scanf()
(24.02.2015 18:07)HaWe schrieb:  irgendwas muss aber ja zwischen den Variablen stehen, sie werden kaum dicht an dicht geschrieben werden.

Natürlich schreibt es "dicht an dicht". Mit Deinem Formatstring sind natürlich spaces dazwischen, aber am Ende ist keins mehr. D.h. so: "%s %d %f %f" schreibt es spaces dazwischen, und so: "%s%d%f%f\n" macht es dicht an dicht und am Ende einen Zeilenvorschub.

Zitat:Dann ist eben genau die Frage, ob fprintf ähnlich wie bei SD.println noch ein \n nach jeder Schreibaktion dazupackt, um hier quasi "Zeilen-weise" die Eingaben zu trennen.
Wie gesagt: Ich würde sagen, nein. println ist was anderes. Das "ln" am Ende steht für line-feed. Hast Du Dich noch nie gewundert, warum es print und println gibt?

Zitat:Hinterher muss es ja kompatibel zu fscanf sein, und auch hier stellt sich dann die Frage, wie fscanf nach Formatstring die verschiedenen Variablen getrennt erkennt.
Folgen z.B. eine Float- und eine Integerzahl direkt nacheinander, muss fscanf ja erkennen können, wo bei 3.1234200 die Floatzahl aufhört und die Integerzahl beginnt - also ein zusätzliches Trennzeichen muss auf jeden Fall hinter jeder Variablen eingefügt werden; dieses wird aber nicht im fprintf-Formatstring explizit vorgeschrieben. Wie könnte das sonst bei "%s%f%s geschehen - was darf sein, was muss sein?
Wenn Du im fprintf "dicht an dicht" schreibst, dann hat scanf logischerweise keine Chance. Es dürfte auch schiefgehen, wenn Du unterschiedliche Trennzeichen verwendest. Die Formatstrings müssen kompatibel sein.

Zitat:Also die 1. Frage ist die nach den speziellen Trennzeichen (implizit oder explizit?).
Explizit.

Zitat:Dann die Frage, ob Strings Nullterminiert gespeichert werden oder nur als Buchstaben-Array.
Eine Null in einem Textfile sollte man nicht machen. Das könnte als Dateiende interpretiert werden.

Zitat:Dann die Frage, ob jeder einzelne Aufruf noch am Schluss ein CR dazuschreibt, genau wie die SD-println-Methode (heißt die so? bin mir jetzt unsicher)
Nur die Methoden/Funktionen, die ein "ln" am Ende haben, schreiben auch ein "\n". Du kannst aber das "\n" immer explizit im Formatstring angeben.
Gruß,
Thorsten

Hi,
ansonsten:
http://mirror.fsf.org/pmon2000/3.x/src/lib/libc/scanf.c
http://mirror.fsf.org/pmon2000/3.x/src/l.../fprintf.c

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 18:40
Beitrag #5
RE: gsucht: internals zu fprintf) und scanf()
ok, danke, es wird langsam klarer...

mit den Strings habe ich noch ein Problem.
Wenn ich einen ANSI-C-string habe, dann ist der ja ^0 terminiert.
wenn ich ihn jetzt an fprintf übergebe, hätte ich erwartet, dass er auch ^0-terminiert ins File geschriebn wird...(?)
ansonsten müsste fprintf ja das letzte ^0 Zeichen der Zeichenkette herauslöschen - tut es das?

was ist genau das EOF Zeichen bei C?
^0 (kenne ich bisher nur als Ende einer Zeichenkette = String) ?
oder ^3 (=ETX)?
oder ^4 (=EOT)?
oder^23 (=end of transmission block)?
oder ^28 (=File seperator)? <<< hatte ich bis jetzt als EOF vermutet

Innerhalb eines Files gibt es ja noch untergeordnete Trennzeichen, die fallen sicher raus (^29, ^30, ^31)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 18:53
Beitrag #6
RE: gsucht: internals zu fprintf) und scanf()
(24.02.2015 18:40)HaWe schrieb:  Wenn ich einen ANSI-C-string habe, dann ist der ja ^0 terminiert.
wenn ich ihn jetzt an fprintf übergebe, hätte ich erwartet, dass er auch ^0-terminiert ins File geschriebn wird...(?)
ansonsten müsste fprintf ja das letzte ^0 Zeichen der Zeichenkette herauslöschen - tut es das?
Nein, es löscht nichts, es schreibt die Null nur nicht.

Zitat:was ist genau das EOF Zeichen bei C?
Ich glaube, es gibt nicht wirklich ein EOF-Zeichen. Aber stell Dir mal vor, Du liest ein ganzes File in einen String, da Du annimmst, dass es ein Textfile ist. Jetzt steht irgendwo mittendrin ein \0. Dann geht das natürlich schief.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 19:18 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015 19:19 von rkuehle.)
Beitrag #7
RE: gsucht: internals zu fprintf) und scanf()
EOF ist kein Charakter, sondern per Definition ein "generiertes Etwas" welches ungleich jedes durch das benutzte System darstellbaren Character Codes ist.
In Folge ist EOF systemabhängig, in den meisten Fällen jedoch -1.
Letztlich ist es eine Return-Condition die von allen ausgebenden Funktionen des benutzten Systems zurückgegeben wird sobald kein Zeichen mehr als Input für die ausgebende Funktion verfügbar ist.
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 19:37 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015 19:38 von HaWe.)
Beitrag #8
RE: gsucht: internals zu fprintf) und scanf()
hi,
danke für eure Antworten.
Ich habe da aber immer noch Verständnisprobleme:

1.) zur String-Nullterminierung in Textfiles mit mehreren Strings:
gesetzt den Fall, ich schreibe per fprintf mehrere Strings hintereinander per Formatstring "%s %s %s..."

Wie soll anschließend fscanf per "%s %s %s..." erkennen, wo ein String aufhört und der nächste anfängt, wenn nicht durch eine Nullterminierung?
ein Leerzeichen könnte ja auch noch zum Textstring gehören, und eine Stringlänge (wie bei Pascal-Strings) sind ja nicht Teil der jew. Zeichenkette, also weiß man ja am Anfang noch nicht, wo ein String später aufhört.

2.) zu eof():
ich habe die Daten ja physikalisch byte-weise auf dem Datenträger vorliegen, hier sind die bitkombinationen 0x00 (=0) bis 0xff (=255) möglich. Ein -1 gibt es aber nicht.

Wenn nun der Lesekopf über die gespeicherten Bytes fährt und die Daten liest (was anderes als gespeicherte Bytes lesen kann er doch nicht. oder...? ) per
while(!eof() ) {...}
, muss er doch an einem Marker-Byte erkennen können, wo das File zuende ist? sonst würde er doch bis zum Plattenende lesen und vorher nie das Ende finden?
-1 als signed char entspräche aber der Byte-Schreibweise 0xff also == 255...
255 ist aber ein gültiger Bytewert, der innerhalb eines Files erlaubt sein muss.
Was genau ist also dann -1 ? oder eof() ?

Ist vllt eof() eine eindeutige Kombination mehrerer Bytes, wie z.B. ^0^0 ?
denn mehrere durch einzelne ^0-begrenze Zeichenketten müssten ja erlaubt sein (s. 1.) )
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  sprintf() plus scanf() : ständig Fehler, warum? HaWe 15 1.817 28.02.2015 15:31
Letzter Beitrag: HaWe

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste