무엇인가에 대한 이론적 근거 fread/fwrite 로 크기와 같이 계산 arguments?

StackOverflow https://stackoverflow.com/questions/295994

  •  08-07-2019
  •  | 
  •  

문제

우리는 토론 여기에는 작업에 대한 왜 fread 및 fwrite 을 크기별로 구성원과 횟수 및 수 있는 회원의 읽기/쓰기보다는 그냥 버퍼 크기입니다.에 대한 유일한 사용이 그것 있습니하려는 경우에는 읽기/쓰기의 배열 구조체지 않는 균등하게 나눌 수 있는 플랫폼에 의해 정렬하고 따라서 해야 되지만 패딩할 수 없는 일반적으로 보장은 이 선택에서는 디자인이다.

FREAD(3):

기능 fread()읽 nmemb 요소의 데이터 크기는 바이트 길이, 스트림에서 지적하여 스트림에 저장 위치에 주어 여 ptr.

기능 fwrite()글 nmemb 요소의 데이터 크기는 바이트 긴 스트림에 의해 지정된 스트림을 획득에서 그들을 위치 에 의해 주어진 ptr.

fread()및 fwrite()익 항목의 수를 성공적으로 읽거나 기록 (즉,문자 수).오류가 발생한 경우,또는 파일의 끝에 도달 반환 값은 짧은 항목 개수(또는 영)입니다.

도움이 되었습니까?

해결책

그것은 방법을 기반으로합니다 프레드 구현되었습니다.

단일 UNIX 사양이 말합니다

각 객체에 대해 크기 호출은 fgetc () 함수로 이루어져야하며, 순서대로 객체를 정확히 오버레이하는 서명되지 않은 숯의 배열에 저장된 결과를 읽어야합니다.

fgetc 또한이 메모가 있습니다.

FGETC ()가 바이트에서 작동하므로 여러 바이트 (또는 "다중 바이트 문자")로 구성된 문자를 읽으려면 FGETC ()에 여러 호출이 필요할 수 있습니다.

물론 이것은 UTF-8과 같은 멋진 가변 바이트 문자 인코딩을 선행합니다.

SUS는 이것이 실제로 ISO C 문서에서 가져온 것이라고 지적합니다.

다른 팁

Fread (Buf, 1000, 1, Stream) 및 Fread (Buf, 1, 1000, Stream)의 차이는 첫 번째 경우 파일이 더 작아서 1000 바이트 또는 Nuthin의 덩어리 만 얻는다는 것입니다. 두 번째 경우 파일의 모든 것을 최대 1000 바이트보다 적게 얻습니다.

이것은 순수한 추측이지만, 몇시에 (일부는 여전히 주변에 있습니다) 많은 파일 시스템은 하드 드라이브에서 단순한 바이트 스트림이 아니 었습니다.

많은 파일 시스템은 레코드 기반이므로 이러한 파일 시스템을 효율적인 방식으로 만족시키기 위해 항목 수 ( "레코드")를 지정하여 Fwrite/Fread가 바이트 스트림뿐만 아니라 레코드로 스토리지에서 작동 할 수 있도록해야합니다.

여기에서 그 기능을 해결하겠습니다.

size_t fread_buf( void* ptr, size_t size, FILE* stream)
{
    return fread( ptr, 1, size, stream);
}


size_t fwrite_buf( void const* ptr, size_t size, FILE* stream)
{
    return fwrite( ptr, 1, size, stream);
}

매개 변수에 대한 이론적 근거는 fread()/fwrite(), 나는 오래 전에 K & R의 사본을 잃어 버렸기 때문에 추측 할 수 있습니다. Kernighan과 Ritchie는 이진 I/O를 수행하는 것이 객체의 배열에서 가장 자연스럽게 수행 될 것이라고 생각했을 수도 있다고 생각합니다. 또한 블록 I/O가 구현하기가 더 빠르거나 쉽게 구현하거나 일부 아키텍처에서 무엇이든간에 생각했을 수도 있습니다.

C 표준은이를 지정하지만 fread() 그리고 fwrite() 관점에서 구현됩니다 fgetc() 그리고 fputc(), 표준은 C & R에 의해 C가 정의 된 후에도 존재했으며 표준에 지정된 것이 원래 디자이너 아이디어에 있지 않았을 수 있음을 기억합니다. K & R의 "C 프로그래밍 언어"에서 언급 된 것들이 언어가 처음 설계 될 때와 같지 않을 수도 있습니다.

마지막으로 PJ Plauger가 말하는 내용은 다음과 같습니다. fread() "표준 C 라이브러리"에서 :

만약 size (두 번째) 인수는 하나보다 크고, 함수가 또한 읽는지 여부를 판단 할 수 없습니다. size - 1 보고 된 것 이상의 추가 문자. 일반적으로 기능을 다음과 같이 부르는 것이 좋습니다. fread(buf, 1, size * n, stream); 대신에 fread(buf, size, n, stream);

기본적으로, 그는 그렇게 말하고 있습니다 fread()의 인터페이스가 고장났습니다. 을 위한 fwrite() 그는 "쓰기 오류는 일반적으로 드물기 때문에 이것은 큰 단점이 아닙니다"라고 말합니다.

파일 I/O가 구현 된 방식으로 돌아갈 수 있습니다. (하루로 돌아 가기) 블록으로 파일을 쓰기 / 읽는 것이 더 빠르고 한 번에 모든 것을 작성하는 것이 더 빠를 수 있습니다.

C에 기능 과부하가 부족하기 때문이라고 생각합니다. 일부가 있으면 크기가 중복됩니다. 그러나 C에서는 배열 요소의 크기를 결정할 수 없으므로 하나를 지정해야합니다.

이걸 고려하세요:

int intArray[10];
fwrite(intArray, sizeof(int), 10, fd);

Fwrite가 수락 된 바이트 수의 경우 다음을 작성할 수 있습니다.

int intArray[10];
fwrite(intArray, sizeof(int)*10, fd);

그러나 그것은 단지 비효율적입니다. (int) 시간이 더 많은 시스템 호출을 가질 수 있습니다.

고려해야 할 또 다른 요점은 일반적으로 배열 요소의 일부를 파일에 기록하는 것을 원하지 않는다는 것입니다. 당신은 전체 정수를 원하거나 아무것도 원하지 않습니다. Fwrite는 여러 가지 요소를 성공적으로 반환합니다. 따라서 요소의 2 바이트 만 쓰여진다는 것을 알게되면 어떻게 하시겠습니까?

일부 시스템 (정렬로 인해)에서는 사본을 만들거나 이동하지 않고는 정수의 바이트에 액세스 할 수 없습니다.

별도의 인수를 위해 크기와 계산이 될 수 있는 것이 유리에 구현할 수 있는 방지를 읽고 어떤 부분적인 기록이다.만약 하나를 사용하는 단일-바이트에서 읽고 같은 파이프,경우에도 하나를 사용하여 고정된 형식으로 데이터를,하나는 것을 허용하는 가능성의 기록을 얻기 분할 두 가지 이상의 읽습니다.는 경우 수신한 요청의 예non-blocking 읽의 최대 40 레코드의 10 각각의 바이트가 있을 때 293 바이트 사용할 수 있고,시스템의 반환 290 바이트(29 전체 레코드)을 남기면서 3 바이트가 준비한 다음 읽기,는 것은 훨씬 더 편리합니다.

나는 알지 못하는 어느 정도의 구현 fread 처리할 수 있는 그런 의미 있지만,그들은 확실히 편리한에 구현할 수 있는 약속이 그들을 지원합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top