Fwrite() function in c

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

В случае успеха _write возвращает число записанных байтов.If successful, _write returns the number of bytes written. Если фактическое пространство на диске меньше, чем размер буфера, который функция пытается записать на диск, _write завершается сбоем и не сбрасывает содержимое буфера на диск.If the actual space remaining on the disk is less than the size of the buffer the function is trying to write to the disk, _write fails and does not flush any of the buffer’s contents to the disk. Возвращаемое значение, равное-1, указывает на ошибку.A return value of -1 indicates an error. Если передается недопустимый параметр, эта функция вызывает обработчик недопустимых параметров, как описано в разделе Проверка параметров.If invalid parameters are passed, this function invokes the invalid parameter handler, as described in Parameter Validation. Если выполнение может быть продолжено, функция возвращает значение-1 , а параметру возврата — одно из трех значений: значение EBADF, что означает, что дескриптор файла недействителен или файл не открыт для записи. Еноспк. Это означает, что на устройстве недостаточно свободного места для операции; или еинвал, что означает, что буфер был пустым указателем или что в файл в режиме Юникода было передано нечетное число байтов.If execution is allowed to continue, the function returns -1 and errno is set to one of three values: EBADF, which means the file descriptor is invalid or the file is not opened for writing; ENOSPC, which means there is not enough space left on the device for the operation; or EINVAL, which means that buffer was a null pointer or that an odd count of bytes was passed to be written to a file in Unicode mode.


Дополнительные сведения об этих и других кодах возврата см. в разделе переввод , _doserrno, _sys_errlist и _sys_nerr.For more information about these and other return codes, see errno, _doserrno, _sys_errlist, and _sys_nerr.

Если файл открыт в текстовом режиме, каждый символ перевода строки заменяется парой символов возврата каретки и перевода строки в выходных данных.If the file is opened in text mode, each line feed character is replaced with a carriage return-line feed pair in the output. Замена не влияет на возвращаемое значение.The replacement doesn’t affect the return value.

Когда файл открывается в режиме преобразования Юникода (например, если демон открывается с помощью _open или _sopen и параметр mode, включающий _O_WTEXT, _O_U16TEXTили _O_U8TEXTили, если он открыт с помощью FOPEN и параметр mode, включающий CCS = Unicode, CCS = UTF-16LEили CCS = UTF-8, или, если режим был изменен на режим преобразования Юникода с помощью _setmode—buffer интерпретируется как указатель на массив , содержащий данные UTF-16 .When the file is opened in Unicode translation mode—for example, if fd is opened by using _open or _sopen and a mode parameter that includes _O_WTEXT, _O_U16TEXT, or _O_U8TEXT, or if it’s opened by using fopen and a mode parameter that includes ccs=UNICODE, ccs=UTF-16LE, or ccs=UTF-8, or if the mode is changed to a Unicode translation mode by using _setmode—buffer is interpreted as a pointer to an array of that contains UTF-16 data. Попытка записи нечетного числа байт в этом режиме приводит к возникновению ошибки проверки параметра.An attempt to write an odd number of bytes in this mode causes a parameter validation error.

DESCRIPTION top

       The functionality described on this reference page is aligned with
       the ISO C standard. Any conflict between the requirements described
       here and the ISO C standard is unintentional. This volume of
       POSIX.1‐2008 defers to the ISO C standard.

       The fwrite() function shall write, from the array pointed to by ptr,
       up to nitems elements whose size is specified by size, to the stream
       pointed to by stream.  For each object, size calls shall be made to
       the fputc() function, taking the values (in order) from an array of
       unsigned char exactly overlaying the object. The file-position
       indicator for the stream (if defined) shall be advanced by the number
       of bytes successfully written. If an error occurs, the resulting
       value of the file-position indicator for the stream is unspecified.

       The last data modification and last file status change timestamps of
       the file shall be marked for update between the successful execution
       of fwrite() and the next successful completion of a call to fflush()
       or fclose() on the same stream, or a call to exit() or abort().

Parameters

  • stream − This is the pointer to a FILE object that identifies the stream.

  • format − This is the C string that contains the text to be written to the stream. It can optionally contain embedded format tags that are replaced by the values specified in subsequent additional arguments and formatted as requested. Format tags prototype is %specifier, which is explained below −

Sr.No. specifier & Output
1

c

Character

2

d or i

Signed decimal integer

3

e

Scientific notation (mantissa/exponent) using e character

4

E

Scientific notation (mantissa/exponent) using E character

5

f

Decimal floating point

6

g

Uses the shorter of %e or %f

7

G

Uses the shorter of %E or %f

8

o

Signed octal

9

s

String of characters

10

u

Unsigned decimal integer

11

x

Unsigned hexadecimal integer

12

X

Unsigned hexadecimal integer (capital letters)

13

p

Pointer address

14

n

Nothing printed

15

%

Character

Sr.No. Flags & Description
1

Left-justifies within the given field width; Right justification is the default (see width sub-specifier).

2

+


Forces to precede the result with a plus or minus sign (+ or -) even for positive numbers. By default, only negative numbers are preceded with a -ve sign.

3

(space)

If no sign is written, a blank space is inserted before the value.

4

#

Used with o, x or X specifiers. The value is preceded with 0, 0x or 0X respectively for values different than zero. Used with e, E and f, it forces the written output to contain a decimal point even if no digits would follow. By default, if no digits follow then no decimal point is written. Used with g or G the result is the same as with e or E but trailing zeros are not removed.

5

Left-pads the number with zeroes (0) instead of spaces, where padding is specified (see width sub-specifier).

Sr.No. Width & Description
1

(number)

Minimum number of characters to be printed. If the value to be printed is shorter than this number, the result is padded with blank spaces. The value is not truncated even if the result is larger.

2

*

The width is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.

Sr.No. .precision & Description
1

.number

For integer specifiers (d, i, o, u, x, X) − precision specifies the minimum number of digits to be written. If the value to be written is shorter than this number, the result is padded with leading zeros. The value is not truncated even if the result is longer. A precision of 0 means that no character is written for the value 0. For e, E and f specifiers: this is the number of digits to be printed after the decimal point. For g and G specifiers: This is the maximum number of significant digits to be printed. For s: this is the maximum number of characters to be printed. By default all characters are printed until the ending null character is encountered. For c type: it has no effect. When no precision is specified, the default is 1. If the period is specified without an explicit value for precision, 0 is assumed.

2

.*

The precision is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.

Sr.No. Length & Description
1

h

The argument is interpreted as a short int or unsigned short int (only applies to integer specifiers: i, d, o, u, x and X).

2

l

The argument is interpreted as a long int or unsigned long int for integer specifiers (i, d, o, u, x and X), and as a wide character or wide character string for specifiers c and s.

3

L

The argument is interpreted as a long double (only applies to floating point specifiers: e, E, f, g and G).


additional arguments − Depending on the format string, the function may expect a sequence of additional arguments, each containing one value to be inserted instead of each %-tag specified in the format parameter, if any. There should be the same number of these arguments as the number of %-tags that expect a value.

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

fwrite возвращает число фактически записанных полных элементов, что может быть меньше количества при возникновении ошибки.fwrite returns the number of full items actually written, which may be less than count if an error occurs. Кроме того, в случае возникновения ошибки невозможно определить индикатор положения файла.Also, if an error occurs, the file-position indicator cannot be determined. Если Stream или buffer является пустым указателем или если в режиме Юникода указано нечетное число байтов, то функция вызывает обработчик недопустимых параметров, как описано в разделе Проверка параметров.If either stream or buffer is a null pointer, or if an odd number of bytes to be written is specified in Unicode mode, the function invokes the invalid parameter handler, as described in Parameter Validation. Если выполнение может быть продолжено, эта функция устанавливает еинвал и возвращает 0.If execution is allowed to continue, this function sets errno to EINVAL and returns 0.

BUGS top

       According to POSIX.1-2008/SUSv4 Section XSI 2.9.7 ("Thread
       Interactions with Regular File Operations"):

           All of the following functions shall be atomic with respect to
           each other in the effects specified in POSIX.1-2008 when they
           operate on regular files or symbolic links: ...

       Among the APIs subsequently listed are write() and writev(2).  And
       among the effects that should be atomic across threads (and
       processes) are updates of the file offset.  However, on Linux before
       version 3.14, this was not the case: if two processes that share an
       open file description (see open(2)) perform a write() (or writev(2))
       at the same time, then the I/O operations were not atomic with
       respect updating the file offset, with the result that the blocks of
       data output by the two processes might (incorrectly) overlap.  This
       problem was fixed in Linux 3.14.

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

fread возвращает число фактически считанных полных элементов, которое может быть меньше, Если возникает ошибка или если конец файла обнаружен до достижения количестваобращений.fread returns the number of full items actually read, which may be less than count if an error occurs or if the end of the file is encountered before reaching count. Используйте функцию feof или ferror , чтобы отличать ошибку чтения от условия конца файла.Use the feof or ferror function to distinguish a read error from an end-of-file condition. Если параметр size или Count имеет значение 0, fread возвращает 0, а содержимое буфера не изменяется.If size or count is 0, fread returns 0 and the buffer contents are unchanged. Если Stream или buffer является пустым указателем, fread вызывает обработчик недопустимого параметра, как описано в разделе Проверка параметров.If stream or buffer is a null pointer, fread invokes the invalid parameter handler, as described in Parameter Validation. Если выполнение может быть продолжено, эта функция устанавливает еинвал и возвращает 0.If execution is allowed to continue, this function sets errno to EINVAL and returns 0.

Дополнительные сведения об этих кодах ошибок см. в разделе _досеррно, _код ошибки,_sys еррлист и _sys_Нерр .See _doserrno, errno, _sys_errlist, and _sys_nerr for more information on these error codes.

DESCRIPTION top

       write() writes up to count bytes from the buffer starting at buf to
       the file referred to by the file descriptor fd.

       The number of bytes written may be less than count if, for example,
       there is insufficient space on the underlying physical medium, or the
       RLIMIT_FSIZE resource limit is encountered (see setrlimit(2)), or the
       call was interrupted by a signal handler after having written less
       than count bytes.  (See also pipe(7).)

       For a seekable file (i.e., one to which lseek(2) may be applied, for
       example, a regular file) writing takes place at the file offset, and
       the file offset is incremented by the number of bytes actually
       written.  If the file was open(2)ed with O_APPEND, the file offset is
       first set to the end of the file before writing.  The adjustment of
       the file offset and the write operation are performed as an atomic
       step.

       POSIX requires that a read(2) that can be proved to occur after a
       write() has returned will return the new data.  Note that not all
       filesystems are POSIX conforming.

       According to POSIX.1, if count is greater than SSIZE_MAX, the result
       is implementation-defined; see NOTES for the upper limit on Linux.

Errors

EAGAIN
The file descriptor fd refers to a file other than a socket and has been marked nonblocking (O_NONBLOCK), and the write would block.
EAGAIN or EWOULDBLOCK
The file descriptor fd refers to a socket and has been marked nonblocking (O_NONBLOCK), and the write would block. POSIX.1-2001 allows either error to be returned for this case, and does not require these constants to have the same value, so a portable application should check for both possibilities.
EBADF
fd is not a valid file descriptor or is not open for writing.
EDESTADDRREQ
fd refers to a datagram socket for which a peer address has not been set using connect(2).
EDQUOT
The user’s quota of disk blocks on the file system containing the file referred to by fd has been exhausted.
EFAULT
buf is outside your accessible address space.
EFBIG
An attempt was made to write a file that exceeds the implementation-defined maximum file size or the process’s file size limit, or to write at a position past the maximum allowed offset.
EINTR
The call was interrupted by a signal before any data was written; see signal(7).
EINVAL
fd is attached to an object which is unsuitable for writing; or the file was opened with the O_DIRECT flag, and either the address specified in buf, the value specified in count, or the current file offset is not suitably aligned.
EIO
A low-level I/O error occurred while modifying the inode.
ENOSPC
The device containing the file referred to by fd has no room for the data.
EPIPE
fd is connected to a pipe or socket whose reading end is closed. When this happens the writing process will also receive a SIGPIPE signal. (Thus, the write return value is seen only if the program catches, blocks or ignores this signal.)

Other errors may occur, depending on the object connected to fd.

fwrite

В языке программирования Си функции и соответственно реализуют файловые операции ввода и вывода. и объявлены в .

Запись в файл при помощи fwrite

fwrite определяется как

int fwrite ( const char * array, size_t size, size_t count, FILE * stream );

Функция записывает блок данных в поток. Таким образом запишется массив элементов в текущую позицию в потоке. Для каждого элемента запишется байт. Индикатор позиции в потоке изменится на число байт, записанных успешно. Возвращаемое значение будет равно в случае успешного завершения записи. В случае ошибки возвращаемое значение будет меньше .

Следующая программа открывает файл пример.txt, записывает в него строку символов, а затем его закрывает.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    FILE *fp;
    size_t count;
    char const *str = "привет\n";

    fp = fopen("пример.txt", "wb");
    if(fp == NULL) {
        perror("ошибка открытия пример.txt");
        return EXIT_FAILURE;
    }
    count = fwrite(str, sizeof(char), strlen(str), fp);
    printf("Записано %lu байт. fclose(fp) %s.\n", (unsigned long)count, fclose(fp) ==  ? "успешно"  "с ошибкой");

    fclose(fp);
    return ;
}

RemarksRemarks

Функция _write записывает байты счетчика из буфера в файл, связанный с демономк памяти.The _write function writes count bytes from buffer into the file associated with fd. Операция записи начинается с текущего положения указателя файла (при наличии), связанного с данным файлом.The write operation begins at the current position of the file pointer (if any) associated with the given file. Если файл открыт для добавления, операция начинается с текущего конца файла.If the file is open for appending, the operation begins at the current end of the file. После операции записи указатель файла увеличивается на число записанных байтов.After the write operation, the file pointer is increased by the number of bytes written.

При записи в файлы, открытые в текстовом режиме, _write ОБРАБАТЫВАЕТ символ CTRL + Z в качестве логического конца файла.When writing to files opened in text mode, _write treats a CTRL+Z character as the logical end of file. При записи на устройство _write ОБРАБАТЫВАЕТ символ CTRL + Z в буфере как признак конца выходных данных.When writing to a device, _write treats a CTRL+Z character in the buffer as an output terminator.

По умолчанию глобальное состояние этой функции ограничивается приложением.By default, this function’s global state is scoped to the application. Чтобы изменить это, см. раздел глобальное состояние в CRT.To change this, see Global state in the CRT.

PHP Overwriting

Now that «newfile.txt» contains some data we can show what happens when we open an existing file for writing. All the existing data will be ERASED and we start with an empty file.

In the example below we open our existing file «newfile.txt», and write some new data into it:

Example

<?php$myfile = fopen(«newfile.txt», «w») or die(«Unable to open file!»);$txt = «Mickey Mouse\n»;fwrite($myfile, $txt);$txt = «Minnie Mouse\n»;fwrite($myfile, $txt);fclose($myfile);?>

If we now open the «newfile.txt» file, both John and Jane have vanished, and only the data we just wrote is present:

Mickey MouseMinnie Mouse

RemarksRemarks

Функция fread считывает до подсчета размера байтов из входного потока и сохраняет их в буфер.The fread function reads up to count items of size bytes from the input stream and stores them in buffer. Указатель файла, связанный с потоком (при его наличии), увеличивается на число фактически считанных байтов.The file pointer associated with stream (if there is one) is increased by the number of bytes actually read. Если данный поток открыт в текстовом режиме, то символы новой строки в стиле Windows преобразуются в символы новой строки в стиле UNIX.If the given stream is opened in text mode, Windows-style newlines are converted into Unix-style newlines. То есть пары символов возврата каретки и перевода строки (CRLF) заменяются символами перевода строки (LF).That is, carriage return-line feed (CRLF) pairs are replaced by single line feed (LF) characters. Замена не влияет на указатель файла или возвращаемое значение.The replacement has no effect on the file pointer or the return value. В случае ошибки позиция указателя файла будет неопределенной.The file-pointer position is indeterminate if an error occurs. Значение частично считанного элемента не может быть определено.The value of a partially read item cannot be determined.

При использовании в потоке текстового режима, если объем запрошенных данных (то есть число размеров * ) больше или равен размеру внутреннего буфера файла * (по умолчанию это 4096 байт, настраиваемый с помощью setvbuf), потоковые данные копируются непосредственно в предоставленный пользователем буфер, а в этом буфере выполняется преобразование новой строки.When used on a text mode stream, if the amount of data requested (that is, size * count) is greater than or equal to the internal FILE * buffer size (by default this is 4096 bytes, configurable by using setvbuf), stream data is copied directly into the user-provided buffer, and newline conversion is done in that buffer. Поскольку преобразованные данные могут быть короче, чем данные потока, скопированные в буфер, данные за буфер (где RETURN_VALUE является возвращаемым значением из fread) могут содержать непреобразованные данные из файла.Since the converted data may be shorter than the stream data copied into the buffer, data past buffer (where return_value is the return value from fread) may contain unconverted data from the file. По этой причине мы советуем использовать символьные данные, заканчивающиеся нулем, в буфере, если цель буфера — использовать в качестве строки в стиле C.For this reason, we recommend you null-terminate character data at buffer if the intent of the buffer is to act as a C-style string. Дополнительные сведения о влиянии текстового и двоичного режимов см. в разделе fopen .See fopen for details on the effects of text mode and binary mode.

Эта функция блокирует работу других потоков.This function locks out other threads. Если требуется версия без блокировки, используйте _fread_nolock.If you need a non-locking version, use _fread_nolock.

По умолчанию глобальное состояние этой функции ограничивается приложением.By default, this function’s global state is scoped to the application. Чтобы изменить это, см. раздел глобальное состояние в CRT.To change this, see Global state in the CRT.

RemarksRemarks

Функция fread_s считывает количество элементов elementSize байт из входного потока и сохраняет их в буфер.The fread_s function reads up to count items of elementSize bytes from the input stream and stores them in buffer. Указатель файла, связанный с потоком (при его наличии), увеличивается на число фактически считанных байтов.The file pointer that is associated with stream (if there is one) is increased by the number of bytes actually read. Если данный поток открыт в текстовом режиме, пары переводов строки возврата каретки заменяются символами однострочного перевода строки.If the given stream is opened in text mode, carriage return-line feed pairs are replaced with single line feed characters. Замена не влияет на указатель файла или возвращаемое значение.The replacement has no effect on the file pointer or the return value. В случае ошибки позиция указателя файла будет неопределенной.The file-pointer position is indeterminate if an error occurs. Значение частично считанного элемента не может быть определено.The value of a partially read item cannot be determined.

Эта функция блокирует работу других потоков.This function locks out other threads. Если требуется версия без блокировки, используйте _fread_nolock.If you require a non-locking version, use _fread_nolock.

По умолчанию глобальное состояние этой функции ограничивается приложением.By default, this function’s global state is scoped to the application. Чтобы изменить это, см. раздел глобальное состояние в CRT.To change this, see Global state in the CRT.

Пример использования

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

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  char buffer5 = {};  /* инициализируем нулями */
  int i, rc;
  FILE *fp = fopen("мойфайл", "rb");
  if (fp == NULL) {
    perror("Ошибка при открытии \"мойфайл\"");
    return EXIT_FAILURE;
  }
  for (i = ; (rc = getc(fp)) != EOF && i < 5; bufferi++ = rc);
  fclose(fp);
  if (i == 5) {
    puts("Прочитанные байты...");
    printf("%x %x %x %x %x\n", buffer], buffer1], buffer2], buffer3], buffer4]);
  } else
    fputs("Ошибка чтения файла.\n", stderr);
  return EXIT_SUCCESS;
}

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

fread_s возвращает количество (целых) элементов, которые были считаны в буфер, что может быть меньше числа , если ошибка чтения или конец файла обнаружены до достижения количества .fread_s returns the number of (whole) items that were read into the buffer, which may be less than count if a read error or the end of the file is encountered before count is reached. Используйте функцию feof или ferror , чтобы отличить ошибку от условия конца файла.Use the feof or ferror function to distinguish an error from an end-of-file condition. Если параметр size или Count имеет значение 0, fread_s возвращает 0, а содержимое буфера не изменяется.If size or count is 0, fread_s returns 0 and the buffer contents are unchanged. Если Stream или buffer является пустым указателем, fread_s вызывает обработчик недопустимого параметра, как описано в разделе Проверка параметров.If stream or buffer is a null pointer, fread_s invokes the invalid parameter handler, as described in Parameter Validation. Если выполнение может быть продолжено, эта функция устанавливает еинвал и возвращает 0.If execution is allowed to continue, this function sets errno to EINVAL and returns 0.

Дополнительные сведения об этих кодах ошибки см. в разделе _doserrno, errno, _sys_errlist и _sys_nerr.For more information about error codes, see _doserrno, errno, _sys_errlist, and _sys_nerr.

RETURN VALUE top

       On success, the number of bytes written is returned.  On error, -1 is
       returned, and errno is set to indicate the cause of the error.

       Note that a successful write() may transfer fewer than count bytes.
       Such partial writes can occur for various reasons; for example,
       because there was insufficient space on the disk device to write all
       of the requested bytes, or because a blocked write() to a socket,
       pipe, or similar was interrupted by a signal handler after it had
       transferred some, but before it had transferred all of the requested
       bytes.  In the event of a partial write, the caller can make another
       write() call to transfer the remaining bytes.  The subsequent call
       will either transfer further bytes or may result in an error (e.g.,
       if the disk is now full).

       If count is zero and fd refers to a regular file, then write() may
       return a failure status if one of the errors below is detected.  If
       no errors are detected, or error detection is not performed, 0 will
       be returned without causing any other effect.  If count is zero and
       fd refers to a file other than a regular file, the results are not
       specified.

С этим читают