zoukankan      html  css  js  c++  java
  • fread读取大文件以及返回值问题(转载)

    今天fread文件读取遇到问题,本来很小的一个问题,但是一直没有注意到,导致花了不少时间调试,所以写下来备忘一下。

    size_t fread ( 
        void * ptr, 
        size_t size, 
        size_t count, 
        FILE * stream 
    );
    //Parameters
    /*
    ptr
    Pointer to a block of memory with a minimum size of (size*count) bytes.
    size
    Size in bytes of each element to be read.
    count
    Number of elements, each one with a size of size bytes.
    stream
    Pointer to a FILE object that specifies an input stream.
    */

    Return Value


    The total number of elements successfully read is returned as a size_t object, which is an integral data type.
    If this number differs from the count parameter, either an error occured or the End Of File was reached.
    You can use either ferror or feof to check whether an error happened or the End-of-File was reached.

    ---------------------
    先复制一段函数定义,这里首先要注意的是函数返回值的,函数返回的是读取的元素个数,注意,不一定是读取的字节数,当且仅当下面的代码时返回的才是读取的字节数

    fread(ptr, 1, count, fp);

    我今天用fread读文件时遇到的问题是读一个1M左右的文件,总是只读取到前面的一部分,比如

    numOfItem = fread(fontDotData, 1, allFontSize, fp);


    上面的代码读文件,allFontSize的值是3657728,返回值numOfItem却是10169

    理论上numOfItem应该和allFontSize相等的,问题出在哪里了呢?

    FILE *fp = fopen(fontFilename, "r");

    看出问题没

    错误原因:
    用文本方式打开了二进制文件
    文本方式读取二进制数据, 可能在文件结束之前将某段数据判定为文件末尾EOF, 所以结束读取( 举个例子, 比如遇到 0x00 0x00 0xff 0xff, 则文本方式方式的文件流, 认为已经到文件末尾, 不能读取)
    所以应该用二进制方式打开,不会读到一部分就中断了
    --------------------- 

    先看看下面的文件打开:
    ---------------------

    FILE *fp = fopen(fontFilename, "rb");

    转载:

      https://blog.csdn.net/sunshineyy85/article/details/7901356

  • 相关阅读:
    #2020征文TV#【鸿蒙基地】鸿蒙从窗口开始:Page Ability诞生记
    设计器打开某表单时提示:[某某表单]已经由用户[xxx]打开需解锁
    有效性设置解疑
    表单打开时显示空白页面解决办法
    工作流_知会设置
    单元格中既有公式又可以录入数据,怎么实现?
    更改系统时间
    下拉框改变后,如何清空后面几个单元格的值?
    如何调整人员的部门?
    如何修改iis访问端口
  • 原文地址:https://www.cnblogs.com/bwbfight/p/9903216.html
Copyright © 2011-2022 走看看