Kati Avramova
Kati Avramova

Reputation: 71

c, 2d char array and fopen

I'm trying to make a program that reads a file with list of names. The number of those names can vary, as well as the names lengths. I want to store them in an array of arrays of char, and read each row as a string to later open the file that corresponds to the name in question. But when I try to open the first one, I have an error opening file. I'm totally out of ideas. Help, please?

Here is the code relevant to this action:

#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);
}

...

Console Output:

> ./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

Upvotes: 1

Views: 510

Answers (1)

D&#233;j&#224; vu
D&#233;j&#224; vu

Reputation: 28850

What happens is that in the readFile function, you read the main file given as argument to make (from the content) several file names in in_files[i], but fgets reads lines including the CR or CRLF (ie the end of line character(s)). Thus later in the program, readFile fails as it tries to open filename + CR [LF].

You may just add a trim function near the top of your program, like

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

that removes CR and/or LF that end a string s, and then change the readFile function to trim the file names read in each line, like

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

Then the files can be opened...

(this is probably not the only problem in this program, but this is a good start)

Upvotes: 1

Related Questions