fread

fread

从给定输入流stream读取最多count个对象到数组buffer中(相当于以对每个对象调用count次fgetc),把buffer当作unsigned char数组并顺序保存结果。流的文件位置指示器前进读取的字节数。
若出现错误,则流的文件位置指示器的位置不确定。若没有完整地读入最后一个元素,则其值不确定。
定义于头文件<stdio.h>
size_t freadvoid *buffer, size_t size, size_t count, FILE *stream );//C99前
size_t freadvoid *restrict buffer, size_t size, size_t count, FILE *restrict stream );//C99起
 
//size_t是在基于无符号整数memsize类型的C / C + +的标准库中定义的。C语言中,此类型位于头文件stddef.h中,而在C++中,则位于cstddef中。
//经测试发现,在32位系统中size_t是4字节的,而在64位系统中,size_t是8字节的,这样利用该类型可以增强程序的可移植性。

参数

buffer 指向要读取的数组中首个对象的指针
size 每个对象的大小(单位是字节)
count 要读取的对象个数
stream 输入流

返回值

返回成功读取的对象个数,若出现错误或到达文件末尾,则可能小于count。
若size或count为零,则fread返回零且不进行其他动作。
fread不区分文件尾和错误,因此调用者必须用ferror才能判断发生了什么。
示例代码:
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    FILE *stream;
 
    char msg[]="this is a test";
 
    char buf[20];
 
    if((stream=fopen("DUMMY.FIL","w+"))==NULL)
    {
        fprintf(stderr,"Can not open output file. ");
        return 0;
    }
 
 
    /*write some data to the file*/
    fwrite(msg,1,strlen(msg)+1,stream);
 
    /*sizeof(char)=1 seek to the beginning of the file*/
    fseek(stream,0,SEEK_SET);
 
    /*read the data and display it*/
    fread(buf,1,strlen(msg)+1,stream);
 
    printf("%s ",buf);
 
    fclose(stream);
 
    return 0;
 
}
 
/*
int fseek(FILE *stream, long offset, int fromwhere);函数设置文件指针stream的位置。
如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败(比如offset取值大于等于2*1024*1024*1024,即long的正数范围2G),则不改变stream指向的位置,返回一个非0值。
函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere(偏移起始位置:文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准,偏移offset(指针偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
fseek函数和lseek函数类似,但lseek返回的是一个off_t数值,而fseek返回的是一个整型。
 
*/