• 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;
       }
    }
  • 相关阅读:
    application/json 四种常见的 POST 提交数据方式
    物联网应用中实时定位与轨迹回放的解决方案 – Redis的典型运用(转载)
    C#的四种Timer介绍
    用python绘制趋势图
    Python 图形界面元素
    python 异常和弹出框
    python爬虫
    python文件操作
    GUI输入数据并保存
    图形界面+声音播放
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/8371743.html
Copyright © 2020-2023  润新知