Hi Michal, You should use standard functions to decode floating points, for example sscanf. See an example in Root tutorial "staff.C". Rene Brun lijowski@cosray2.wustl.edu wrote: > > The following code crashes most of the time with the > segmentation violation in root 2.20/06 for SunOS5.4 on Sparc. > But when compiled with gcc it works fine. It works also > when instead calling a function I parse a string inside > main macro. > > Thanks for any hints. > > Regards > > Michal Lijowski > > #include <stdio.h> > #include <stdlib.h> > #include <math.h> > #include <string.h> > > // ------------------------------------------------------------------------- > > int getfloats(char *tmpstr, float *aa) > // extracts up to 10 floating point numbers from a string > > { > int SLEN = 40; > char cc[2], str1[SLEN]; > > int sl = strlen(tmpstr); > printf("%4d %s", sl, tmpstr); > cc[0] = tmpstr[0]; > int jj = 0; > int ii = 0; > while ( (ii < 10) && (jj < sl) ) { > str1[0] = '\0'; > while ( (cc[0] != ' ') && (jj < sl) ) { > strncat(str1, cc, 1); > jj++; > cc[0] = tmpstr[jj]; > } > aa[ii] = atof(str1); > ii++; > // skip white spaces > while ( (cc[0] == ' ') && (jj < sl) ) { > jj++; > cc[0] = tmpstr[jj]; > } > } > return ii; > } > > // --------------------------------------------------------------------- > > void test_read() > { > char infile[200]; > float aa[10]; > int SLEN = 80, nn; > char tmpstr[SLEN], str1[20], cc[2]; > > sprintf(infile, "tmp.dat"); > printf("%s\n", infile); > FILE *infp = fopen(infile, "r"); > if (infp == NULL) { > printf("test_read2b can't open %s\n", infile); > exit(1); > } > int npts = 0; > // loop until EOF > while (fgets(tmpstr, SLEN, infp) != NULL) { > printf(" %s", tmpstr); > nn = getfloats(tmpstr, aa); > for (int ii = 0; ii < nn; ii++) { > printf(" %f ", aa[ii]); > } > printf("\n"); > npts++; > } > fclose(infp); > } > > A few lines of numbers from tmp.dat file. > 0 318.52 > 1 318.51 > 2 318.51 > 3 318.50 > 4 318.50 > 5 318.49 > 6 318.48 > 7 318.47 > 8 318.46 > 9 318.45
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:28 MET