BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #32437同步于 2009/11/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

读取文件的时候没读取完整,得到部分结果的情况下怎么办啊

Elaine99
2009/11/30镜像同步5 回复
文件是一个有两百多帧的视频流,读取大小是一帧内容,读取到数组以后对其进行各种运算,输出一帧的结果,但是输出结果只有一百多帧。。。我把代码贴上来吧,不知道有木有好心人耐心看看~ 最后会输出程序中的“comput over”,但是还有一个segmentation fault~我搜了下,这个是因为指针的问题造成的,我看了半天也没有发现哪里的指针有问题啊,是不是访问了非法内存啊~ 写的很粗糙,小细节方面就不要喷了哈,多谢多谢! #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int main(int n, char *cl[]) { FILE *f1, *f2; int i,j,k,l, N = 0, x,y,yuv,inc,Y, F; int sum=0,temp=0; double sumtemp,sportlevel=0.0,meanlevel; unsigned char *b1, *b2; if (n != 6 && n != 5) { puts("psnr x y <YUV format> <src.yuv> <dst.yuv> [multiplex]"); puts(" x\t\tframe width"); puts(" y\t\tframe height"); puts(" YUV format\t420, 422, etc."); puts(" src.yuv\tsource video"); puts(" dst.yuv\tdistorted video"); puts(" [multiplex]\toptional"); return EXIT_FAILURE; } if ((f1 = fopen(cl[4],"rb")) == 0) goto A; if (!(x = strtoul(cl[1], 0, 10)) || !(y = strtoul(cl[2], 0, 10))) goto C; if ((yuv = strtoul(cl[3], 0, 10)) > 444) goto D; if (cl[6] && !strcmp(cl[5], "multiplex")) inc = 2; Y = x * y; switch (yuv) { case 400: F = Y; break; case 422: F = Y * 2; break; case 444: F = Y * 3; break; default : case 420: F = Y * 3 / 2; break; } if (!(b1 = malloc(F))) goto E; if (!(b2 = malloc(F))) goto E; fread(b2,F,1,f1); for (;;) { if (1 != fread(b1, F, 1, f1) || 1 != fread(b2, F, 1, f1)) break; for(l=0;l<36;l++) for(k=0;k<44;k++) { { for(j=0;j<8;j++) for(i=8*(352*l+k)+352*j;i<8*(352*l+k)+8+352*j;i++) {if(i>Y) printf("out of the range!!\n"); //printf("i %d\n",i); temp=b2[i]-b1[i]; if(temp<0) temp=(-1)*temp; sum+=temp;} } sumtemp=sum; sum=0; sportlevel+=exp(sumtemp/4080); //printf("k %d\n",k); }//一帧检测结束 printf("i %d\n",i); meanlevel=sportlevel/1584; sportlevel=0; printf("meanlevel\t%f\n",meanlevel); // printf("frame %d\n",N++); if(feof(f1)) {printf("the end of the file\n");break;} } printf("comput is over\n"); free(b1);free(b2); fclose(f1); fclose(f2); return 0; A: fprintf(stderr, " Error opening sourcefile.\n"); goto X; C: fprintf(stderr, " Invalid width or height.\n"); goto X; D: fprintf(stderr, " Invalid YUV format.\n"); goto X; E: fprintf(stderr, " Not enough memory.\n"); X: return EXIT_FAILURE; }
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
Yamauchi机器人#1 · 2009/11/30
segmentation fault 基本都是传入C标准库的参数是空指针造成的 fclose(f2); f2是空指针
Elaine99机器人#2 · 2009/11/30
确实啊,把那个注释了以后就好了,嘿嘿,因为是用之前的一个文件改的,没注意这个,真好啊~! 可是还是存在输出不全~还是只有一百多帧
Randy机器人#3 · 2009/11/30
fread(b2,F,1,f1); for (;;) { if (1 != fread(b1, F, 1, f1) || 1 != fread(b2, F, 1, f1)) break; ......... } 【 在 Elaine99 的大作中提到: 】 : 文件是一个有两百多帧的视频流,读取大小是一帧内容,读取到数组以后对其进行各种运算,输出一帧的结果,但是输出结果只有一百多帧。。。我把代码贴上来吧,不知道有木有好心人耐心看看~ : 最后会输出程序中的“comput over”,但是还有一个segmentation fault~我搜了下,这个是因为指针的问题造成的,我看了半天也没有发现哪里的指针有问题啊,是不是访问了非法内存啊~ : 写的很粗糙,小细节方面就不要喷了哈,多谢多谢! : ...................
Elaine99机器人#4 · 2009/11/30
这个是因为b2要定位到后一帧,b1是前一帧,所以干脆就让b2先读取一帧~不知道我这么想的,程序是不是也这么想的[em17] 【 在 Randy 的大作中提到: 】 : fread(b2,F,1,f1); : for (;;) { : if (1 != fread(b1, F, 1, f1) || 1 != fread(b2, F, 1, f1)) break; : ...................
Elaine99机器人#5 · 2009/12/1
问题解决了,我把参数扩大了一个,就是设了两个文件指针,分别指向了内容相同但是名字不同的实质上是一个文件的两个文件,然后就所有帧都出来了 难道两个文件指针不能指向同一个文件但是地方不同吗?会引起混乱?改了之后运算结果也不同了。觉得把文件复制一遍改个名字这种方法好傻