programing

SEEK_CUR과 함께 제로 오프셋 infseeek() 함수가 사용되는 용도는 무엇입니까?

mytipbox 2023. 6. 27. 23:19
반응형

SEEK_CUR과 함께 제로 오프셋 infseeek() 함수가 사용되는 용도는 무엇입니까?

while (fread(&product, sizeof(Product), 1, file) == 1) {
        product.price *= 2.0;
        fseek(file, -sizeof(Product), SEEK_CUR);
        fwrite(&product, sizeof(Product), 1, file);
        fseek(file, 0, SEEK_CUR);
}

위의 코드를 사용하여 각 레코드가 제품 구조의 인스턴스인 바이너리 파일에서 각 제품의 가격을 두 배로 올리려고 했습니다.제가 이 코드를 실행했을 때 파일의 모든 가격이 올바르게 업데이트되었습니다.

제가 아는 한,fread파일 포인터를 자동으로 다음 레코드로 이동합니다.첫 번째 사용fseek코드는 파일 포인터를 다시 레코드의 시작 부분으로 이동시킵니다.그런 다음 다음 다음을 사용하여 업데이트합니다.fwrite.fwrite파일 포인터를 자동으로 다음 레코드로 이동합니다.그러는 동안에fread다음 레코드를 계속해서 읽어야 합니다.

는 것 같습니다.fseek(file, 0, SEEK_CUR);여기서는 불필요합니다.하지만, 제가 그것을 제거하면, 코드는 무한 루프로 들어갑니다.저는 왜 이런 일이 일어나는지 이해할 수 없습니다.

다음을 사용하여 파일 포인터의 값을 관찰하려고 했습니다.ftell하지만 그 이후로 그 값이 바뀐 것을 보지 못했습니다.fseek(file, 0, SEEK_CUR);.

읽기와 쓰기 모두에 대해 스트림이 열리면 읽기와 쓰기 사이를 직접 전환할 수 없습니다.ISO C11 표준의 § 7.21.5.37은 다음을 명시하고 있습니다.

업데이트 모드('+' 모드 인수 값 목록에서 두 번째 또는 세 번째 문자로 사용)로 파일을 열면 관련 스트림에서 입력 및 출력이 모두 수행될 수 있습니다.그러나 출력은 fflush 기능 또는 파일 위치 지정 기능(fsek, fsetpos 또는 되감기)에 대한 인터럽트 호출 없이 직접 이어져서는 안 되며, 입력 작업이 파일 위치 지정 기능에 대한 인터럽트 호출 없이 직접 이어져서는 안 됩니다.

라인을 제거하는 경우

fseek(file, 0, SEEK_CUR);

그러면 프로그램이 이 규칙을 위반하여 정의되지 않은 동작을 호출합니다.이는 프로그램이 무한 루프에 갇힐 가능성을 포함하여 모든 일이 발생할 수 있음을 의미합니다.

랜덤 검색을 수행하는 속도가 느린 일부 파일 시스템은 별도의 읽기 및 쓰기 포인터를 사용하여 일련의 레코드에서 읽기-수정-쓰기 작업을 효율적으로 처리할 수 있도록 설계되었습니다.당신과 같은 프로그램은 다음을 생략할 수 있습니다.fseek읽기 데이터 양이 쓰기 데이터 양과 일치하는 경우 운영이 완전히 제공되며, 데이터 양이 필요하지 않은 경우 훨씬 더 빠르게 실행될 수 있습니다.fseek()작업을 포함할 경우 실행할 수 있는 것보다 더 많은 작업이 필요로 합니다.

C 표준 라이브러리 구현은 파일에 대해 수행된 마지막 작업이 쓰기인지 읽기인지 여부를 추적해야 하므로 관계가 다음과 같습니다.fseek()마지막으로 수행된 작업의 종류에 따라 현재 읽기 위치 또는 현재 쓰기 위치 중 하나에 대해 상대적으로 작동할 수 있지만, 듀얼 파일 포인터를 사용하는 시스템을 대상으로 할 때 관련 성능 향상을 얻기 위해 듀얼 파일 포인터를 이용하도록 작성된 프로그램을 허용할 수 있습니다.

비록 표준이 개입 없이 쓰기와 읽기를 수행하는 행동을 분류할 수 있었지만,fseek()구현 정의에 따르면, 이는 예측 가능하지 않은 사례 행동을 가진 플랫폼을 대상으로 할 때에도 구현이 문서화된 방식으로 일관되게 동작하도록 노력해야 한다는 것을 의미하는 것으로 간주됩니다.

언급URL : https://stackoverflow.com/questions/76245752/what-is-the-use-of-zero-offset-in-fseek-function-with-seek-cur

반응형