다양한 항목 수에 대한 추가 인수가 있습니다 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_t
write(2)
답변1
내가 아는 한, 이러한 함수는 Unix 버전 7에서 처음 등장했으며,구현하다, 단지 특별한 작업을 수행합니다. 즉, 반환 값을 확인하는 fwrite
대신 각 데이터 블록을 작성한 후 스트림의 오류 플래그를 확인합니다 . size
그러나 I/O 오류가 발생할 때 추가 사이클을 낭비하는 것 외에는 실제 효과가 없는 것 같습니다.putc
fread
getc
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);
}