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, 19:47
Beitrag #9
RE: gsucht: internals zu fprintf) und scanf()
(24.02.2015 19:37)HaWe schrieb:  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?
Durch die Blanks, die Du im Formatstring angegeben hast.

Zitat: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.
Whitespace in Strings kann fscanf anscheinend nicht so einfach. Siehe hier: http://www.cplusplus.com/reference/cstdio/fscanf/
Zitat:Any number of non-whitespace characters, stopping at the first whitespace character found. A terminating null character is automatically added at the end of the stored sequence.

Zitat: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.
Genau, und deswegen eignet sich -1 als "EOF".

Zitat: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?
Woher das Betriebssystem weiß, wo eine Datei aufhört, ist eine andere Geschichte. Auf jeden Fall wäre es ungeschickt, das an irgend etwas festzumachen, was man in die Datei reinschreiben kann. Das wäre ja geradezu bescheuert.

Zitat: 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() ?
Siehe rkuehles Antwort.

Zitat: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.) )
Nein, EOF kann einfach nicht in die Datei geschrieben werden.

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:55 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015 20:08 von HaWe.)
Beitrag #10
RE: gsucht: internals zu fprintf) und scanf()
es können aber auf dem Datenträger doch nur Bytes gespeichert werden - dann kann eof() aber kein Byte mit -1 sein, - wie sonst (wenn nicht als Byte) sollte es sonst physikalisch auf der Festplatte codiert sein?
Andererseits: wenn eof() kein ^0 ist, dann dürfte man ^0 ja auch als Trenner verwenden, denn dann könnte es ja auch nicht als eof() missinterpretiert werden, wie du oben schriebst.


man müsste wirklich mal in ein C-File reinschauen, was fprintf macht, wenn man mehrere strings hintereinander speichert. Ich habe leider nicht genug C-Kenntnisse und Möglichkeiten, das selber zu testen. Vermutungen sind mir da ehrlich gesagt zu unsicher.

es wäre höchstens vorstellbar, dass die Adresse von eof genau wie der File-Anfang in einer FAT o.ä. gespeichert wird und auf diese Weise erkannt wird - auch dann wäre aber ein ^0 innerhalb eines Files ungefährlich...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 20:34 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015 20:42 von rkuehle.)
Beitrag #11
RE: gsucht: internals zu fprintf) und scanf()
Zitat: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?
Wenn du hier guckst: http://www.cplusplus.com/reference/cstdio/fscanf/ und auf den Parameter "Format" schaust, erkennst du wie du die Datei schreiben musst um zu garantieren, dass fscanf die richtigen Ergebnisse bringt.
Die Definition zu EOF steht in der stdio.h:
Code:
#define __SEOF    0x0020        /* found EOF */
Am wichtigsten hier ist " found EOF". Dies bedeutet eben, dass es sich hier nicht um ein Character im stream handelt, sondern das die Funktion die den stream einliest bemerkt hat, dass keine Daten mehr nachkommen. Daher gibt die Funktion diese Return-Condition aus. Desweiteren hier als zusätzlicher Hinweis:
Zitat:/**
\c EOF declares the value that is returned by various standard IO
functions in case of an error. Since the AVR platform (currently)
doesn't contain an abstraction for actual files, its origin as
"end of file" is somewhat meaningless here.
*/
#define EOF (-1)
Grob übersetzt:
EOF deklariert den Wert der im Fall eines Fehlers von Standard I/O-Funktionen zurückgegeben wird. Da die AVR Plattform aber (aktuell) keine Abstraktionsebene für Dateien kennt, ist diese Variable (aktuell) eher sinnfrei.
Kurz gesagt:
Es geht nicht um einen "EOF-Character" im stream , sondern um die Return-Condition von lesenden Funktionen.

Grüße RK
PS: Sorry hat sich thematisch/zeitlich mit dem Post von Thorsten überschnitten

Zitat:es wäre höchstens vorstellbar, dass die Adresse von eof genau wie der File-Anfang in einer FAT o.ä. gespeichert wird und auf diese Weise erkannt wird
Ja genauso ist es. Ansonsten müssten die Funktionen ja jede Datei sequentiell durchlaufen. Das ginge wiederum nicht, da die Bytes einer Datei in aller Regel nicht "in einem Strang" auf die Platte geschrieben werden.
Daher steht in einer FAT (oder auch MFT, whatever) der Startpunkt, alle weiteren Folgepunkte und der Endpunkt einer Datei (und natürlich vieles mehr).
RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 20:48 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015 20:59 von HaWe.)
Beitrag #12
RE: gsucht: internals zu fprintf) und scanf()
hi,
sorry, ich bin nur Hobby.Programmierer, habe es nicht gelernt - und ich verstehe es nicht

den cplusplus Lnk kenne ich, verstehe aber nicht, wie ich strings schreiben kann, die Leerzeichen enthalten, ohne dass sie hinterher von fscanf als Trennzeichen gelesen werden,
und ich verstehe daraus auch nicht, wie mehrere einzelne Strings voneinander separiert sind - einmal beim Schreiben, das zweite mal beim Lesen.
SICHER NICHT durch das ^0, das ja jedem String sonst automatisch hinten dranhängt ?? Wird das WIRKLICH bei Schreiben in den Stream weggelassen, wie Thorsten vermutet? (ntl muss andererseits kein zusätzliches zweites ^0 rein, das wäre ja unnötig)

Wegen eof():
da zitierst du einmal eof als 0x0020 (das ist aber doch nichts anderes als 0x00 und 0x20 hintereinander, als 2 definierte Bytes, dies war ja oben meine unbestätigte Vermutung.

Andereseits heißt es: eof = Fehler beim Lesen, dass keine Daten mehr nachkommen....
Warum sollten keine Daten mehr nachkommen, wenn einfach byte für byte und sektor für sektor gelesen wird? ein File hat aufgehört, dann kommt irgendwas (Nullen, Durcheinander, Kauderwelsch, was weiß ich, immerhin irgendwelche Bytes - und dann kommt irgendwann das nächste File. Wo also ist daer Return-Fehler? Das mit einem FAT-Eintrag für die eof-Adresse verstehe ich aber.

Zum Dritten: es heißt: auf "AVR-Systemen bedeutungslos" - wie dann aber? also kein falscher Returncode? sondern? Und wie ist es auf dem Due (== kein AVR sondern ein ARM?)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 21:11
Beitrag #13
RE: gsucht: internals zu fprintf) und scanf()
(24.02.2015 20:48)HaWe schrieb:  den cplusplus Lnk kenne ich, verstehe aber nicht, wie ich strings schreiben kann, die Leerzeichen enthalten, ohne dass sie hinterher von fscanf als Trennzeichen gelesen werden,
Gar nicht, würde ich sagen.

Zitat:und ich verstehe daraus auch nicht, wie mehrere einzelne Strings voneinander separiert sind - einmal beim Schreiben,
So wie Du das im Format-String festlegst. Immernoch...

Zitat:das zweite mal beim Lesen.
Durch whitespace.

Zitat:Wegen eof():
da zitierst du einmal eof als 0x0020 (das ist aber doch nichts anderes als 0x00 und 0x20 hintereinander, als 2 definierte Bytes, dies war ja oben meine unbestätigte Vermutung.
Das ist doch nur ein #define in irgendeinem Programm. Irgendeine Funktion liefert das als "EOF" zurück. Deshalb muss es noch lange nicht so in irgendeiner Datei haben oder auf irgendeinem Dateisystem irgendeine Bedeutung haben. Ich nenne z.B. meine Fehlercodes manchmal -42, -43 etc.

Zitat:Andereseits heißt es: eof = Fehler beim Lesen, dass keine Daten mehr nachkommen....
Warum sollten keine Daten mehr nachkommen,
Weil die Datei zu Ende ist.

Zitat:wenn einfach byte für byte und sektor für sektor gelesen wird? ein File hat aufgehört, dann kommt irgendwas (Nullen, Durcheinander, Kauderwelsch, was weiß ich, immerhin irgendwelche Bytes - und dann kommt irgendwann das nächste File. Wo also ist daer Return-Fehler? Das mit einem FAT-Eintrag für die eof-Adresse verstehe ich aber.
Das Dateisystem ist eine logische Abstraktionsebene, die mit der Organisation auf der Platte nicht viel zu tun haben muss. In der Abstraktion "Datei" ist eben irgendwann mal das Ende erreicht.

Zitat:Zum Dritten: es heißt: auf "AVR-Systemen bedeutungslos" - wie dann aber? also kein falscher Returncode? sondern? Und wie ist es auf dem Due (== kein AVR sondern ein ARM?)
Das soll wohl nur heißen, dass es kein Betriebssystem gibt, welches schon ein Dateisystem liefert. D.h. es gibt die Abstraktionsebene "Datei" erstmal gar nicht. Was es nicht gibt kann auch kein Ende haben.

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, 21:22 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015 21:26 von HaWe.)
Beitrag #14
RE: gsucht: internals zu fprintf) und scanf()
da drehst du dich aber irgendwie im Kreis:
Zitat:es gibt die Abstraktionsebene "Datei" erstmal gar nicht. Was es nicht gibt kann auch kein Ende haben.
also wenn es nichts gibt, und also kein Ende haben kann, WAS ist also DANN eof ???

Stellen wir es erstmal zurück, so bringt das nichts und so hilft es auch nicht weiter.

Wesentlicher ist:
Bitte überprüf doch mal einer, ob z.B. auf einem System mit C und stdio.h bei

myFile=fopen(filename, "w");
fprintf(file, "%s %s %s", "Mein Gott,", "mein Gott,", "warum hast du mich verlassen?");
fprintf(file, "%s %s %s", "Gehet hin", "in alle Welt", "und mehret euch!");
fclose(myFile);

die einzelnen 6 Strings mit '\0' terminiert sind oder nicht - das wäre erstmal der wichtigste Schritt. Angel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 21:28
Beitrag #15
RE: gsucht: internals zu fprintf) und scanf()
(24.02.2015 21:22)HaWe schrieb:  also wenn es nichts gibt, und also kein Ende haben kann, WAS ist also DANN eof ???
Du könntest genauso gut fragen, was ist "17". Es ist einfach irgendein Wert, der irgendwo steht.

Zitat:Bitte überprüf doch mal einer, ob z.B. auf einem System mit C und stdio.h bei
Sowas hab ich grad nicht laufen.

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, 21:31 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015 21:31 von HaWe.)
Beitrag #16
RE: gsucht: internals zu fprintf) und scanf()
jemand anderes vielleicht?
Es geht ja um das "echte" Verhalten von solchen stdio.h Funktionen!
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.831 28.02.2015 15:31
Letzter Beitrag: HaWe

Gehe zu:


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