fread_s
Odczytuje dane ze strumienia. Ta wersja programu ma ulepszenia zabezpieczeń fread
zgodnie z opisem w temacie Funkcje zabezpieczeń w narzędziu CRT.
Składnia
size_t fread_s(
void *buffer,
size_t bufferSize,
size_t elementSize,
size_t count,
FILE *stream
);
Parametry
buffer
Lokalizacja przechowywania danych.
bufferSize
Rozmiar buforu docelowego w bajtach.
elementSize
Rozmiar elementu do odczytu w bajtach.
count
Maksymalna liczba elementów do odczytania.
stream
Wskaźnik do FILE
struktury.
Wartość zwracana
fread_s
Zwraca liczbę (całych) elementów, które zostały odczytane do buforu, co może być mniejsze niż count
w przypadku wystąpienia błędu odczytu lub zakończenia pliku przed count
osiągnięciem. feof
Użyj funkcji orferror
, aby odróżnić błąd od warunku końca pliku. Jeśli size
wartość lub count
ma wartość 0, zwraca wartość 0, fread_s
a zawartość buforu pozostaje niezmieniona. Jeśli stream
lub buffer
jest wskaźnikiem o wartości null, fread_s
wywołuje nieprawidłową procedurę obsługi parametrów zgodnie z opisem w temacie Walidacja parametru. Jeśli wykonywanie jest dozwolone do kontynuowania, ta funkcja ustawia errno
wartość EINVAL
i zwraca wartość 0.
Aby uzyskać więcej informacji na temat kodów błędów, zobacz errno
, _doserrno
, _sys_errlist
i _sys_nerr
.
Uwagi
Funkcja fread_s
odczytuje maksymalnie count
elementy bajtów z danych wejściowych elementSize
stream
i przechowuje je w pliku buffer
. Wskaźnik pliku skojarzony z stream
(jeśli istnieje) jest zaawansowany przez liczbę odczytanych bajtów fread_s
. Jeśli dany strumień jest otwarty w trybie tekstowym, pary zestawienia powrotu karetki są zastępowane znakami jednowierszowego kanału informacyjnego. Zamiana nie ma wpływu na wskaźnik pliku ani wartość zwracaną. Pozycja wskaźnika pliku jest nieokreślona, jeśli wystąpi błąd. Nie można określić wartości częściowego elementu odczytu.
Ta funkcja blokuje inne wątki. Jeśli wymagana jest wersja nieblokowania, użyj polecenia _fread_nolock
.
Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.
Wymagania
Function | Wymagany nagłówek |
---|---|
fread_s |
<stdio.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
// 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