it-source

fgetpos/fsetpos와 ftell/fseeek의 차이점

criticalcode 2023. 6. 15. 21:55
반응형

fgetpos/fsetpos와 ftell/fseeek의 차이점

기능을 사용하는 것과 다른 점은 무엇입니까?fgetpos()그리고.fsetpos()그리고 기능들을 사용합니다.ftell()그리고.fseek()파일에 위치를 지정할 수 있습니까?

무엇이fgetpos()그리고.fsetpos()에 좋습니까?왜 그것들이 대신 사용되었겠습니까?ftell()그리고.fseek()?

위의 답변정답이 하나도 없습니다. 실제로 다음을 사용할 수 있습니다.fsetpos와 바꿀 수 없는.fseek보안 결함(https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=20087255) )을 도입할 수 있습니다.

그 이유는fpos_t *pos에 대한 주장.fsetpos실제로는 정수가 아니므로 파일에서 임의의 위치를 찾는 데 사용할 수 없습니다.따라서 유효한 값은 다음에서 얻은 값뿐입니다.fgetpos의사들이 말했듯이,

스트림과 관련된 내부 파일 위치 표시기는 다음과 같은 위치로 설정됩니다.pos그것은 에 대한 포인터입니다.fpos_t이전에 에 대한 호출에 의해 값이 획득되어야 하는 객체.

(http://www.cplusplus.com/reference/cstdio/fsetpos/)

32비트 경계를 넘어 임의의 위치를 찾는 기능만 있으면 다음을 사용합니다.ftello/fseeko로 컴파일합니다.#define _FILE_OFFSET_BITS 64.

ftell과 fsek는 파일의 오프셋(위치)을 나타내기 위해 longint형을 사용하므로 longint로 표시할 수 있는 오프셋으로 제한될 수 있습니다. (type longint는 2**31-1보다 큰 값을 유지하는 것이 보장되지 않으며 최대 오프셋은 2GB로 제한됩니다.)반면에 최신 fgetpos 및 fsetpos 함수는 오프셋을 나타내기 위해 특수한 유형인 fpos_t를 사용합니다.이 형식 정의 뒤에 있는 유형은 적절하게 선택된 경우 임의로 큰 오프셋을 나타낼 수 있으므로 fgetpos 및 fsetpos를 임의로 큰 파일과 함께 사용할 수 있습니다.fgetpos 및 fsetpos는 멀티바이트 스트림과 관련된 상태도 기록합니다.

fgetpos()는 fsetpos()와 함께 사용됩니다.ftell()은 fsek()와 함께 사용됩니다.

fgetpos()는 둘 다 FILE* 매개 변수를 사용하고 둘 다 약간 다른 스타일이지만 파일에서 일종의 위치를 반환하기 때문에 실질적으로 ftell()과 유사합니다.그러나 다음과 같은 정보를 얻을 수 있습니다. Only fsek()를 사용하면 파일의 처음부터 현재 위치에서 검색하고 파일의 끝에서 뒤로 검색할 수 있습니다(세 번째 fsek() 인수는 SEEK_SET, SEEEK_CUR 및 SEEEK_END).fsetpos()는 이것을 하지 않습니다.fsetpos()는 fgetpos에서 얻은 어떤 위치로 돌아가는 것으로 제한됩니다.

예를 들어 파일을 메모리에 읽으려고 합니다.malloc()에서 얼마나 많은 힙이 필요합니까?파일의 크기가 필요합니다.그리고 일부 C 컴파일러는 비표준 함수를 추가할 수 있지만, C 표준 라이브러리에서 파일의 크기를 알려주는 기능을 아직 찾지 못했습니다.예를 들어, Borland Turbo C에는 파일 길이()가 있습니다.그러나 STANDARD C 라이브러리에서 파일 길이()를 본 적이 없습니다.

따라서 파일이 끝나기 전에 fseke()를 0바이트까지 사용할 수 있습니다.그런 다음 ftell()을 사용하여 위치를 바이트 단위로 가져오고 힙 메모리 양을 계산합니다.

파일 크기를 얻기 위해 무엇을 더 할 수 있습니까?fgetc()를 사용하여 각 문자를 읽고 끝까지 셀 수 있습니다.하지만 저는 fseke()와 ftell()을 사용하는 것이 더 좋고 쉽다고 생각합니다.

인터페이스는 다르게 정의되지만 기능에는 차이가 없습니다.둘 다 POSIX의 일부이기 때문에 둘 다 구현됩니다.

언급URL : https://stackoverflow.com/questions/3348637/what-is-difference-between-fgetpos-fsetpos-and-ftell-fseek

반응형