C - fgets - array zu kurz, rest als unsichtbares array im zweiten durchlauf verwertet.

Hallo,

Frohes Neues!!

Um eine Datei einzulesen, verwende ich meistens getc/fgetc
Das hat den Vorteil, das man beliebige Zeichen (0-255)
einlesen kann.
Für UniCode und so sachen gibt es bestimmt besseres.

Gruß
 
Wieso sollte das langsam sein?
Ich habe einen 5 Jahre alten Rechner, und ich sehe keine Warteuhr am Bildschirm.
Ok, je mehr Daten eingelesen werden, um so schneller ist man fertig.
Aber ehrlich, sollten einen Anfänger gleich HighPerformance Lösungen mitgegeben werden,
die erst ergooglet oder sonstwas werden müssen, deren Verständis, auf Blöcke der
Vergangenheit aufbaut?
Das mag zwar für einen ermüdend erscheinen, aber nur so kann man sich auf ein
Gebiet spezialisieren.
Man muss nicht jede Funktion oder Technik kennen.
Dafür gibt es Vorarbeiten.
In der ersten Klasse haben die meisten Kinder sicherlich nicht das Thema, wie man handschriftich
die n'te Wurzel aus einer Zahl zieht.
oder im Studium, der 3satz angegangen wird.
Ok, wollte hier kein Flamewar anfangen,
Sorry, aber Wäre für cwriter kein VisualBasic Einstieg besser gewesen?
Gut, M$ Produkte, aber ich habe auch auf einen 386'er MS-DOS programmieren gelernt.

Huch jetzt habe ich erstmal die Topic Zeile gelesen.
Ich könnte jetzt eines draufpacken und auf AST, flex/bison verweisen.
Aber das ist ja schon höhere Mathematik :-)
Ok, Spass
 
Zuletzt bearbeitet von einem Moderator:
Wieso sollte das langsam sein?
Ich habe einen 5 Jahre alten Rechner, und ich sehe keine Warteuhr am Bildschirm.
Ok, je mehr Daten eingelesen werden, um so schneller ist man fertig.
Ähm ja.
Warum erwartest du dir eine "Warteuhr am Bildschirm"?

Hier, auf meinem Rechner, mit meiner Version der Standardlib usw.usw.,:
1GB (testweise) als einzelne Byte einzulesen ist ca. 9 mal langsamer als in 1024 1MB-Blöcken
Den (ziemlich primitiven) Code kann ich gern noch posten, wenns sein muss.

Warum? Wegen Overhead vom Funktionscall, der Parameterprüfung usw.usw.
(in der Vergangenheit gabs auch Systeme ohne OS/HDD-Cache, aber diese
schrecklichen Verlangsamungen sind zum Glück nicht mehr relevant.)

Aber ehrlich, sollten einen Anfänger gleich HighPerformance Lösungen mitgegeben werden,
High Perfomance ist ganz was Anderes :rolleyes: [Als einfach zeilenweise statt byteweise Text einzulesen :rolleyes:]
... ich kann dir versprechen, dass eine ordentliche fgetc-Lösung auch codemäßig umständlicher ist.
zB. Zeilenwechsel und die verschiedenen Möglichkeiten dafür, Dateiende und Lesefehler erkennen usw.usw.

Sorry, aber Wäre für cwriter kein VisualBasic Einstieg besser gewesen?
Was hat @cwriter damit zu tun?

die erst ergooglet oder sonstwas werden müssen, deren Verständis, auf Blöcke der
Vergangenheit aufbaut?
Das mag zwar für einen ermüdend erscheinen, aber nur so kann man sich auf ein
Gebiet spezialisieren.
Man kann sich deiner Meinung nach nur auf ein Gebiet spezialisieren, wenn man für jede Aufgabe zuerst alle sinnlosen Lösungen durchprobiert (von denen bekannt ist, dass sie sinnlos sind)? Das ist keine Erforschung von irgendwelchen Weltneuheiten, bei denen noch keiner weiß, wie es richtig geht.
...
fgets ist eine der bekanntesten C-Funktionen überhaupt,
da ist nichts, was man sich großartig erarbeiten müsste.

...irgendwie ist mir nicht so richtig klar, was du mit deinen Beiträgen eigentlich aussagen willst.
Jemand will fgets richtig anwenden, und dein Reaktion ist "alles byteweise einlesen,
weil fgets zu viel zu googlen ist, oder Flex/Bison verwenden [und das geht ohne Google?]".
 
Beschworen aus dem Abgrund der guten Vorsätze und des Sylvesterkaters bin ich hier :)

Er meint wohl, dass ich der Community einen Gefallen gemacht hätte, wenn ich nie mit C/C++ begonnen hätte :P
Oder aber, was wahrscheinlicher ist: Er hat die Namen verwechselt.

Hier, auf meinem Rechner, mit meiner Version der Standardlib usw.usw.,:
1GB (testweise) als einzelne Byte einzulesen ist ca. 9 mal langsamer als in 1024 1MB-Blöcken
Den (ziemlich primitiven) Code kann ich gern noch posten, wenns sein muss.
Passend dazu:
Linus Torvalds hat gesagt.:
"Of course, I'd also suggest that whoever was the genius who thought it was a good idea to read things ONE F✦CKING BYTE AT A TIME with system calls for each byte should be retroactively aborted. Who the f*ck does idiotic things like that? How did they noty die as babies, considering that they were likely too stupid to find a tit to suck on?"
Naja, der Kontext ist ein bisschen anders (Userspace/Kernel), aber generell stimmt es auch hier: Je mehr das Betriebssystem selbst machen kann, desto schneller wird das Ganze.

Bytes ja, aber nicht unbedingt Zeichen.
Gelesen werden Bytes, aber zurückgegeben werden ints (meist DWORD). Je nach Anwendungszweck kann das wichtig sein, eine Funktion "file.push(T val)" könnte mit den falschen Overloads/casts dadurch 4 Bytes statt 1 Byte schreiben - ein weiterer Grund, neben den gennanten
... ich kann dir versprechen, dass eine ordentliche fgetc-Lösung auch codemäßig umständlicher ist.
zB. Zeilenwechsel und die verschiedenen Möglichkeiten dafür, Dateiende und Lesefehler erkennen usw.usw.
, der gegen eine Verwendung von fgetc() spricht. (Genau genommen kommt mir gerade kein Fall in den Sinn, wo fgetc() tatsächlich sinnvoll brauchbar ist (RAM Buffering sollte eigentlich immer besser sein, sodass man eine bestimmte Anzahl Bytes in einen char-Array liest und dann einfach die Arrayelemente abgeht).

Warum erwartest du dir eine "Warteuhr am Bildschirm"?
In der Windows Command Line gibt es die bei IO-Zeit schon lange nicht mehr (wenn's das je gab). Die Konsole ist ja nur eine Art der Darstellung deines Programms (ähnlich zu einem Browser: Wenn der Server unter Volllast ist, zeigt der Browser auch keine Sanduhr an - er lässt nur den Spinner drehen).

Gruss
cwriter
 
Zurück