奇怪的错误,fread报告Pipe Broken
mathe 2012-04-06 11:26:25 Windows下,打开普通磁盘文件,代码如下:
void gentarget(const char *fname, const char *tname)
{
char mysig[10];
int ret=0;
int rc=0;
FILE *f=fopen(fname,"rb");
if(f==NULL)return;
FILE *t=fopen(tname,"wb");
if(t==NULL){
fprintf(stderr,"Cannot write to file %s\n",tname);
fclose(f);
return;
}
int len=filelength(fileno(f));
if(mem!=NULL&&len<memsize){
delete []mem;
mem=NULL;
}
if(mem==NULL){
memsize=len;
mem = new short[len/2];
}
if(mem==NULL){
fprintf(stderr,"Out of mem\n");
}
if(len&1)len--;
if((rc=fread(mem,1,len,f))!=len){
ret=-1;
goto end;
}
...
...
end:
if(ret==-1){
int c=ferror(f);
fprintf(stderr,"%s\n",strerror(c));
}
fclose(t);
fclose(f);
}
这个函数会被调用多次,来反复处理多个文件的数据,奇怪的是上面的fread对部分文件成功,但是对于部分文件失败,失败时,strerror返回结果是"Pipe Broken".而且改变处理文件的顺序,失败的文件也将会发生变化,所以同具体文件没有关系。
并且,我这里的文件中第一个正好是最大的文件,所以实际上内存也不会重新分配,也就是delete []mem没有被执行到
大家说这会是什么原因呢?