58 votos

¿Cuál es la justificación para fread/fwrite tomando tamaño y cuenta como argumentos?

Tuvimos una discusión aquí en el trabajo con respecto a por qué fread y fwrite tomar un tamaño por miembro, contar y devolver el número de miembros de lectura/escrita en lugar de sólo tomar un buffer y tamaño. El único uso que podemos llegar es que si usted quiere leer/escribir una matriz de estructuras que no son divisibles por la plataforma de alineación y, por tanto, han sido collar pero no puede ser tan común como para justificar esta decisión en el diseño.

Desde FREAD(3):

La función fread() lee nmemb elementos de datos, cada uno del tamaño de bytes de largo, desde el stream apuntado por stream, almacenándolos en la ubicación dada por ptr.

La función fwrite() escribe nmemb elementos de datos, cada uno del tamaño de bytes de largo, para el stream apuntado por stream, obtención de la ubicación dado por el ptr.

fread() y fwrite() devuelve el número de elementos que han leído o escrito correctamente (es decir, no el número de caracteres). Si se produce un error, o la end-of-file es alcanzado, el valor de retorno es un corto número de elementos (o cero).

41voto

Peter Miehle Puntos 3753

La diferencia en fread(buf, 1000, 1, secuencia) y fread(buf, 1, 1000, stream), que en el primer caso se obtiene sólo una porción de 1000 bytes o nuthin, si el archivo es más pequeño y en el segundo caso, usted consigue todo en el archivo a menos que y hasta 1000 bytes.

15voto

Powerlord Puntos 43989

Se basa en la forma fread se implementa.

El Single UNIX Specification dice

Para cada objeto, tamaño de las llamadas será hecho a la fgetc() la función y la los resultados almacenados, en el orden de lectura, en un array de unsigned char exactamente la superposición de los objetos.

fgetc también tiene esta nota:

Desde fgetc() opera en bytes, la lectura de un signo compuesto de múltiples bytes (o "multi-byte carácter") puede requerir múltiples llamadas a fgetc().

Por supuesto, esto es anterior a la fantasía variable byte codificaciones de caracteres como UTF-8.

El SUS notas que en realidad ésta es tomada de la ISO C de documentos.

10voto

nos Puntos 102226

Esto es pura especulación, sin embargo en los días(Algunos todavía están alrededor) muchos sistemas de ficheros no eran simples flujos de bytes en un disco duro.

Muchos sistemas de archivos se registro en base, por lo tanto, para satisfacer dichos sistemas de ficheros de una forma eficaz, tendrá que especificar el número de elementos ("records"), lo que permite fwrite/fread para operar en el almacenamiento de registros, no sólo los flujos de bytes.

6voto

Michael Burr Puntos 181287

Aquí, voy a corregir aquellas funciones:

size_t fread_buf( void* ptr, size_t size, FILE* stream)
{
    return fread( ptr, 1, size, stream);
}


size_t fwrite_buf( void const* ptr, size_t size, FILE* stream)
{
    return fwrite( ptr, 1, size, stream);
}

Como una justificación para que los parámetros fread()/fwrite(), he perdido mi copia de K&R hace mucho tiempo, así que sólo puedo adivinar. Creo que una respuesta probable es que Kernighan y Ritchie puede simplemente han pensado que la realización de I/O binario sería más natural hecho en las matrices de objetos. También, podría haber pensado que el bloque de e/S sería más rápido/más fáciles de implementar o lo que sea en algunas arquitecturas.

Aunque el C estándar especifica que fread() y fwrite() implementarse en términos de " fgetc() and fputc()`, recuerda que la norma entró en existencia mucho después de C fue definido por K&R, y que las cosas especificado en la norma no podría haber estado en el original de los diseñadores de ideas. Incluso es posible que las cosas se dicen en K&R "El Lenguaje de Programación C" puede no ser la misma que cuando el lenguaje fue el primero en ser diseñado.

Finalmente, he aquí lo que p.j. Plauger, tiene que decir acerca de fread() en "El Estándar de C Library":

Si el size (segundo) argumento es mayor que uno, no se puede determinar si la función de lectura de hasta size - 1 adicional de los personajes más allá de lo que informa. Como regla general, es mejor llamar a la función como fread(buf, 1, size * n, stream); en lugar de fread(buf, size, n, stream);

Bascially, él está diciendo que fread()'s de la interfaz está roto. Para fwrite() señala que, "los errores de Escritura en general son raras, así que esto no es un defecto importante" - una declaración que no esté de acuerdo.

3voto

dolch Puntos 294

Probablemente se remonta a la forma en que archivo I/O fue implementado. (de vuelta en el día) podría haber sido más rápido para lectura / escritura a los archivos en bloques, a continuación, escribir todo a la vez.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X