• 连续使用两次fread 错误和fread返回值


    今天在写一个代码,要把一帧的buffer读入到文件,因为有NEON和OpenCL两种不同的实现所以需要读取文件两次,代码如下:

     1   FILE *file;
     2   int i = 0;
     3   INTER_BLOCK_SIZE_GPU_RS *block_size;
     4   file = fopen(name, "rb");
     5   if (file == NULL) {
     6     LOGE("Can't open file: %s
    ", name);
     7     return ;
     8   }
     9 //    LOGI("file open OK:%s",name);
    10     #if USE_OCL
    11      LOGI("read pool buffer");
    12          int readCount=0;
    13       for(i=0;i<50;++i){
    14        readCount=fread(rs_obj.buffer_pool_map_ptr, rs_obj.buffer_pool_size,1,  file);
    15          LOGI("OCL read buffer pool count==%d",readCount);
    16           if(readCount == 1)
    17                   break;
    18       }
    19 
    20     #if USE_NEON
    21       for(i=0;i<50;++i){
    22                readCount=fread(rs_obj.pool, rs_obj.buffer_pool_size,1,  file);
    23               LOGI("NEON read[%d] buffer pool count==%d",i,readCount);    
    24 
    25                 if(readCount == 1)
    26                   break;
    27               
    28          }
    29       LOGI("  ");
    30       #endif

    发现前面读取文件成功,后面连续50次读取文件失败。久久不知道为什么?

    后来发现C语言的文件读取的指针FILE * file,通过编译这个指针读取文件的内容,当读完一个文本的时候,file 指很已经到啦文件的尾部,而C语言输出输入指针确实是共用的。

    所以当你第二次使用的fread的时候一直返回0,只需要在第二次执行fread之前加上代码:

     fseek(file, 0, SEEK_SET);即可。问题解决

    另外解释一下size_t fread ( void *buffersize_t sizesize_t countFILE *stream) ;  

    返回指是实际读取的count 数,这个数是指 多少个size 。比如:

    一个文件有四个 char 的字符:1,2,3,4

    count = fread(rs_obj.buffer_pool_map_ptr, 1,sizeof(int),  file);   会返回4,

    count =fread(rs_obj.buffer_pool_map_ptr, sizeof(int), 1,  file);   会返回1

    所以说实际读取的是size 的倍数。

  • 相关阅读:
    天行健宇宙的生与死
    知识库:maven打包时跳过测试
    oracle 行列转换
    C#格式化字符串
    存储过程的使用
    正则表达式
    怎么防止[SQL注入]
    11个月了.
    开通博客喽,
    别的程序员是怎么读你的简历的
  • 原文地址:https://www.cnblogs.com/biglucky/p/3929485.html
Copyright © 2020-2023  润新知