Es gibt eine weitere Funktion in der GNU-C-Bibliothek namens fgetc. Es ist in den meisten Punkten identisch mit getc, außer dass getc normalerweise als Makrofunktion implementiert und hochoptimiert ist, also in den meisten Situationen vorzuziehen ist. (In Situationen, in denen Sie von der Standardeingabe lesen, ist getc ungefähr so schnell wie fgetc, da Menschen im Vergleich dazu, wie schnell Computer ihre Eingaben lesen können, langsam tippen, aber wenn Sie aus einem Stream lesen, der nicht interaktiv von einem Menschen erzeugt wird, fgetc ist wahrscheinlich besser.)
Was sind die anderen Unterschiede? Ich habe gehört, dass sie jeweils eine andere Implementierung haben (und eine kann als Makro verwendet werden), aber was macht sie so unterschiedlich (oder unterschiedlich genug), dass sie beide in der Standard-C-Bibliothek (oder Spezifikation) enthalten sind?
@ user814064, auf Ihren Link verwiesen fgets vs fgetcOP fragt nach getc vs fgetc
– David Ranieri
28. August 2013 um 6:44 Uhr
getc() wird unter diesem Link erwähnt, ebenso wie seine Vorteile.
– dcaswell
28. August 2013 um 6:46 Uhr
@ user814064, Sie können direkt auf die Antwort verlinken (indem Sie auf klicken Teilen) stackoverflow.com/a/5186605/1606345
– David Ranieri
28. August 2013 um 6:51 Uhr
Ich danke dir sehr. Ich poste seit weniger als einer Woche und muss noch VIEL lernen. Ich dachte, das wäre Facebook oder so.
– dcaswell
28. August 2013 um 6:52 Uhr
Von dem Advanced Programming in Unix Environment:
…
Der Unterschied zwischen getc und fgetc ist das getc kann als Makro implementiert werden, wohingegen fgetc kann nicht als Makro implementiert werden. Das bedeutet dreierlei:
Das Argument zu getc sollte kein Ausdruck mit Nebenwirkungen sein.
Seit fgetc garantiert eine Funktion ist, können wir ihre Adresse nehmen. Dadurch können wir die Adresse weitergeben fgetc als Argument für eine andere Funktion.
Aufrufe an fgetc dauern wahrscheinlich länger als Aufrufe an getcda der Aufruf einer Funktion normalerweise länger dauert.
…
Ich habe +1 erhöht, aber: Warum haben beide in der Standardbibliothek? Warum können nicht beide ein Makro sein?
– Joe DF
28. August 2013 um 6:51 Uhr
@day meinst du “wie” wie in “was sind die Implementierungsdetails” oder in “wie kannst du das machen (moralisch oder technisch)”?
– Peter – Setzen Sie Monica wieder ein
15. Januar 2015 um 22:05 Uhr
Scheint, als wären die Unterschiede in 99,9 % der Fälle bedeutungslos.
Ein Punkt, der einen Unterschied machen kann – Die Manpage sagt getc() may be implemented as a macro which evaluates stream more than once.
Es könnte in einigen (nicht sehr nützlichen) Fällen zu seltsamem Verhalten führen, z.
FILE *my_files[10] = {...}, *f=&my_files[0];
for (i=0; i<10; i++) {
int c = getc(f++); // Parameter to getc has side effects!
}
Wenn getc bewertet f++ mehr als einmal wird es vorankommen f mehr als einmal pro Iteration. Im Vergleich, fgetc ist in solchen Situationen sicher.
Basile Starynkevitch
Es gibt im Wesentlichen die gleichen (oder ähnlich genug, um nicht zu stören). Sie sollten sich ihre Implementierung ansehen: GNU-libc und MUSL-libc sind freie Softwareimplementierungen. Und sie könnten jetzt als Inline-Funktionen implementiert werden (die so schnell wie Makros sind).
Und ich werde nicht so viel stören. Im wirklichen Leben wird I/O hauptsächlich durch die Hardware eingeschränkt (z. B. die Zeit für den Zugriff auf die Festplatte).
14107900cookie-checkgetc() vs. fgetc() – Was sind die Hauptunterschiede?yes
Gute Infos hier: stackoverflow.com/questions/5186457/…
– dcaswell
28. August 2013 um 6:42 Uhr
@ user814064, auf Ihren Link verwiesen
fgets
vsfgetc
OP fragt nachgetc
vsfgetc
– David Ranieri
28. August 2013 um 6:44 Uhr
getc() wird unter diesem Link erwähnt, ebenso wie seine Vorteile.
– dcaswell
28. August 2013 um 6:46 Uhr
@ user814064, Sie können direkt auf die Antwort verlinken (indem Sie auf klicken Teilen) stackoverflow.com/a/5186605/1606345
– David Ranieri
28. August 2013 um 6:51 Uhr
Ich danke dir sehr. Ich poste seit weniger als einer Woche und muss noch VIEL lernen. Ich dachte, das wäre Facebook oder so.
– dcaswell
28. August 2013 um 6:52 Uhr