getc() vs. fgetc() – Was sind die Hauptunterschiede?

Lesezeit: 3 Minuten

Benutzeravatar von Joe DF
Joe DF

Überall sehe ich “es ist praktisch identisch” oder so ähnlich…

Aus Das Tutorial zur GNU-C-Programmierung :

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?

  • Gute Infos hier: stackoverflow.com/questions/5186457/…

    – dcaswell

    28. August 2013 um 6:42 Uhr

  • @ 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.

Benutzeravatar von Basile Starynkevitch
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).

1410790cookie-checkgetc() vs. fgetc() – Was sind die Hauptunterschiede?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy