首页 > 代码库 > 连续使用两次fread 错误和fread返回值
连续使用两次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\n", name); 7 return ; 8 } 9 // LOGI("file open OK:%s",name);10 #if USE_OCL11 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_NEON21 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 *buffer, size_t size, size_t count, FILE *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 的倍数。
连续使用两次fread 错误和fread返回值
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。