2013-05-01 4 views
6

:fgets 함수가 사용되지 않는 이유는 무엇입니까? <a href="http://crasseux.com/books/ctutorial/fgets.html" rel="noreferrer">The GNU C Programming Tutorial</a>에서

fgets ("파일 가져 오기 문자열") 기능은 유사하다는 기능을 가져옵니다. 이 함수는 이 사용되지 않으며입니다. 즉, 사용하지 말아야 할 이며, 사용하지 않는 것이 좋습니다. 이는 이므로 위험합니다. 입력 데이터에 null 문자 이 포함되어 있으면이를 알 수 없으므로 위험합니다. 에 null을 포함 할 수 없다는 것을 알지 않는 한 fgets을 사용하지 마십시오. 사용자가 null 문자를 삽입하면 을 올바르게 처리하거나 명확한 오류 메시지를 인쇄해야하기 때문에 사용자가 편집 한 파일을 읽는 데 사용하지 마십시오. 가능하면 getline 또는 getdelim 대신 fgets을 사용하십시오.

I는 그것이 \0 또는 \n 만나면 fgets 기능 정지 생각; 왜이 매뉴얼 페이지는 fgets이 입력을 제대로 처리해야 할 때 null 바이트가 "위험"하다고 제안합니까? 또한 getlinefgets의 차이점은 fgets입니다. C99 또는 향후 C 표준에서이 아닙니다.

답변

12

아니요, fgets은 C99 또는 현재 표준 인 C11에서 실제로 사용되지 않습니다. 그러나이 자습서의 저자는 NUL을 만날 때 fgets이 멈추지 않고 그러한 문자를 읽는 것을보고 할 수있는 메커니즘이 없다는 것이 맞습니다.

fgets 함수 스트림 s 가리키는 배열 stream 가리키는에서 n 의해 지정된 문자의 수보다 많아야 하나 이하 읽는다. 개행 문자 이후 (또는 유지됨) 또는 파일 끝 이후에 추가 문자를 읽지 않습니다.

(§7.21.7.2)

GNU의 getdelimgetline는 당신이 POSIX 플랫폼을 타겟팅하는 경우, 다음이 대신들을 사용하는 나쁜 생각하지 않을 수 있습니다, POSIX 2008 표준화되었다.

편집 내가 NUL 문자의 얼굴에 fgets를 사용하는 절대적으로 안전한 방법이 없었다 생각했지만, R .. (주석 참조)은이 지적 :

char buf[256]; 

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

이제 마지막을 찾아 비 \n 문자는 buf입니다. 그래도이 kludge는 실제로 권장하지 않습니다.

+0

그래서'fgets'는 줄 바꿈 문자를 검색하여 null 바이트를 계속 읽습니까? –

+1

@VilhelmGray : 맞습니다. 첫 번째 '\ 0'이 'fgets'에 의해 추가되었는지 확인할 방법이 없습니다. –

+4

null 바이트는 ** 텍스트 ** 파일에 속하지 않습니다.'fgets()'는 텍스트 파일을 처리하도록 설계되었습니다. 바이너리 데이터 파일과 함께'fgets()'를 사용하는 것은 권장하지 않습니다. – pmg

5

이것은 단지 GNU 선전 일뿐입니다. 공식적인 의미에서 fgets은 더 이상 사용되지 않습니다. gets 그러나 위험하고 더 이상 사용되지 않습니다.

+3

'gets'는 실제로 2011 ISO C 표준에서 제거되었습니다. (C99에서 공식적으로 사용되지 않거나 노후화 된 것은 아니 었습니다.) –

+3

@KeithThompson : ISO/IEC 9899 : 1999 TC3의 7.26.9 절에 "''가져 오기 '기능은 폐기되었으며 더 이상 사용되지 않습니다."라고 말합니다. 그래서 나는'get '이 C99에서 공식적으로 사용되지 않을 것이라고 믿습니다. –

+0

해당 언어가 TC 중 하나에 추가 되었습니까, 아니면 C99의 최초 발행물에 있었습니까? –