Read c что это
read () пытается записать count байтов файлового описателя fd в буфер, адрес которого начинается с buf .
Если количество count равно нулю, то read () возвращает это нулевое значение и завершает свою работу. Если count больше, чем SSIZE_MAX , то результат не может быть определен.
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
При успешном завершении вызова возвращается количество байтов, которые были считаны (нулевое значение означает конец файла), а позиция файла увеличивается на это значение. Если количество прочитанных байтов меньше, чем количество запрошенных, то это не считается ошибкой: например, данные могли быть почти в конце файла, в канале, на терминале, или read () был прерван сигналом. В случае ошибки возвращаемое значение равно -1, а переменной errno присваивается номер ошибки. В этом случае позиция файла не определена.
НАЙДЕННЫЕ ОШИБКИ
EINTR Системный вызов был прерван сигналом до того, как был прочитан хотя бы один байт. EAGAIN При помощи O_NONBLOCK был выбран неблокирующий (non-blocking) ввод-вывод, и нет данных, доступных для чтения в данный момент. EIO Ошибка ввода-вывода. Это может произойти, например, если процесс, находящийся в группе фоновых процессов, пытается читать данные на контрольном терминале, игнорирует или блокирует сигнал SIGTTIN , или же его группа осталась без родителя. Это может также случиться, если произошла низкоуровневая ошибка ввода-вывода при считывании данных с диска или ленты. EISDIR fd указывает на каталог. EBADF fd является неверным файловым описателем или не открыт для чтения. EINVAL fd связан с объектом, не предназначенным для чтения. EFAULT buf указывает на каталог за пределами доступного адресного пространства.
Могут также возникнуть другие ошибки (в зависимости от объекта, связанного с fd ). POSIX позволяет системному вызову read , который был прерван после чтения первого блока запрошенных данных, вернуть значение -1 (устанавливая значение переменной errno равным EINTR) или количество уже прочитанных байтов.
СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, SVID, AT&T, POSIX, X/OPEN, BSD 4.3
НАЙДЕННЫЕ ОШИБКИ И ОГРАНИЧЕНИЯ
В файловых системах NFS чтение небольших порций данных обновляет значение временного штампа только в первый раз. Это вызвано кэшированием атрибутов со стороны клиента: большинство клиентов NFS (если не все) предоставляют серверу право обновлять время доступа, а запросы на чтение, которые удовлетворяются из клиентского кэша, не вызывают обновления времени доступа, потому что данные не считываются с сервера. Семантика UNIX может быть получена путем запрета кэширования атрибутов, но в большинстве случаев это увеличит нагрузку на сервер и уменьшит производительность.
Много файловых систем и дисков создавались достаточно быстрыми для того, чтобы в использовании O_NONBLOCK не было необходимости. Поэтому иногда O_NONBLOCK может быть недоступно на некоторых файлах и/или дисках.
Read c что это
Ввод-вывод основан на системных вызовах read и write, к которым программа на Си обращается с помощью функций с именами read и write. Для обеих первым аргументом является дескриптор файла. Во втором аргументе указывается массив символов вашей программы, куда посылаются или откуда берутся данные. Третий аргумент — это количество пересылаемых байтов.
int n_read = read(int fd, char *buf, int n); int n_written = write(int fd, char *buf, int n);
Обе функции возвращают число переданных байтов. При чтении количество прочитанных байтов может оказаться меньше числа, указанного в третьем аргументе. Нуль означает конец файла, а –1 сигнализирует о какой-то ошибке. При записи функция возвращает количество записанных байтов, и если это число не совпадает с требуемым, следует считать, что запись не произошла.
За один вызов можно прочитать или записать любое число байтов. Обычно это число равно или 1, что означает посимвольную передачу без буферизации, или чему-нибудь вроде 1024 или 4096, соответственно размеру физического блока внешнего устройства. Эффективнее обмениваться большим числом байтов, поскольку при этом требуется меньше системных вызовов. Используя полученные сведения, мы можем написать простую программу, копирующую свой ввод на свой вывод и эквивалентную программе копирования файла, описанной в главе 1. С помощью этой программы можно копировать откуда угодно и куда угодно, поскольку всегда существует возможностьперенаправить ввод или вывод на любой файл или устройство.
#include "syscalls.h" main() /* копирование ввода на вывод */ < char buf[BUFSIZ]; int n; while ((n = read(0, buf, BUFSIZ)) >0) write(i, buf, n); return 0; >
Прототипы функций, обеспечивающие системные вызовы, мы собрали в файле syscalls.h, что позволяет нам включать его в программы этой главы. Однако имя данного файла не зафиксировано стандартом.
Параметр BUFSIZ также определен в syscalls.h; в каждой конкретной системе он имеет свое значение. Если размер файла не кратен BUFSIZ, то какая-то операция чтения вернет значение меньшее, чем BUFSIZ, а следующее обращение к read даст в качестве результата нуль.
Полезно рассмотреть, как используются read и write при написании программ более высокого уровня — таких как getchar, putchar и т.д. Вот, к примеру, версия программы getchar, которая осуществляет небуферизованный ввод, читая по одному символу из стандартного входного потока.
#include «syscalls.h» /* getchar: небуферизованный ввод одного символа */ int getchar(void)
Переменная c должна быть типа char, поскольку read требует указатель на char. Приведение c к unsigned char перед тем, как вернуть ее в качестве результата, исключает какие-либо проблемы, связанные с распространением знака.
Вторая версия getchar осуществляет ввод большими блоками, но при каждом обращении выдает только один символ.
#include "syscalls.h" /* getchar: простая версия с буферизацией */ int getchar(void) < static char buf[BUFSIZ]; static char *bufp = buf; static int n = 0; if (n == 0) < /* буфер пуст */ n = read(0, buf, sizeof(buf)); bufp = buf; >return (--n >= 0) ? (unsigned char) *bufp++ : EOF; >
Если приведенные здесь версии функции getchar компилируются с включением заголовочного файла и в этом заголовочном файле getchar определена как макрос, то нужно задать строку #undef с именем getchar.
int _rtl_read(int fd, void *buf, unsigned count)
Ни одна из этих функций не определена стандартом ANSI С. Функция read() является частью UNIX-подобной системы ввода/вывода. Функция _rtl_read() является принадлежностью Borland С++ и операционной системы Windows.
Функция read() считывает count байт из файла, описываемого аргументом fd, в буфер, на который указывает аргумент buf Указателю положения в файле дается приращение на количество считанных байт. Если файл открыт в текстовом режиме, то может иметь место транслирование символов.
Функция возвращает количество действительно считанных байт. Это количество может быть меньше, чем count, если встретился маркер конца файла или если до того, как было считано count байт, произошла ошибка. В случае ошибки возвращается —1, а 0 возвращается при попытке чтения в конце файла. Если произошла ошибка, errno устанавливается в одно из следующий значений:
| EACCESS | Доступ запрещен |
| EBADF | Недействительный номер файла |
Разница между функциями read() и _rtl_read() заключается в том, что read() удаляет символы «возврат каретки» и возвращает EOF при считывании из текстового файла CTRL-Z. Функция _rtl_read() не выполняет этих действий.
Данная программа считывает 100 байт из TEST. TST в массив buffer :
#include
#include
#include
#include
int main ( void )
{
int fd ;
char buffer [ 100 ] ;
if ( ( fd = open ( "TEST.TST" , O_RDONLY ) ) ==- 1 ) {
printf ( "Cannot open file. \n " ) ;
exit ( 1 ) ;
}
if ( read ( fd , buffer , 100 ) != 100 )
printf ( "Possible read error." ) ;
return 0 ;
}
read
Имя read функции POSIX, реализованное корпорацией Майкрософт, является устаревшим псевдонимом для _read функции. По умолчанию он создает предупреждение компилятора (уровень 3) C4996. Имя устарело, так как оно не соответствует стандартным правилам C для имен, относящихся к реализации. Однако функция по-прежнему поддерживается.
Вместо этого рекомендуется использовать _read . Кроме того, вы можете продолжать использовать это имя функции и отключить предупреждение. Дополнительные сведения см. в разделе "Отключение имен функций предупреждения и POSIX".
Дополнительные ресурсы
Значок отказа согласно Закону Калифорнии о защите конфиденциальности потребителей (CCPA)