2013-05-01 8 views
6

Von The GNU C Programming Tutorial:Warum ist die fgets-Funktion veraltet?

Die fgets ("file get string") Funktion ist ähnlich der Funktion wird . Diese Funktion ist veraltet - das bedeutet, es ist veraltet und es wird dringend empfohlen, dass Sie es nicht verwenden - weil es gefährlich ist. Es ist gefährlich, denn wenn die Eingabedaten ein null Zeichen enthalten, können Sie nicht sagen. Verwenden Sie nicht fgets, wenn Sie nicht wissen, dass die Daten keine Null enthalten können. Verwenden Sie es nicht zum Lesen von Dateien, die vom Benutzer bearbeitet wurden. Wenn der Benutzer ein Nullzeichen einfügt, sollten Sie entweder richtig behandeln oder eine klare Fehlermeldung ausgeben. Verwenden Sie immer getline oder getdelim anstelle von fgets, wenn Sie können.

Ich dachte, die fgets Funktion stoppt, wenn es sich um eine \0 oder \n begegnet; Warum schlägt diese Handbuchseite vor, dass ein Nullbyte "gefährlich" ist, wenn fgets die Eingabe richtig handhaben sollte? Was ist der Unterschied zwischen getline und fgets, und ist die fgets Funktion wirklich veraltet in der C99 oder zukünftige C-Normen?

Antwort

12

Nein, fgets ist in C99 oder dem aktuellen Standard C11 nicht veraltet. Aber der Autor dieses Tutorials hat Recht, dass fgets nicht stoppt, wenn es auf ein NUL stößt, und hat keinen Mechanismus, um das Lesen eines solchen Zeichens zu melden.

fgets Die Funktion liest höchstens eine weniger als die Zahl der durch n spezifizierten Zeichen aus dem Strom, auf den durch sstream in das Array gerichtet. Nach einem Zeichen für eine neue Zeile (das beibehalten wird) oder nach dem Ende der Datei werden keine zusätzlichen Zeichen gelesen.

(§7.21.7.2)

GNU getdelim und getline haben in POSIX 2008 standardisiert, so dass, wenn Sie eine POSIX-Plattform Targeting sind, dann könnte es keine schlechte Idee sein, diejenigen, anstatt zu verwenden.

EDIT ich dachte, dass es absolut keinen sicheren Weg in das Gesicht der NUL-Zeichen zu verwenden fgets war, aber R .. (Kommentare sehen) wies darauf hin, gibt es:

char buf[256]; 

memset(buf, '\n', sizeof(buf)); // fgets will never write a newline 
fgets(buf, sizeof(buf), fp); 

Jetzt letzten sucht Nicht \n Zeichen in buf. Ich würde diesen Klud, aber nicht wirklich empfehlen.

+0

Also 'Fgets' liest weiter nach Null Bytes, Suche nur nach dem Newline-Zeichen? –

+1

@VilhelmGray: Das ist richtig, und es wird Ihnen nicht sagen, dass es getan hat. Es gibt keine Möglichkeit, sicher zu sein, dass das erste '\ 0', das Sie finden, von 'fgets' hinzugefügt wurde oder nicht. –

+4

Nullbytes gehören nicht in ** text ** -Dateien.'fgets()' wurde entwickelt, um mit Textdateien zu arbeiten: die Verwendung von 'fgets()' mit Dateien von Binärdaten wird nicht empfohlen. – pmg

5

Dies ist nur GNU-Propaganda. In keinem offiziellen Sinne ist fgets veraltet. gets ist jedoch gefährlich und veraltet.

+3

'gets' wurde tatsächlich * vom * 2011 ISO C Standard entfernt. (In C99 wurde es nicht offiziell veraltet oder veraltet.) –

+3

@KeithThompson: Abschnitt 7.26.9 von ISO/IEC 9899: 1999 TC3 sagt "Die' gets'-Funktion ist veraltet und veraltet. " also glaube ich, dass "bekommt" in C99 offiziell veraltet war. –

+0

Wurde diese Sprache in einem der TCs hinzugefügt, oder war es in der Originalveröffentlichung von C99? –