fwrite/fread(3)는 역사적으로 다양한 플랫폼에서 다양한 "다중 항목" 동작을 제공했습니까?

fwrite/fread(3)는 역사적으로 다양한 플랫폼에서 다양한 "다중 항목" 동작을 제공했습니까?

다양한 항목 수에 대한 추가 인수가 있습니다 fread(3). fwrite(3)따라서 일반적인 쓰기에는 char로 시작하는 버퍼만 있기 때문에 일반적으로 하드코드된 개수가 있습니다(예: ) fwrite(data, len, 1, stdout).

이 매개변수의 의미는 무엇입니까? 이것은 항상 편리한 "시스템이 곱셈을 하도록" 하는 것이었습니까 calloc(3)? 아니면 일부 과거 운영 체제 및/또는 저장 장치에 작성된 개별 항목을 특별하게 처리하는 기능이 있었습니까?

일부 IBM z/OS 문서를 우연히 발견했을 때 호기심이 자극되었습니다.그들의fwrite()"레코드 I/O 출력"과 "블록 I/O 출력"을 구별하고 각 항목이 특정 길이를 초과하여 잘리는 방법에 대해 설명합니다. 항목 개수 매개변수가 매핑, 말하자면, 분리에 사용되는지 궁금합니다. 물리적 펀치 카드 - 또는 최소한 ASCII "레코드 구분 기호" 문자나 기타 문자를 사용하여 데이터를 뒤에서 기록할 수 있습니다.

비교하자면,POSIX fwrite 사양그냥 직설적으로 말해보세요:

fputc()각 개체에 대해 해당 개체를 정확히 포함하는 부호 없는 문자 배열에서 값(순서대로)을 가져와서 함수에 크기 호출을 수행해야 합니다 .

이는 이전처럼 버퍼와 전체 길이를 먼저 fwrite고려 하지 않는 이유에 대한 질문을 제기합니다 .const uint8_t*size_twrite(2)

답변1

내가 아는 한, 이러한 함수는 Unix 버전 7에서 처음 등장했으며,구현하다, 단지 특별한 작업을 수행합니다. 즉, 반환 값을 확인하는 fwrite대신 각 데이터 블록을 작성한 후 스트림의 오류 플래그를 확인합니다 . size그러나 I/O 오류가 발생할 때 추가 사이클을 낭비하는 것 외에는 실제 효과가 없는 것 같습니다.putcfreadgetc

putc과 는 둘 다 단순한 매크로이기 때문에 예전보다 많이 빠르진 ferror않다고 생각합니다 .fwrite(b, large_val, 1, f)fwrite(b, 1, large_val, f)

fwrite(ptr, size, count, iop)
unsigned size, count;
register char *ptr;
register FILE *iop;
{
        register unsigned s;
        unsigned ndone;

        ndone = 0;
        if (size)
        for (; ndone<count; ndone++) {
                s = size;
                do {
                        putc(*ptr++, iop);
                } while (--s);
                if (ferror(iop))
                        break;
        }
        return(ndone);
}

관련 정보