一个很古怪的问题,我把源程序贴出来,大家瞧瞧。。。。

时间:2021-08-11 19:34:54
程序我是用gcc编译的,运行时出现的问题是:compare_file()函数调用一次时候,可以给出正确的结果,当循环调用第二次的时候就会报错,我觉得这个有点怪,因为所有的文件的数据格式都是我用程序处理的,格式都一样。
#include"mmapfile.c"
#define trace 0
static inline char * getNameIndex (char **cp, char sentinel) {
  char *c = *cp;
  int k=0;
  while (*c <= sentinel) ++c;
  char *s = c;
  while (*c > sentinel) {++c;k++;}
  *cp = c;
  return strndup (s,(size_t)k);
}

int compare_file(char *file1,char *file2){
int num=0;
FILE *fp_source,*fp_result;
char *file1_start,*file1_end;
char *file2_start,*file2_end,*file2_first;
//str1 and str2 come from the file1,str3 and str4 are from file2
char *str1,*str2,*str3,*str4,*fname;
struct stat st;
struct stat st2;
int line1=0;
int line2=0;

  file1_start = mmapFile (fp_source = openFile (file1), &st);
  file1_end = file1_start + st.st_size;
  
  file2_start=file2_first= mmapFile (fp_result = openFile (file2), &st2);
  file2_end = file2_first + st2.st_size;

  while(file1_start<file1_end){
   str1=getNameIndex(&file1_start,'-');
   str2=getNameIndex(&file1_start,'-');
   line1++;
   line2=0;
   if(trace){fprintf(stderr,"%s,%s,\n",str1,str2);}
   file2_start=file2_first;
   while(file2_start<file2_end){
   str3=getNameIndex(&file2_start,'-');
   str4=getNameIndex(&file2_start,'-');
   line2++;  
   ///compare two pairs of interaction
   if(strcmp(str1,str3)==0){
   if(strcmp(str2,str4)==0){
   num++;
   fprintf(stderr,"1:str1=%s,str2=%s,line1=%d ",str1,str2,line1);
   fprintf(stderr,"str3=%s,str4=%s,line2=%d\n",str3,str4,line2);
   break;
   }
   if(trace){fprintf(stderr,"here 42\n");}
   }
   else{
   if(strcmp(str1,str4)==0){
   if(strcmp(str2,str3)==0){
   num++;
   fprintf(stderr,"1:str1=%s,str2=%s,line1=%d ",str1,str2,line1);
   fprintf(stderr,"str3=%s,str4=%s,line2=%d\n",str3,str4,line2);
   break;
   }
   }
   }       
   }  
   }
  fclose(fp_result);
  fclose(fp_source);   
  
return num;
}

int main(){
char file1[]="pos_interaction.txt";//"922.txt";
char file2[]="765.txt";
int number=0;
int i=0;
char *fname[28]={"neg_1.txt","neg_2.txt","neg_3.txt","neg_4.txt","neg_5.txt","neg_6.txt","neg_7.txt","neg_8.txt","neg_9.txt","neg_10.txt","neg_11.txt","neg_12.txt","neg_13.txt","neg_14.txt","neg_15.txt","neg_16.txt","neg_17.txt","neg_18.txt","neg_19.txt","neg_20.txt","neg_21.txt","neg_22.txt","neg_23.txt","neg_24.txt","neg_25.txt","neg_26.txt","neg_27.txt","neg_28.txt"};
for(i=0;i<28;i++){
number+=compare_file(fname[i],file2);
fprintf(stderr,"\nthe %d result is %d .\n",i,number);break;
}

return ;
}

13 个解决方案

#1


再说明一下
getNameIndex ()函数是获取一个字符串
文件中的数据格式如下:
YGR204W YIR038C
YGR204W YJL034W
YGR204W YJL041W
YGR204W YJL053W
YGR204W YJL079C
YGR204W YJL132W
。。。。
本程序是用来比较两个文件中的每一行是否相同,让后给出相同的数目
还希望各位能给点意见

#2


。。。。。。。
没人顶?

#3


太长  慢慢看

#4


先拜谢,^_^

#5


水平低 看不出来

#6


根本无法编译怎么找错误阿!!!

#7


^_^,不好意思,忘了,还有一个文件”mmapfile.c“
下面是这个文件的代码:

#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>

FILE *openFile ( char *fname) {
  FILE *f;
  if ((f = fopen (fname, "r+")) == NULL) perror (fname), exit (1);
  return f;
}

char *mmapFile (FILE *f, struct stat *stp) {
  fstat (fileno (f), stp);
  char *c = (char *)
    mmap ((void *) 0, stp->st_size, PROT_READ|PROT_WRITE, MAP_SHARED,
  fileno (f), 0);
  if (c == MAP_FAILED) perror ("mmap"), exit (1);
#ifdef MADV_SEQUENTIAL
  madvise ((void *) c, stp->st_size, MADV_SEQUENTIAL);
#endif
  return c;
}

#8


这是c++程序吧?正在看!

#9


能不能给一组数据试一试???

#10


数据格式我已经给出来了,用于比较的两个文件都是.txt的
格式如下:
YGR204W YIR038C
YGR204W YJL034W
YGR204W YJL041W
YGR204W YJL053W
YGR204W YJL079C
YGR204W YJL132W
其中一个文件是1000行,另外一个是2700000行
第二文件如果是100000行的话一般不会出错
大于才会的

#11


^_^
忘记了来结帖,问题已经解决了,应为程序中没有free()内存,造成了内存泄漏。

#12


汗。。。
浏览器出错,下次来结吧

#13


不懂

#1


再说明一下
getNameIndex ()函数是获取一个字符串
文件中的数据格式如下:
YGR204W YIR038C
YGR204W YJL034W
YGR204W YJL041W
YGR204W YJL053W
YGR204W YJL079C
YGR204W YJL132W
。。。。
本程序是用来比较两个文件中的每一行是否相同,让后给出相同的数目
还希望各位能给点意见

#2


。。。。。。。
没人顶?

#3


太长  慢慢看

#4


先拜谢,^_^

#5


水平低 看不出来

#6


根本无法编译怎么找错误阿!!!

#7


^_^,不好意思,忘了,还有一个文件”mmapfile.c“
下面是这个文件的代码:

#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>

FILE *openFile ( char *fname) {
  FILE *f;
  if ((f = fopen (fname, "r+")) == NULL) perror (fname), exit (1);
  return f;
}

char *mmapFile (FILE *f, struct stat *stp) {
  fstat (fileno (f), stp);
  char *c = (char *)
    mmap ((void *) 0, stp->st_size, PROT_READ|PROT_WRITE, MAP_SHARED,
  fileno (f), 0);
  if (c == MAP_FAILED) perror ("mmap"), exit (1);
#ifdef MADV_SEQUENTIAL
  madvise ((void *) c, stp->st_size, MADV_SEQUENTIAL);
#endif
  return c;
}

#8


这是c++程序吧?正在看!

#9


能不能给一组数据试一试???

#10


数据格式我已经给出来了,用于比较的两个文件都是.txt的
格式如下:
YGR204W YIR038C
YGR204W YJL034W
YGR204W YJL041W
YGR204W YJL053W
YGR204W YJL079C
YGR204W YJL132W
其中一个文件是1000行,另外一个是2700000行
第二文件如果是100000行的话一般不会出错
大于才会的

#11


^_^
忘记了来结帖,问题已经解决了,应为程序中没有free()内存,造成了内存泄漏。

#12


汗。。。
浏览器出错,下次来结吧

#13


不懂