003
22.11.2008, 22:54 Uhr
0xdeadbeef
Gott (Operator)
|
Aaalso, mehrere Anmerkungen zum unteren Teil:
Zum einen wird das eof-Bit des Eingabestroms erst dann gesetzt, wenn über das Ende hinausgelesen wurde, also nachdem fgets einmal fehlgeschlagen ist. Das bedeutet, wenn du durch die Zeilen einer Datei iterieren willst, ist es sehr viel sinnvoller
C++: |
while(fgets(ppm_code, 150, infile) { // Zeile hier verarbeiten }
|
zu schreiben. Zum Anderen merkt sich strtok in einer statischen Variable, wo der letzte Token zuende war, und verwendet diese Stelle beim nächsten mal, wenn ein Aufruf mit NULL geschieht. Deswegen ist die Funktion übrigens auch nicht threadsicher. Das bedeutet aber, dass
C++: |
fgets(ppm_code, 150, infile); helppointer=strtok(NULL," ");
|
ziemlicher Unfug ist. strtok kriegt nicht auf irgendeine magische Weise mit, dass der Inhalt von ppm_code sich geändert hat, und arbeitet im Zweifel mit der vorher gemerkten Stelle weiter. Jedenfalls ist das in der Praxis so, der Standard definiert dafür allerdings kein Verhalten. Verlass dich also nicht darauf.
Wie dem auch sei, wenn die Variable sich ändert, muss strtok sinnvollerweise neu initialisiert werden - also als ersten Parameter die Variable statt NULL kriegen. Das bedeutet, wie oben schon einmal erwähnt:
C++: |
for(helppointer = strtok(ppm_code, " "); helppointer; helppointer = strtok(NULL, " ")) { printf("%s", helppointer); }
|
Zum dritten frage ich mich, warum du es dir eigentlich so schwer machst. Wenn ich richtig verstehe, was du da vorhast, ließe sich das mit fscanf viel einfacher lösen. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |