HELP!!程序无错可是不能打开文件
那位大侠帮帮忙啊!
我有个程序读入很多的文件350个左右,要在这些文件中着值相近的文件。
我用了两个循环,大循环依次读入文件k,读一个关一个的,然后判断该文件是不是以前读过了,小循环再打开一个不同于前面的文件j,判断该文件是否已经用过了,如果不是就读入该文件的内容,关掉该文件。然后对比文件k与文件j读出的值是否相近。以此寻找所有与文件k内容相近的文件。
编辑无错,也可以运行,但是只能打开前24个文件,后面的文件就说不能打开文件,实际上文件都存在。
但是如果我将判断文件k是否用过和文件j是否用过都注释掉就没有问题,所有文件能读了。
用peak这个数组纪录每个k循环中的文件对应的所有的值相近的j循环的文件。如果我将该数组的值全部固定为0时程序也没有问题,所有文件能读。
下面是我用来判断文件是否已经用过了。所有在j循环中文件内容与k循环的文件内容值相近的都不再用到k循环中。
for(int ii=0;ii<NF;ii++)
{
for(int s=0;s<DEG;s++)
{
int tmp=peak[ii][s];
if(kf==tmp)
{
cout<<"skip kf= "<<tmp<<"###############"<<endl;
flag=1;
break;
}
}
if(flag==1)break;
}
不知道我说清楚没啊。程序有些长,不知道需不需要贴啊。
哪位帮我看看吧,我自己琢磨了好久都没有结果啊。不知道怎么回事。 如果需要我可以把程序全部贴上。
谢谢!!!!!
~
~
[解决办法]
[code]
if((fin_k=fopen(global.preassgname[kf],"r")) == NULL )//open the file for possi assign
{
cout<<"can not open file for k"<<"fin_k="<<fin_k<<" preassgname="<<global.preassgname[kf]<<endl;
continue;
}
for(int ii=0;ii<NF;ii++)
{
for(int s=0;s<DEG;s++)
{
int tmp=global.peak[ii][s];
if(kf==tmp)
{
cout<<"skip kf= "<<tmp<<"###############"<<endl;
flag=1;
break;
}
}
if(flag==1)break;
}
if(flag==1)continue;
[/code]
这里有问题, continue之前应该关闭前面打开的文件,这样导致那个文件句柄在关闭之前又被赋了新的值,而旧的文件句柄永久丢失,其对应的文件处于打开状态,下一次再打开就会失败。后面还有没有别的错误还不知道。
[解决办法]
手都改软。没有改变业务逻辑,起码我没有有意要改变,除了上贴说明的文件指针关闭动作被跳过的问题。也学会授权分权,不要一把抓太多,分而治之,不管是面向对象编程还是结构化编程都需要这样。
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <cstddef>
#include <string>
#include <cstring>
using namespace std;
const int buff_size=600; //length for one record in input file
const int NF=352;
const int DEG=10;//degeneration for one record in input file
const int LEN=30; //length for file name
const float Ref_c=213.8450108f;
const float Ref_n=86.1806244f;
const float Er_ca=0.33f;
const float Er_n=0.4f;
const float Er_cx=0.15f;
const int Num_check=24;
struct Worker
{
float fq_ca[NF], fq_n[NF], fq_cx[NF];
int peak[NF][DEG];
char preassgname[NF][LEN];
char csname[NF][LEN];
char res_tp[DEG][DEG],atom[DEG][DEG];
char struc[DEG][DEG];
int nline;
void Init();
bool HasPeak(int file_index)const;
// please find the right name for the function
bool Process1(int kf, char str_k[]);
void Process2(int kf, char str_k[]);
}worker;
int main(void)
{
char str_k[DEG];
worker.Init();
for(int kf=0;kf<NF;kf++)
{
cout<<"kf===="<<kf<<endl;
if(worker.HasPeak(kf) && worker.Process1(kf, str_k))
worker.Process2(kf, str_k);
}
}
void Worker::Init()
{
char buff[buff_size];
FILE *fp;
for(int k=0;k<NF;k++)
{
sprintf(preassgname[k],"pre_inputa_%d.dat",k);
sprintf(csname[k],"cs_%d.dat",k);
fq_ca[k]=0;
fq_n[k]=0;
fq_cx[k]=0;
for(int i=0;i<DEG;i++)
{
peak[k][i]=-1;
}
FILE *fcs;
if((fcs=fopen(worker.csname[k],"r")) == NULL )
{
continue;
}
int mm;
fgets(buff,buff_size,fp);
sscanf(worker.csname[k],"%*3s%d%*4s",&mm); //extract the numerical number 文件序号统一
sscanf(buff,"%f %f %f",&worker.fq_ca[mm],&worker.fq_n[mm],&worker.fq_cx[mm]);//get the chemical shift
fclose(fp);
}
}
// return true if
// one of peak[file_index][0] to peak[file_index[DEG-1] is equal to kf
//
bool Worker::HasPeak(int kf)const
{
for(int ii=0;ii<NF;ii++)
{
for(int s=0;s<DEG;s++)
{
if(kf==peak[ii][s])
{
cout<<"skip kf= "<<kf<<"###############"<<endl;
return true;
}
}
}
return false;
}
// return false if the kf'th file cannot be open
//
bool Worker::Process1(int kf, char str_k[])
{
FILE * fp;
int nrow=0, mm;
char buff[buff_size];
float tmp_ca, tmp_n, tmp_cx, file_flag;
if((fp=fopen(worker.preassgname[kf],"r")) == NULL )//open the file for possi assign
{
// you know fp is NULL, what's the point the output a NULL(fin_k) in your original program
cout<<"can not open file for k "<<kf<<" preassgname="<<worker.preassgname[kf]<<endl;
return false;
}
while((fgets(buff,buff_size,fp)!=NULL))
{
nrow++;
switch(nrow){
case 1:
sscanf(buff,"%d",&nline);//the line number should be nline+1
break;
case 2:
sscanf(buff,"%*s %*s %f %f %f",&tmp_ca,&tmp_n,&tmp_cx);
file_flag=(worker.fq_ca[kf]-tmp_ca)*(worker.fq_n[kf]-tmp_n)*(worker.fq_cx[kf]-tmp_cx);
if(fabs(file_flag)>0.001)
{
cout<<"chemical shift file "<<csname[kf]<<" doesn't agree with the possible assignment file"
<<worker.preassgname[kf]<<endl;
exit(-1);
}
break;
case 3:
mm=nrow-4;
sscanf(buff,"%s %s %s %*s %*s %*s %*d",res_tp[mm],struc[mm],atom[mm]);
}
}//end while
fclose(fp);
strcpy(str_k,atom[0]);
return true;
}
void Worker::Process2(int kf, char str_k[])
{
FILE *fp;
int nline2, ndis;
char buff[buff_size];
char com_res_tp[DEG][DEG],com_atom[DEG][DEG],com_struc[DEG][DEG];
char *at1_2,*at2_2,*at3_2;
for(int mr=0; mr<=(nline-3); mr++)
{
char *at1,*at2,*at3;
int id_atom=strcmp(worker.atom[mr],str_k);
if(id_atom!=0)continue;
at1=strtok(worker.atom[mr],"-");
at2=strtok(NULL,"-");
at3=strtok(NULL,"-");
for(int jf=(kf+1);jf<NF;jf++)
{
int flag_j=0;
int id2_ca;
int nrow2=0;
float tmp_ca2=0;
float tmp_n2=0;
float tmp_cx2=0;
if((fp=fopen(worker.preassgname[jf],"r")) == NULL )
{
continue;
}
for(int ik=0;ik<NF;ik++)
{
for(int ss=0;ss<DEG;ss++)
{
int tmpp=worker.peak[ik][ss];
if(jf==tmpp)
{
flag_j=1;
break;
}
}
if(flag_j==1)break;
}
if(flag_j==1)continue;
while((fgets(buff,buff_size,fp)!=NULL))
{
nrow2++;
if(nrow2==1)sscanf(buff,"%d",&nline2);
if(nrow2==2)
{
sscanf(buff,"%*s %*s %f %f %f",&tmp_ca2,&tmp_n2,&tmp_cx2);
float file_flag2=(worker.fq_ca[jf]-tmp_ca2)*(worker.fq_n[jf]-tmp_n2)*(worker.fq_cx[jf]-tmp_cx2);
if(fabs(file_flag2)>0.001)
{
cout<<"chemical shift file "<<worker.csname[jf]<<" doesn't agree with the possible assignment file\
"<<worker.preassgname[jf]<<endl;
exit(-1);
}
}
if(nrow2>3)
{
int mm=nrow2-4;
sscanf(buff,"%s %s %s %*s %*s %*s %*d",com_res_tp[mm],com_struc[mm],com_atom[mm]);
}
}//end while
fclose(fp);
if((fabs(worker.fq_ca[kf]-worker.fq_ca[jf])<Er_ca)&&(fabs(worker.fq_n[kf]-worker.fq_n[jf])<Er_n))
{
for(int nr=0;nr<=(nline2-3);nr++)
{
at1_2=strtok(com_atom[nr],"-");
at2_2=strtok(NULL,"-");
at3_2=strtok(NULL,"-");
id2_ca=strcmp(at3_2,"CA");
int dif_atom=strcmp(at3_2,at3);
int dif_res=strcmp(com_res_tp[nr],worker.res_tp[mr]);
if(id2_ca!=0)
{
if((dif_atom!=0)&&(dif_res==0))
{
worker.peak[kf][ndis]=jf;
ndis++;
cout<<"jf="<<jf<<" different cx shows up !!!!!!!!!!!!!!!!!!!!!"<<endl;
break;
}
if((dif_atom==0)&&(dif_res==0)&&(fabs(worker.fq_cx[kf]-worker.fq_cx[jf])<Er_cx))
{
cout<<"same worker.peak shows up at jf= "<<jf<<" kf="<<kf<<" !!!!!!!!!!!!!!!!!!!!!!!"<<endl;
break;
}//end if
}//end if id2
else
{
if((dif_atom!=0)&&(dif_res==0))
{
cout<<"same worker.peak CANCA shows up at jf= "<<jf<<" kf="<<kf<<" !!!!!!!!!!!!!!!!!!!!!!!"<<endl;
break;
}//end if
}//end else
}
}//end if
}//end j loop
}
}