zoukankan      html  css  js  c++  java
  • fread与fread_s读取文件(二进制文件)

    fread()是c库函数,利于移植,使用缓存,效率较read()高。

    原型:

    size_t  fread(void *buffer, size_t size, size_t count, FILE * stream);

    要注意的是它的返回值,如果读取到了文件尾,返回值小于count,可以使用feof()函数检测出来,返回真。

    PS:返回值代表的是某种类型的size的个数。

    下面程序按照1024k(一次大小为sizeof(char))一次读取二进制文件。

    include <stdio.h>
    #include <string.h>
    
    
    #define BUFFSIZE 1024
    
    int main(int argc, char **argv){
    
        char buff[BUFFSIZE];
        FILE *fd = fopen (argv[1], "rb");
        int count, errno=0;
    
        bzero (buff, BUFFSIZE);
        while (!feof (fd)){
            count = fread (buff, sizeof (char), BUFFSIZE, fd);
            int n = feof (fd);
            printf ("%d,%d
    ", count, n);
            printf ("%s
    ",strerror (errno));
        }
        return 0;
    }

    fread_s读取流的数据。 fread 此版本的具有安全增强功能,如 CRT中的安全功能所述。

    size_t fread_s( 
       void *buffer,
       size_t bufferSize,
       size_t elementSize,
       size_t count,
       FILE *stream 
    );
    buffer

    数据的存储位置。

    bufferSize

    目标缓冲区的大小(以字节为单位)。

    elementSize

    写入字节的项的大小。

    count

    要读取的项目最大数。

    stream

    为 FILE 结构的指针。

    fread_s 返回读取到缓冲区,比 count 会比(全部)的项数,如果读取错误或文件结尾遇到,在 count 达到之前。 使用 feof 或 ferror 功能与一个文件关闭条件区分错误。 如果 size 或 count 为0,fread_s 返回0,并且缓冲区内容保持不变。 如果 stream 或 buffer 是null指针,fread_s 调用无效参数处理程序,如 参数验证所述。 如果执行允许继续,此功能设置 errno 到 EINVAL 并返回0。

    有关错误代码的更多信息,请参见 _doserrno、errno、_sys_errlist和_sys_nerr

    备注
     
    fread_s 函数在 buffer读取到 elementSize 字节 count 项从输入 stream 并存储它们。 与 stream 的文件指针(如果有)的字节数增加实际读取的。 如果给定流在文本模式中打开,支持返回换行符对用单个换行符替换。 替换对文件指针或返回值的效果。 ,如果发生错误,文件指针位置是不确定的。 一个部分读取的项的值无法确定的。

    此功能锁定其他线程。 如果需要非固定版本,请使用 _fread_nolock。

    功能

    必需的标头

    fread_s

    <stdio.h>

    示例

    // 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] = ''; // 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:
    	%s
    
    ", list );
          numwritten = fwrite( list, sizeof( char ), DATASIZE, stream );
          printf( "Wrote %d items
    
    ", numwritten );
          fclose( stream );
       } else {
          printf( "Problem opening the file
    " );
          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
    
    ", ELEMENTSIZE, numread );
          printf( "Contents of buffer after write/read:
    	%s
    ", list );
          fclose( stream );
       } else {
          printf( "File could not be opened
    " );
          return -1;
       }
    }
  • 相关阅读:
    linux权限补充:rwt rwT rws rwS 特殊权限
    关于Linux操作系统下文件特殊权限的解释
    Java学习笔记——Java程序运行超时后退出或进行其他操作的实现
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 复数四则运算
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/8371743.html
Copyright © 2011-2022 走看看