奇怪的错误,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没有被执行到
大家说这会是什么原因呢?
...全文
292 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ncubrian 2014-03-21
  • 打赏
  • 举报
回复
楼主这个问题原因调查出来了吗,我只读一个文件,读到文件结尾就出这个错,其他程序也有这种读文件操作就不会出这个错,很是费解。
无着无依 2012-04-09
  • 打赏
  • 举报
回复
菜鸟不懂,不过看过这样一段话,不知道有没有帮助。
"如果一个服务器写一个已经被客户端关闭了的连接,那么第一次这样的写会正常返回,但是第二次写就会引起发送SIGPIPE信号,这个信号的默认行为就是终止这个进程。如果捕获或忽略SIGPIPE信号,那么第二次写操作会返回-1,并将errno设置为EPIPE。strerr 和 perror 函数将EPIPE错误报告为Broken pipe,这是一个迷惑了很多人的不太直观的信息" (不知道道理是否相通,呵呵)
cattycat 2012-04-07
  • 打赏
  • 举报
回复
可能一次打开文件太多,导致读取文件出错还是?
l13428940532 2012-04-07
  • 打赏
  • 举报
回复
你重新读第二个文件的时候,有没有把前面释放掉??
mathe 2012-04-07
  • 打赏
  • 举报
回复
每次只打开两个文件的,用完就关闭而且文件已经被打开,文件大小已经正确读出。
mathe 2012-04-06
  • 打赏
  • 举报
回复
我现在将程序改成只处理一个文件,然后用批处理程序处理就没有问题了。但是在一个进程里面循环处理多个文件就出错了
mathe 2012-04-06
  • 打赏
  • 举报
回复
每个文件都不是很大,也就是700K左右,不到1M.
fishion 2012-04-06
  • 打赏
  • 举报
回复
大文件,可以用内存映射。还有就是,内存的申请与释放得正确,打开与关闭文件也得对应
cattycat 2012-04-06
  • 打赏
  • 举报
回复
看不出来,难道你有写socket之类的吗。看网上找了下,有说文件读到EOF的可能。
另外,如果文件非常大的话,还是建议循环读取文件的好。
你if(len&1)len--; 这是啥意思啊。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧