В некоторых системах (Linux, я знаю; вероятно, в других * nix) вы можете сделать:
#include <unistd.h>
#include <sys/ioctl.h>
ssize_t fd_ready_size(int fd) {
int sz;
int rc;
rc = ioctl(fd, FIONREAD, &sz);
if (rc) { // rc = -1 or 0
return rc;
}
return sz;
}
для большинства любых входных файлов.Вы должны заметить, что я не прошел здесь FILE *
.Я сделал это, потому что это могло бы ввести в заблуждение.ФАЙЛ stdio может содержать в себе буферизованные данные, которые необходимо будет добавить в то, что операционная система сообщает о готовности к чтению.Это усложняет ситуацию, и я не знаю, есть ли разумный способ получить это значение.
Я возвратил ssize_t
(это тип размера со знаком), потому что этоэто то, что возвращается при чтении и записи в системах POSIX, а -1 обозначает случай ошибки.
Если вы используете систему, которая не позволяет вам этого делать, а stat не дает вам того, что вы хотитеВозможно, вам придется прибегнуть к хитростям.Один из способов - попытаться прочитать определенный размер (мы назовем X), и если вам удастся получить эту полную сумму, вы можете подумать «может быть немного больше» и перераспределить ваш буфер для хранения еще немного, и повторять доВы получаете чтение, которое не полностью заполняет пространство, которое у вас есть.Если у вас есть какой-либо тип функции опроса (который вы, вероятно, делали с тех пор, как вызывали stat), то вы также можете использовать ее, чтобы попытаться не вызывать функцию чтения, если вы не уверены, что есть данные (если у вас нет открытого файла, не блокирующегов этом случае это не имеет значения).