Frage zu fread [mit malloc / char* / feof] ||SOLVED||
-
Grüßt euch,
bin heute morgen auf ein kleines theoretisches (Denk)problem gestoßen, dass sich wie folgt darstellt:
Es sei gegeben:
char *puffer1; char *puffer2; puffer1 = (char *)malloc(( byte + 1) * sizeof(char)); puffer2 = (char *)malloc(( byte + 1) * sizeof(char)); // byte um DateiausleseZeiten bei unterschiedlich großen Blöcken zu erkennen. memset(puffer1, 0, byte + 1); memset(puffer2, 0, byte + 1); fread(puffer1, byte, 1, file1); // file1 / file2 je FILE* "r+b" fread(puffer2, byte, 1, file2);
Nun zum Thema:
Ich lese nun auf diese Weise zwei Datei aus (und vergleiche sie),
[in einer Schleife bis feof] und sagen wir es trittbyte = 1000;
auf.
Soll heißen: es werden ~1Kb-Blöcke gelesen.Nun ist die Dateigröße aber nicht exakt durch 1000 teilbar.
Es kommt also dazu, dass fread einen Block von 1000byte auslesen will, vorher aber auf feof trifft.Wie verhält sich fread in diesem Fall??
Sagen wir in beiden Dateien steht im letzten Block _nur_ 10 mal "#"
Die Blöcke "wären" also gleich, sind sie es jedoch auch real?
Liest fread auch nur diese 10 Zeichen oder mehr aus der Datei?Schonmal vielen Dank für eure Antworten im Voraus!!
Edith sagt: msdn + gidf haben mich auch noch nicht weitergebracht..
LG Jann
-
Fread gibt die Zahl der erfolgreich gelesenen Elemente zurück. Guckst Du: http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.12.html#fread
Zudem solltest Du den malloc- cast rausschmeißen. Guckst Du: http://www.c-plusplus.net/forum/viewtopic.php?t=206606. Das sizeof kannste Dir in dem Fall auch sparen, ist nur Fleißarbeit beim Tippen.
Alles klar?
-
danke für deine antwort!
der returnwert von fread war bekannt, trotzdem danke.
ich folgere mal aus deiner aussage, dass fread beim auftreffen auf feof NICHT weiterliest, sondern die bis dahin gelesenen elemente zurückgibt?
Hatte ich mir auch so überlegt, wollte nur sichergehn. danke dir
@ malloc: cast + sizeof ist beides überflüssig??
hab ich noch so gelernt -.-edith sagt:
so wäre dann richtig/schönerer Stil?puffer1 = malloc((byte+1) * sizeof(*puffer1));
man lernt NIE aus,
werds anpassen danke
-
Keithy schrieb:
@ malloc: cast + sizeof ist beides überflüssig??
sizeof (char)
ist 1, also kannst du es dir in diesem Falle sparen.Keithy schrieb:
so wäre dann richtig/schönerer Stil?
puffer1 = malloc((byte+1) * sizeof(*puffer1));
Es gibt keinen falschen Stil, nur unschönen. Aber der hier passt
-
also nicht sizeof(Datentyp) sonder sizeof(Objekt)
so wäre dann richtig/schönerer Stil?
sollte heißen: so wäre es dann sachlich richtig und schönerer Stil?
werds mir merken, danke für eure antworten!
bis demnächst
Jann
-
Keithy schrieb:
also nicht sizeof(Datentyp) sonder sizeof(Objekt) ... sollte heißen: so wäre es dann sachlich richtig und schönerer Stil?
Ist keine Frage der Schönheit, sondern der Prävention gegen dumme Fehler, die man ewig sucht.
-
Man kann sich auch angewöhnen die Klammern beim sizeof-Operator nicht zu verwenden, dann kracht es sobald man einen Typ als Operand übergibt. Dann kann man sich überlegen ob man es nicht doch sinnvoller über ein konkretes Objekt löst.
-
Tim schrieb:
Man kann sich auch angewöhnen die Klammern beim sizeof-Operator nicht zu verwenden, dann kracht es sobald man einen Typ als Operand übergibt.
Ja, und? Dann meckert der Compiler. Ist der dankenswürdigste Fehler, den es gibt.