Я хотел бы прочитать только то, что уже находится в буфере объекта FILE
, чтобы впоследствии буфер был пуст (и я могу использовать такие вещи, как sendfile
, который работает с файловыми дескрипторами). Я придумал эту функцию, которая, кажется, работает на моей 64-битной установке Linux:
int readbuf(FILE *stream, char buf[], size_t *size) {
off_t pos = ftello(stream);
if (pos < 0) return -1;
off_t realpos = lseek(fileno(stream), 0, SEEK_CUR);
if (realpos < 0) return -1;
if (pos > realpos) {
errno = EIO;
return -1;
}
size_t bufsize = realpos - pos;
if (bufsize > *size) {
*size = bufsize;
errno = ERANGE;
return -1;
}
*size = bufsize;
if (fread(buf, bufsize, 1, stream) < 1) {
return -1;
}
return 0;
}
Теперь мне интересно, могу ли я предположить, что это работает на других POSIX-совместимых операционных системах? (В системах, которые обеспечивают все задействованные функции.)