连续使用两次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_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 的倍数。

时间: 2024-11-05 22:30:12

连续使用两次fread 错误和fread返回值的相关文章

定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式。 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Compl

因标题框有限,题目未显示完整,以下再放一份: 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式. 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Complex C1,Complex C2) 求两个复数的差的方法:(参数

关于while(scanf_s(&quot;%d&quot;,&amp;x)!=0) 的逻辑错误 (scanf_s的 返回值)

背景:1.要求输入多组数据,然后输出什么东西,当第一个数输入的是0是,程序停止. 2.前几天学过 while(scanf_s("%d",&x)!=EOF) ctrl+z时停止 所以我想可以把EOF换成0,这样输 入0是就可以停止,但是事实证明我错了. 知识储备:scanf_s的返回值 : scanf("%d %d",&a,&b); 函数返回值为int型.如果a和b都被成功读入,那么scanf的返回值就是2: 如果只有a被成功读入,返回值为1:

LeetCode Recover Binary Search Tree——二查搜索树中两个节点错误

Two elements of a binary search tree (BST) are swapped by mistake.Recover the tree without changing its structure.Note:A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?二叉排序树中有两个节点被交换了,要求把树恢复成二叉排序树.最简单

我在学习编程中犯的两个最大错误

我在学习编程中犯的两个最大错误 投递人 itwriter 发布于 2012-09-10 09:24 评论(13) 有2616人阅读  原文链接  [收藏]  « » 英文原文:Suneel Chakravorty 一年前,我刚从大学毕业并且决定踏入社会.我想出了很多初始的想法并将他们实现,但我不懂编程. 听从 Yipit 联合创始人 Vin Vacant 的建议之后,我开始自学编程. 现在我终于学了足够多的知识来自己实现产品原型,一路走来,非常坎坷.如果你在跟我同样的路上,我希望你能避免犯跟我同

在服务器上处理请求时出现未知错误。服务器返回的状态码为500

操作方法: 为页面的ScriptManager控件添加EnablePartialRendering="false"的属性  此方法不是直接解决或规避问题的,是为了将详细的页面错误显示出来,以便找到需要修正 的地方,个人觉得这才是正道嘛,不能躲避错误,而应尽量不让错误发生. ---> 找出错误  -- > 修改. <asp:ScriptManager ID="ScriptManager" runat="server" Enable

SQL两表关联查询&批量修改字段值

SQL关联查询&修改字段,正确范例如下: --批量修改报告单位名称&更新时间 --tt和tp两表关联查询,将符合条件的tt表中的principal字段更新到tp表的ruperson字段 merge into nhis34.t_publicplaces tp using standard.t_organization tt on (tt.orgcode = tp.r_orgcode and tp.create_time > '2015-05-07 00:00:00') when mat

android开发中,两个按下手机实体返回键,两个Activity反复来回跳转的问题

android开发中,对于用intent实现跳转的Ativity,有时候按下手机的返回键时,两个Activity之间会多次相互跳转,始终退出不了程序的情况.这是由于从Activity  A跳转到Activity  B时,A被压入Activity栈中:当从B返回时,默认又重新创建了一个Activity A对象,这样一来就有了多个Activity A对象.所以造成了无法退出情况. 解决办法是:在AndroidManifest.xml文件中找到Activity A项,在其属性中加入  android:

基于返回值的错误处理与异常处理机制

基于返回的错误处理和异常处理机制的比较 一.基于返回值的错误处理机制 对于传统的面向过程语言比如说C语言,通常使用基于返回值的错误处理机制,即通过在程序中定义程序出错时的返回值,比如说0代表操作成功,而1代表操作失败. 这种错误处理机制的好处在于有时候即使出现了异常程序或许也可以继续执行(但是最终执行结果或许不对,而这就导致查错比较困难,因为有时候仅仅通过函数返回值我们并不知道程序出错的原因究竟是什么,比如说程序操作失败返回值为0,我们在控制台上看到程序输出为0,但是除此之外没有其他额外的信息帮

12_1求两个整数中的较小值,要求不能使用比较运算符, if-else, a&gt;b?a:b, while for

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4253932.html  声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:求两个整数中的较小值,要求不能使用比较运算符, if-else, a>b?a:b, while for, 内嵌汇编递归第三方函数. 在网上看到一些网友给出了