fread()
изначально был частью стандартной библиотеки C, libc
, определенной в <stdio.h>
.Стандартная библиотека C ++ делает то же самое fread()
доступным через оболочку библиотеки C <cstdio>
.
read()
не имеет такой оболочки (возможно, потому что она конфликтует с версией istream
), но вы можетепо-прежнему вызывать его с помощью библиотеки C.Вы правы, что read()
взято из специфического для POSIX расширения <unistd.h>
и не является частью стандартной библиотеки, но с тех пор оно реализовано довольно широко и часто распространяется с libc
.
Вы также правы, что read()
установит errno
при сбое, и одна из этих ошибок может быть EINTR
.А с другой стороны, когда fread()
терпит неудачу, не может выяснить, какая ошибка произошла, так что технически вы также правы, что в этом случае вхождения EINTR
скрыты от пользователя.Действительно, то, как fread()
обрабатывает любые специфичные для платформы детали, зависит от реализации.Но было бы натяжкой сказать, что этот шаблон применяется ко «всем стандартным библиотечным функциям C ++» - вам действительно нужно проверять каждый случай отдельно.
Если вы хотите написать «правильно работающий» код, который выполняетсяна каждой платформе, тогда не используйте расширения POSIX.Придерживайтесь fread()
и друзей и принимайте тот факт, что обобщение между платформами означает, что вы не сможете получить конкретные сведения о платформе, такие как номера ошибок.Поскольку возможные ошибки зависят от платформы, нет общего способа узнать, следует ли вам повторить попытку.
Более подробная информация о различиях между read()
и fread()
приведена здесь .