Перейти к содержимому

Read c что это

  • автор:

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 может быть недоступно на некоторых файлах и/или дисках.

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() не выполняет этих действий.

_read

fd
Дескриптор файла, ссылающийся на открытый файл.

buffer
Место хранения данных.

buffer_size
Максимальное число байтов для чтения.

Возвращаемое значение

_read возвращает количество операций чтения байтов, которое может быть меньше buffer_size buffer_size байтов, оставшихся в файле, или если файл был открыт в текстовом режиме. В текстовом режиме каждая пара \r\n канала возврата каретки заменяется одним символом \n канала строки. В возвращаемом значении учитывается только символ одного канала строки. Замена не влияет на указатель файла.

Если функция пытается прочитать конечную часть файла, она возвращает 0. Если fd недопустимый, файл не открыт для чтения или заблокирован, вызывается обработчик недопустимых параметров, как описано в разделе проверки параметров. Если выполнение может быть продолжено, функция возвращает -1 и устанавливает errno в значение EBADF .

Если buffer задано NULL значение или buffer_size > INT_MAX если вызывается недопустимый обработчик параметров. Если продолжение выполнения разрешено, функции возвращают значение −1 и задают для errno значение EINVAL .

Дополнительные сведения об этом и других кодах возврата см. в разделе errno , _doserrno _sys_errlist и _sys_nerr .

Замечания

Функция _read считывает максимум buffer_size байтов buffer из файла, связанного с fd ним. Операция чтения начинается с текущего положения указателя файла, связанного с данным файлом. После операции чтения указатель файла указывает на следующий непрочитанный символ.

Если файл был открыт в текстовом режиме, чтение завершается, когда _read встречает символ CTRL + Z, который интерпретируется как индикатор конца файла. Используется _lseek для очистки индикатора конца файла.

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью «Глобальное состояние» в CRT.

Требования

Маршрут Обязательный заголовок
_read

Дополнительные сведения о совместимости см. в разделе Совместимость.

Библиотеки

Пример

// crt_read.c /* This program opens a file named crt_read.txt * and tries to read 60,000 bytes from * that file using _read. It then displays the * actual number of bytes read. */ #include /* Needed only for _O_RDWR definition */ #include #include #include #include char buffer[60000]; int main( void ) < int fh, bytesread; unsigned int nbytes = 60000; /* Open file for input: */ if ( _sopen_s( &fh, "crt_read.txt", _O_RDONLY, _SH_DENYNO, 0 )) < perror( "open failed on input file" ); exit( 1 ); >/* Read in input: */ if (( bytesread = _read( fh, buffer, nbytes ))

Входные данные: crt_read.txt

Line one. Line two. 

Выходные данные

Read 19 bytes from file 

Функции-члены входного потока

Функции — члены потока ввода используются для дисковых операций ввода.

open

Если вы используете входной поток файлов ( ifstream ), необходимо связать этот поток с определенным файлом диска. Это можно сделать в конструкторе или использовать функцию open . В любом случае аргументы одни и те же.

Обычно при открытии файла, связанного с входным потоком ios_base::openmode (используется ios::in режим по умолчанию). openmode Список флагов см. в разделе ios_base::openmode . Флаги можно объединить с побитовой «или» ( | ) оператором.

Чтобы прочитать файл, сначала используйте fail функцию-член, чтобы определить, существует ли она:

istream ifile("FILENAME"); if (ifile.fail()) // The file does not exist . 

get

Неформатированная get функция-член работает как >> оператор с двумя исключениями. Во-первых, get функция включает символы пробела, а средство извлечения исключает пробелы при skipws установке флага (по умолчанию). Во-вторых, функция, скорее всего, get приведет к очистке связанного выходного потока ( cout например).

Вариант функции задает адрес буфера get и максимальное число символов для чтения. Это полезно для ограничения количества символов, отправленных в конкретную переменную, как показано в примере:

// ioo_get_function.cpp // compile with: /EHsc // Type up to 24 characters and a terminating character. // Any remaining characters can be extracted later. #include using namespace std; int main() < char line[25]; cout "; cin.get( line, 25 ); cout

Входные данные

1234 

Образец вывода

1234 

getline

Функция-член getline похожа на функцию get . Обе функции допускают третий аргумент, который указывает завершающий символ для входных данных. Значение по умолчанию — символ новой строки. Обе функции резервируют один символ для необходимого завершающего символа. Тем не менее, get оставляет конечный символ в потоке и getline удаляет конечный символ.

В следующем примере задается завершающий символ для потока ввода:

// getline_func.cpp // compile with: /EHsc #include using namespace std; int main( )

Входные данные

test 

read

Функция-член read считывает байты из файла в указанную область памяти. Аргумент length определяет количество прочтенных байтов. Если этот аргумент не включен, чтение останавливается при достижении физического конца файла или в случае файла в текстовом режиме при чтении внедренного EOF символа.

Этот пример считывает двоичную запись из файла заработной платы в структуру:

#include #include using namespace std; int main() < struct < double salary; char name[23]; >employee; ifstream is( "payroll" ); if( is ) < // ios::operator void*() is.read( (char *) &employee, sizeof( employee ) ); cout else < cout > 

Программа предполагает, что записи данных форматируются точно так же, как указано структурой без конца возвращаемых возвращаемых каретки или символов канала строки.

seekg и tellg

Потоки входного файла хранят внутренний указатель на позицию в файле, с которой будет продолжаться чтение. Этот указатель можно установить функцией seekg , как показано ниже:

#include #include using namespace std; int main( ) < char ch; ifstream tfile( "payroll" ); if( tfile ) < tfile.seekg( 8 ); // Seek 8 bytes in (past salary) while ( tfile.good() ) < // EOF or failure stops the reading tfile.get( ch ); if( !ch ) break; // quit on null cout > else < cout > 

seekg Чтобы использовать для реализации систем управления данными, ориентированных на запись, умножьте размер записи фиксированной длины на номер записи, чтобы получить положение байтов относительно конца файла, а затем используйте get объект для чтения записи.

Функция-член tellg возвращает текущую позицию в файле для чтения. Это значение имеет тип streampos , определенный typedef в . В следующем примере выполняется чтение файла и показ сообщения с позициями пробелов.

#include #include using namespace std; int main( ) < char ch; ifstream tfile( "payroll" ); if( tfile ) < while ( tfile.good( ) ) < streampos here = tfile.tellg(); tfile.get( ch ); if ( ch == ' ' ) cout > else < cout > 

close

Функция-член close закрывает файл диска, связанный с входным потоком файлов, и освобождает дескриптор файла операционной системы. Деструктор ifstream закрывает файл, но можно использовать close функцию, если нужно открыть другой файл для одного объекта потока.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

https://czena.narkolog-na-dom-voronezh-11.ru/