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 に答える