fread_s
Lee datos desde una secuencia. Esta versión de fread
tiene mejoras de seguridad, como se describe en las Características de seguridad de CRT.
Sintaxis
size_t fread_s(
void *buffer,
size_t bufferSize,
size_t elementSize,
size_t count,
FILE *stream
);
Parámetros
buffer
Ubicación de almacenamiento de los datos.
bufferSize
Tamaño del búfer de destino en bytes.
elementSize
Tamaño del elemento que se va a leer en bytes.
count
Número máximo de elementos que se va a leer.
stream
Puntero a la estructura FILE
.
Valor devuelto
fread_s
devuelve el número de elementos (completos) que se han leído en el búfer, que puede ser menor que count
si se encuentra un error de lectura o el final del archivo antes de llegar a count
. Use la función feof
o ferror
para distinguir una condición de error de una condición de final de archivo. Si size
o count
es 0, fread_s
devuelve 0 y el contenido del búfer queda sin cambios. Si stream
o buffer
es un puntero nulo, fread_s
invoca el controlador de parámetros no válidos, como se describe en Validación de parámetros. Si la ejecución puede continuar, esta función establece errno
en EINVAL
y devuelve 0.
Para obtener más información sobre los códigos de error, vea errno
, _doserrno
, _sys_errlist
y _sys_nerr
.
Comentarios
La función fread_s
lee hasta count
elementos de elementSize
bytes en la entrada stream
y los almacena en buffer
. El puntero de archivo asociado a stream
(si hay uno) está avanzado por el número de bytes leídos fread_s
. Si la secuencia especificada se abre en modo de texto, los pares de caracteres de retorno de carro-avance de línea se reemplazarán por caracteres individuales de avance de línea. Este reemplazo no tiene ningún efecto en el puntero de archivo ni en el valor devuelto. Si se produce un error, la posición del puntero de archivo es indeterminada. No se puede determinar el valor de un elemento de lectura parcial.
Esta función bloquea otros subprocesos. Si necesita una versión que no sea de bloqueo, use _fread_nolock
.
De manera predeterminada, el estado global de esta función está limitado a la aplicación. Para cambiar este comportamiento, consulte Estado global en CRT.
Requisitos
Función | Encabezado necesario |
---|---|
fread_s |
<stdio.h> |
Para obtener más información sobre compatibilidad, consulte Compatibilidad.
Ejemplo
// crt_fread_s.c
// Command line: cl /EHsc /nologo /W4 crt_fread_s.c
//
// This program opens a file that's named FREAD.OUT and
// writes characters to the file. It then tries to open
// FREAD.OUT and read in characters by using fread_s. If the attempt succeeds,
// the program displays the number of actual items read.
#include <stdio.h>
#define BUFFERSIZE 30
#define DATASIZE 22
#define ELEMENTCOUNT 2
#define ELEMENTSIZE (DATASIZE/ELEMENTCOUNT)
#define FILENAME "FREAD.OUT"
int main( void )
{
FILE *stream;
char list[30];
int i, numread, numwritten;
for ( i = 0; i < DATASIZE; i++ )
list[i] = (char)('z' - i);
list[DATASIZE] = '\0'; // terminal null so we can print it
// Open file in text mode:
if( fopen_s( &stream, FILENAME, "w+t" ) == 0 )
{
// Write DATASIZE characters to stream
printf( "Contents of buffer before write/read:\n\t%s\n\n", list );
numwritten = fwrite( list, sizeof( char ), DATASIZE, stream );
printf( "Wrote %d items\n\n", numwritten );
fclose( stream );
} else {
printf( "Problem opening the file\n" );
return -1;
}
if( fopen_s( &stream, FILENAME, "r+t" ) == 0 ) {
// Attempt to read in characters in 2 blocks of 11
numread = fread_s( list, BUFFERSIZE, ELEMENTSIZE, ELEMENTCOUNT, stream );
printf( "Number of %d-byte elements read = %d\n\n", ELEMENTSIZE, numread );
printf( "Contents of buffer after write/read:\n\t%s\n", list );
fclose( stream );
} else {
printf( "File could not be opened\n" );
return -1;
}
}
Contents of buffer before write/read:
zyxwvutsrqponmlkjihgfe
Wrote 22 items
Number of 11-byte elements read = 2
Contents of buffer after write/read:
zyxwvutsrqponmlkjihgfe