首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

HELP!程序无错可是不能打开文件,该怎么处理

2014-01-23 
HELP!!程序无错可是不能打开文件那位大侠帮帮忙啊!我有个程序读入很多的文件350个左右,要在这些文件中着值

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
}
}

热点排行