Что означают все параметры в fread и fwrite? - PullRequest
0 голосов
/ 30 апреля 2020

Я начал использовать fread и fwrite для отправки файлов по TCP-соединению, и мне было интересно, что означают параметры для функций. Я попытался прочитать документацию, но я не понял разницу между вторым параметром (размер) и третьим (nmemb). Может ли кто-нибудь описать назначение каждого параметра и разницу между двумя параметрами, упомянутыми выше? Спасибо.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Может ли кто-нибудь описать ... разницу между двумя упомянутыми выше параметрами?

size_t fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);

size - это размер одного читаемого элемента. Например, при чтении double размер будет sizeof(double) или обычно 8.

nmemb - это максимальное количество элементов для чтения.

Важно, что возвращаемое значение - это число прочитанных элементов, необязательно количество прочитанных байтов.


Может ли кто-нибудь описать назначение каждого параметра ...?

ptr - это местоположение в памяти, чтобы начать сохранение данных.

stream - указатель FILE * для использования при чтении, часто результат fopen().


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

FILE *inf = fopen("data.bin", "rb");
if (inf) {
  double data[N];
  size_t n;
  while ((n = fread(data, sizeof data[0], N, inf)) > 0) {
    printf("Read %zu doubles, first one %g\n", n, data[0]);
  }
  fclose(inf);
} 
1 голос
/ 30 апреля 2020

fread и fwrite, определенные в <stdio.h> (документы здесь ), имеют следующую подпись:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *" stream );
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  1. Для обоих из них требуется указатель на буфер, ptr, который будет содержать начальный адрес, куда должны быть скопированы данные (fread) или куда скопировать (fwrite)
  2. Они оба должны копироваться nmemb элементов каждый из size байтов. S Например, если вы копируете буфер из 100 символов

    fread (ptr, 1, 100, filePointer);

, поскольку размер char равно 1. В общем случае, когда вы копируете N элементов типа myType

 fread( ptr, sizeof(myType), N, filePointer );

, и в этом случае будет прочитано всего sizeof(myType) * N байт.

Для них требуется действительный указатель на файл (FILE *), полученный с помощью успешного вызова функции fopen (описано здесь ).

Говоря об их возвращаемом значении, я не могу написать описания лучше, чем те, которые содержатся в связанной документации:

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

Таким образом, в случае успеха он вернет самое большее nmemb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...