1

我正在尝试制作一个程序来读取带有名称列表的文件。这些名称的数量以及名称的长度可能会有所不同。我想将它们存储在 char 数组的数组中,并将每一行作为字符串读取,以便稍后打开与相关名称对应的文件。但是当我尝试打开第一个文件时,打开文件时出错。我完全没有想法。请帮忙?

这是与此操作相关的代码:

#include <stdio.h> 
#include <stdlib.h>
#include <math.h>
#include <string.h>
int glimps(char *fname);
int write_av(char *fname, int NumbFiles);
int clr(char *fname);
int readFile(char *fname, int i);

double *dalpha, *alpha, *Ln_t, *LnLnA, Conc;
long *time, *weights, *Lmax, Nmax;
char *av_file, **in_files, *antetka;

/****************************************************************************/

int main(int argc, char *farg[])
{
 int i, NumbFiles, flag;
 long row;
 char *a1;
 FILE *fp;

 av_file = farg[1];
 printf("av_file = %s\n",av_file);
 NumbFiles = glimps(av_file);

 in_files = (char **) malloc (sizeof(char *) * NumbFiles);
 for (i=0 ; i<NumbFiles ; i++) 
      in_files[i] = (char *) malloc (sizeof(char) * 200);

 Lmax = (long *) calloc((size_t) NumbFiles, sizeof(long));
 if((in_files == NULL)||(Lmax==NULL))  printf("Грешка при read алок.\n, "), exit(-1);     
 if (flag = readFile(av_file, -1)) 
     printf("Error in read av_file %s\n", av_file), exit(-1);
 weights = (long *) calloc((size_t) Nmax, sizeof(long));
 for(i = 0; i<Nmax; i++) weights = 0;
 for(i = 0; i<NumbFiles; i++)
 {
       //if (flag = readFile(&(*in_files[i]), i)) 
       if (flag = readFile(in_files[i], i))
           printf("Error in in_files[%d], %s\n",i, &(*in_files[i])), exit(-1);     
 }
 if (flag = write_av(av_file, NumbFiles)) 
     printf("Error in write_av(%s)\n,", av_file), exit(-1);      
 exit(0);
}

/****************************************************************************/

int glimps(char *fname)
{
 FILE *fp;
 char buf[140];
 int cnt=0;

 fp = fopen (fname, "r");
 while (fgets(buf,140,fp) )
 {
        cnt++;
 }
 fclose(fp);
 return (cnt);
}
/****************************************************************************/

int readFile(char *fname, int k)
{
 int cnt=0;
 FILE *fp;
 char buf[200], dummy[13];

 printf("fname is %s\n", fname); getchar();
 fp = fopen (fname, "r");
 if(fp==(NULL)) return(-1);
 if(!strcmp(fname,av_file) )
 {
    while (fgets(in_files[cnt++],200,fp) );
 }
 else
 {
    printf("read TUK!\n"); getchar();

    fgets(buf,200,fp);
    sscanf(buf,"%s %s %s %s %s %s %s %ld %s %s %lf\n", 
                dummy, dummy,dummy,dummy,dummy,dummy,dummy, &Lmax[k], 
                dummy, dummy, &Conc);           
    fgets(buf,200,fp);
    sscanf(buf,"%s\n", antetka);        
    printf("read TUK!\n"); getchar();
    while (fgets(buf,200,fp))
    {
           sscanf(buf,"%ld %lf %lf %s %lf %lf\n", 
                  &time[cnt], &dalpha[cnt], &alpha[cnt], dummy, &Ln_t[cnt], 
                  &LnLnA[cnt]);
           weights[cnt++]++;
    }

 }
 fclose(fp);
 return (0);
}

...

控制台输出:

> ./avr alpha_cubeL.C0.010
av_file = alpha_cubeL.C0.010
fname is alpha_cubeL.C0.010
fname is alpha_cubeL100C0.010
Error in read in_files[0], alpha_cubeL100C0.010

> ls alpha_cubeL100C0.010
alpha_cubeL100C0.010
4

1 回答 1

1

发生的情况是,在readFile函数中,您读取了作为参数给出的主文件,以使(从内容)中的多个文件名in_files[i],但fgets读取包括 CR 或 CRLF 的行(即行尾字符)。因此,稍后在程序中,readFile在尝试打开文件名+ CR [ LF ] 时失败。

您可以在程序顶部附近添加一个修剪功能,例如

void trim(char *s) {
  int i,l = strlen(s);
  for (i=l-1 ; i>=0 && (s[i]==10 || s[i]==13) ; i--) s[i] = 0;
}

删除结束字符串s 的CR 和/或 LF,然后更改readFile函数以修剪在每一行中读取的文件名,例如

  while (fgets(in_files[cnt++],200,fp) ) {
    trim(in_files[cnt-1]); // cnt-1, or do the cnt++ here (and not above...)
  }

然后可以打开文件...

(这可能不是这个程序中唯一的问题,但这是一个好的开始)

于 2013-03-23T10:40:08.400 回答