Program crashing why????

Below is the part of my program that is crashing. It simply reads a data file once to determine the number of lines. It then reads it a second time and perform some data conversions.
The crash occurs 75% through reading of the file and the output is line1 though should be function1. What's wrong?

// read the data once to determine the number of lines
//
while(!fin.eof())
{
if (!fin.eof())
{
// get the entire line
fin.getline(line,sizeof(line));
cout << "Line: " << line << endl;
nblines++;
cout << "Nblines:" << nblines << endl;
}

}

// close input file
fin.close();

cout << "Nb lines found: " << nblines << endl;
nblines--;

textout = textout + "Found ";
sprintf(buff,"%d",nblines);
textout = textout + buff;
textout = textout + " lines of data
";
textout= textout + "Reading and Converting Data.. ";
Addtext(textout);
// read data and convert it
//

statusbar->getStatusline()->setNormalText("Converting and writing data ...");
getApp()->flush();
getApp()->forceRefresh();

// open input file
ifstream fin3(input_file_option.text());
char dumchar[1]="";
char functionname[300]= " ";
double vel=0.0;

strcpy(dumchar," ");
i=0;

while((irunWhileEvents();
// get the entire line
fin3.getline(line1,sizeof(line1));
cout << "line1 " << line1 << endl;
data1=strtok(line1, " ");
data2=strtok(NULL, " ");
data3=strtok(NULL, " ");
data4=strtok(NULL, " ");
data5=strtok(NULL, " ");

cout << " toto" << endl;

// check if line starts with # then just write it out
// extract first character
strncpy(dumchar,data1,1);

if (strcmp(dumchar,"#")==0)
{
// writing data out
fprintf(fout,"%s
",line);

printf("%s
",line);
}

else

{

//get vars from line should be functioname X Y Time velocity
//

strcpy(functionname,data1);

//convert char to doubles
xin=atof(data2);
yin=atof(data3);
z=atof(data4);
vel=atof(data5);


printf("Xin: %s %15.2lf %15.2lf %15.2lf %15.2f
",functionname,xin,yin,z,vel);


//convert the data
// case same or&target crs ids
if (src_cs_id==tgt_csid)
{
xout=xin;
yout=yin;
}
else
{
src_xlon[0]=xin;
src_ylat[0]=yin;
caCnvt(src_cs_id,src_npts,src_xlon,src_ylat,tgt_csid,&tgt_npts,&tgt_xlon[0],&tgt_ylat[0],&status);
xout=tgt_xlon[0];
yout=tgt_ylat[0];

if (status)
{
FXMessageBox::error(this,MBOX_OK,"CaCnvt Error","Error converting data.");
goto end_run1;
}

}
// writing data out
//fprintf(fout,"%15.2lf %15.2lf %15.2lf
",xout,yout,z);

printf("Xout: %s %15.2lf %15.2lf %15.2lf %15.2f
",functionname,xout,yout,z,vel);
i++;
pbar->setProgress(100.0*i/nblines);
getApp()->forceRefresh();



}


}
// set status bar
statusbar->getStatusline()->setNormalText("Ready.");
getApp()->flush();
textout= textout + "Done!
";
Addtext(textout);

end_run1:

// close files


fin3.close();
fclose(fout);
runenable=0;
stopgray=0;

the data file is:
#FUNCTION_TYPE = TVave
#LINEAR_UNITS = FEET
#DATUM = 0.000000
#
#FIELDS = Function ID, X, Y, Time, Vave
#
Function1 420975.87 6759685.99 0.0000 6252.8657
Function1 420975.87 6759685.99 933.3000 6252.8657
Function1 420975.87 6759685.99 1070.8000 6384.1987
Function1 420975.87 6759685.99 1211.9000 6465.7144
Function1 420975.87 6759685.99 1360.1000 6496.7280
Function1 420975.87 6759685.99 1388.2996 6508.8252
Function1 420975.87 6759685.99 1444.5000 6580.6851
Function1 420975.87 6759685.99 1482.6000 6634.4258
Function1 420975.87 6759685.99 1546.0000 6730.7886
Function1 420975.87 6759685.99 1597.7000 6782.3750
Function1 420975.87 6759685.99 1691.6993 6860.4370
Function1 420975.87 6759685.99 1867.6000 6943.6709
Function1 420975.87 6759685.99 1898.0000 6973.5508
Function1 420975.87 6759685.99 1961.0000 7055.4814
Function1 420975.87 6759685.99 2179.8999 7264.4624
Function1 420975.87 6759685.99 2308.0000 7388.3008
Function1 420975.87 6759685.99 2388.2000 7468.3862
Function1 420975.87 6759685.99 2407.8000 7490.6548



Comments

  • : Below is the part of my program that is crashing. It simply reads a data file once to determine the number of lines. It then reads it a second time and perform some data conversions.
    : The crash occurs 75% through reading of the file and the output is line1 though should be function1. What's wrong?
    :
    : // read the data once to determine the number of lines
    : //
    : while(!fin.eof())
    : {
    : if (!fin.eof())
    : {
    : // get the entire line
    : fin.getline(line,sizeof(line));
    : cout << "Line: " << line << endl;
    : nblines++;
    : cout << "Nblines:" << nblines << endl;
    : }
    :
    : }
    :
    : // close input file
    : fin.close();
    :
    : cout << "Nb lines found: " << nblines << endl;
    : nblines--;
    :
    : textout = textout + "Found ";
    : sprintf(buff,"%d",nblines);
    : textout = textout + buff;
    : textout = textout + " lines of data
    ";
    : textout= textout + "Reading and Converting Data.. ";
    : Addtext(textout);
    : // read data and convert it
    : //
    :
    : statusbar->getStatusline()->setNormalText("Converting and writing data ...");
    : getApp()->flush();
    : getApp()->forceRefresh();
    :
    : // open input file
    : ifstream fin3(input_file_option.text());
    : char dumchar[1]="";
    : char functionname[300]= " ";
    : double vel=0.0;
    :
    : strcpy(dumchar," ");
    : i=0;
    :
    : while((irunWhileEvents();
    : // get the entire line
    : fin3.getline(line1,sizeof(line1));
    : cout << "line1 " << line1 << endl;
    : data1=strtok(line1, " ");
    : data2=strtok(NULL, " ");
    : data3=strtok(NULL, " ");
    : data4=strtok(NULL, " ");
    : data5=strtok(NULL, " ");
    :
    : cout << " toto" << endl;
    :
    : // check if line starts with # then just write it out
    : // extract first character
    : strncpy(dumchar,data1,1);
    :
    : if (strcmp(dumchar,"#")==0)
    : {
    : // writing data out
    : fprintf(fout,"%s
    ",line);
    :
    : printf("%s
    ",line);
    : }
    :
    : else
    :
    : {
    :
    : //get vars from line should be functioname X Y Time velocity
    : //
    :
    : strcpy(functionname,data1);
    :
    : //convert char to doubles
    : xin=atof(data2);
    : yin=atof(data3);
    : z=atof(data4);
    : vel=atof(data5);
    :
    :
    : printf("Xin: %s %15.2lf %15.2lf %15.2lf %15.2f
    ",functionname,xin,yin,z,vel);
    :
    :
    : //convert the data
    : // case same or&target crs ids
    : if (src_cs_id==tgt_csid)
    : {
    : xout=xin;
    : yout=yin;
    : }
    : else
    : {
    : src_xlon[0]=xin;
    : src_ylat[0]=yin;
    : caCnvt(src_cs_id,src_npts,src_xlon,src_ylat,tgt_csid,&tgt_npts,&tgt_xlon[0],&tgt_ylat[0],&status);
    : xout=tgt_xlon[0];
    : yout=tgt_ylat[0];
    :
    : if (status)
    : {
    : FXMessageBox::error(this,MBOX_OK,"CaCnvt Error","Error converting data.");
    : goto end_run1;
    : }
    :
    : }
    : // writing data out
    : //fprintf(fout,"%15.2lf %15.2lf %15.2lf
    ",xout,yout,z);
    :
    : printf("Xout: %s %15.2lf %15.2lf %15.2lf %15.2f
    ",functionname,xout,yout,z,vel);
    : i++;
    : pbar->setProgress(100.0*i/nblines);
    : getApp()->forceRefresh();
    :
    :
    :
    : }
    :
    :
    : }
    : // set status bar
    : statusbar->getStatusline()->setNormalText("Ready.");
    : getApp()->flush();
    : textout= textout + "Done!
    ";
    : Addtext(textout);
    :
    : end_run1:
    :
    : // close files
    :
    :
    : fin3.close();
    : fclose(fout);
    : runenable=0;
    : stopgray=0;
    :
    : the data file is:
    : #FUNCTION_TYPE = TVave
    : #LINEAR_UNITS = FEET
    : #DATUM = 0.000000
    : #
    : #FIELDS = Function ID, X, Y, Time, Vave
    : #
    : Function1 420975.87 6759685.99 0.0000 6252.8657
    : Function1 420975.87 6759685.99 933.3000 6252.8657
    : Function1 420975.87 6759685.99 1070.8000 6384.1987
    : Function1 420975.87 6759685.99 1211.9000 6465.7144
    : Function1 420975.87 6759685.99 1360.1000 6496.7280
    : Function1 420975.87 6759685.99 1388.2996 6508.8252
    : Function1 420975.87 6759685.99 1444.5000 6580.6851
    : Function1 420975.87 6759685.99 1482.6000 6634.4258
    : Function1 420975.87 6759685.99 1546.0000 6730.7886
    : Function1 420975.87 6759685.99 1597.7000 6782.3750
    : Function1 420975.87 6759685.99 1691.6993 6860.4370
    : Function1 420975.87 6759685.99 1867.6000 6943.6709
    : Function1 420975.87 6759685.99 1898.0000 6973.5508
    : Function1 420975.87 6759685.99 1961.0000 7055.4814
    : Function1 420975.87 6759685.99 2179.8999 7264.4624
    : Function1 420975.87 6759685.99 2308.0000 7388.3008
    : Function1 420975.87 6759685.99 2388.2000 7468.3862
    : Function1 420975.87 6759685.99 2407.8000 7490.6548
    :
    :
    :


  • : : Below is the part of my program that is crashing. It simply reads a data file once to determine the number of lines. It then reads it a second time and perform some data conversions.
    : : The crash occurs 75% through reading of the file and the output is line1 though should be function1. What's wrong?
    : :
    : : // read the data once to determine the number of lines
    : : //
    : : while(!fin.eof())
    : : {
    : : if (!fin.eof())
    : : {
    : : // get the entire line
    : : fin.getline(line,sizeof(line));
    : : cout << "Line: " << line << endl;
    : : nblines++;
    : : cout << "Nblines:" << nblines << endl;
    : : }
    : :
    : : }
    : :
    : : // close input file
    : : fin.close();
    : :
    : : cout << "Nb lines found: " << nblines << endl;
    : : nblines--;
    : :
    : : textout = textout + "Found ";
    : : sprintf(buff,"%d",nblines);
    : : textout = textout + buff;
    : : textout = textout + " lines of data
    ";
    : : textout= textout + "Reading and Converting Data.. ";
    : : Addtext(textout);
    : : // read data and convert it
    : : //
    : :
    : : statusbar->getStatusline()->setNormalText("Converting and writing data ...");
    : : getApp()->flush();
    : : getApp()->forceRefresh();
    : :
    : : // open input file
    : : ifstream fin3(input_file_option.text());
    : : char dumchar[1]="";
    : : char functionname[300]= " ";
    : : double vel=0.0;
    : :
    : : strcpy(dumchar," ");
    : : i=0;
    : :
    : : while((irunWhileEvents();
    : : // get the entire line
    : : fin3.getline(line1,sizeof(line1));
    : : cout << "line1 " << line1 << endl;
    : : data1=strtok(line1, " ");
    : : data2=strtok(NULL, " ");
    : : data3=strtok(NULL, " ");
    : : data4=strtok(NULL, " ");
    : : data5=strtok(NULL, " ");
    : :
    : : cout << " toto" << endl;
    : :
    : : // check if line starts with # then just write it out
    : : // extract first character
    : : strncpy(dumchar,data1,1);
    : :
    : : if (strcmp(dumchar,"#")==0)
    : : {
    : : // writing data out
    : : fprintf(fout,"%s
    ",line);
    : :
    : : printf("%s
    ",line);
    : : }
    : :
    : : else
    : :
    : : {
    : :
    : : //get vars from line should be functioname X Y Time velocity
    : : //
    : :
    : : strcpy(functionname,data1);
    : :
    : : //convert char to doubles
    : : xin=atof(data2);
    : : yin=atof(data3);
    : : z=atof(data4);
    : : vel=atof(data5);
    : :
    : :
    : : printf("Xin: %s %15.2lf %15.2lf %15.2lf %15.2f
    ",functionname,xin,yin,z,vel);
    : :
    : :
    : : //convert the data
    : : // case same or&target crs ids
    : : if (src_cs_id==tgt_csid)
    : : {
    : : xout=xin;
    : : yout=yin;
    : : }
    : : else
    : : {
    : : src_xlon[0]=xin;
    : : src_ylat[0]=yin;
    : : caCnvt(src_cs_id,src_npts,src_xlon,src_ylat,tgt_csid,&tgt_npts,&tgt_xlon[0],&tgt_ylat[0],&status);
    : : xout=tgt_xlon[0];
    : : yout=tgt_ylat[0];
    : :
    : : if (status)
    : : {
    : : FXMessageBox::error(this,MBOX_OK,"CaCnvt Error","Error converting data.");
    : : goto end_run1;
    : : }
    : :
    : : }
    : : // writing data out
    : : //fprintf(fout,"%15.2lf %15.2lf %15.2lf
    ",xout,yout,z);
    : :
    : : printf("Xout: %s %15.2lf %15.2lf %15.2lf %15.2f
    ",functionname,xout,yout,z,vel);
    : : i++;
    : : pbar->setProgress(100.0*i/nblines);
    : : getApp()->forceRefresh();
    : :
    : :
    : :
    : : }
    : :
    : :
    : : }
    : : // set status bar
    : : statusbar->getStatusline()->setNormalText("Ready.");
    : : getApp()->flush();
    : : textout= textout + "Done!
    ";
    : : Addtext(textout);
    : :
    : : end_run1:
    : :
    : : // close files
    : :
    : :
    : : fin3.close();
    : : fclose(fout);
    : : runenable=0;
    : : stopgray=0;
    : :
    : : the data file is:
    : : #FUNCTION_TYPE = TVave
    : : #LINEAR_UNITS = FEET
    : : #DATUM = 0.000000
    : : #
    : : #FIELDS = Function ID, X, Y, Time, Vave
    : : #
    : : Function1 420975.87 6759685.99 0.0000 6252.8657
    : : Function1 420975.87 6759685.99 933.3000 6252.8657
    : : Function1 420975.87 6759685.99 1070.8000 6384.1987
    : : Function1 420975.87 6759685.99 1211.9000 6465.7144
    : : Function1 420975.87 6759685.99 1360.1000 6496.7280
    : : Function1 420975.87 6759685.99 1388.2996 6508.8252
    : : Function1 420975.87 6759685.99 1444.5000 6580.6851
    : : Function1 420975.87 6759685.99 1482.6000 6634.4258
    : : Function1 420975.87 6759685.99 1546.0000 6730.7886
    : : Function1 420975.87 6759685.99 1597.7000 6782.3750
    : : Function1 420975.87 6759685.99 1691.6993 6860.4370
    : : Function1 420975.87 6759685.99 1867.6000 6943.6709
    : : Function1 420975.87 6759685.99 1898.0000 6973.5508
    : : Function1 420975.87 6759685.99 1961.0000 7055.4814
    : : Function1 420975.87 6759685.99 2179.8999 7264.4624
    : : Function1 420975.87 6759685.99 2308.0000 7388.3008
    : : Function1 420975.87 6759685.99 2388.2000 7468.3862
    : : Function1 420975.87 6759685.99 2407.8000 7490.6548
    : :
    : :
    : :
    :
    :
    Hi,

    You can't write strcpy(dummchar," "); because the length of dummchar is 1 and with a char array you must have a '' at the end of the array.

    With strncpy and strcat you must add the '' at the end of the array.

    They are perhaps other mistakes but I haven't the time to find them.

    Good luck,

    Vincent.


  • : : : Below is the part of my program that is crashing. It simply reads a data file once to determine the number of lines. It then reads it a second time and perform some data conversions.
    : : : The crash occurs 75% through reading of the file and the output is line1 though should be function1. What's wrong?
    : : :
    : : : // read the data once to determine the number of lines
    : : : //
    : : : while(!fin.eof())
    : : : {
    : : : if (!fin.eof())
    : : : {
    : : : // get the entire line
    : : : fin.getline(line,sizeof(line));
    : : : cout << "Line: " << line << endl;
    : : : nblines++;
    : : : cout << "Nblines:" << nblines << endl;
    : : : }
    : : :
    : : : }
    : : :
    : : : // close input file
    : : : fin.close();
    : : :
    : : : cout << "Nb lines found: " << nblines << endl;
    : : : nblines--;
    : : :
    : : : textout = textout + "Found ";
    : : : sprintf(buff,"%d",nblines);
    : : : textout = textout + buff;
    : : : textout = textout + " lines of data
    ";
    : : : textout= textout + "Reading and Converting Data.. ";
    : : : Addtext(textout);
    : : : // read data and convert it
    : : : //
    : : :
    : : : statusbar->getStatusline()->setNormalText("Converting and writing data ...");
    : : : getApp()->flush();
    : : : getApp()->forceRefresh();
    : : :
    : : : // open input file
    : : : ifstream fin3(input_file_option.text());
    : : : char dumchar[1]="";
    : : : char functionname[300]= " ";
    : : : double vel=0.0;
    : : :
    : : : strcpy(dumchar," ");
    : : : i=0;
    : : :
    : : : while((irunWhileEvents();
    : : : // get the entire line
    : : : fin3.getline(line1,sizeof(line1));
    : : : cout << "line1 " << line1 << endl;
    : : : data1=strtok(line1, " ");
    : : : data2=strtok(NULL, " ");
    : : : data3=strtok(NULL, " ");
    : : : data4=strtok(NULL, " ");
    : : : data5=strtok(NULL, " ");
    : : :
    : : : cout << " toto" << endl;
    : : :
    : : : // check if line starts with # then just write it out
    : : : // extract first character
    : : : strncpy(dumchar,data1,1);
    : : :
    : : : if (strcmp(dumchar,"#")==0)
    : : : {
    : : : // writing data out
    : : : fprintf(fout,"%s
    ",line);
    : : :
    : : : printf("%s
    ",line);
    : : : }
    : : :
    : : : else
    : : :
    : : : {
    : : :
    : : : //get vars from line should be functioname X Y Time velocity
    : : : //
    : : :
    : : : strcpy(functionname,data1);
    : : :
    : : : //convert char to doubles
    : : : xin=atof(data2);
    : : : yin=atof(data3);
    : : : z=atof(data4);
    : : : vel=atof(data5);
    : : :
    : : :
    : : : printf("Xin: %s %15.2lf %15.2lf %15.2lf %15.2f
    ",functionname,xin,yin,z,vel);
    : : :
    : : :
    : : : //convert the data
    : : : // case same or&target crs ids
    : : : if (src_cs_id==tgt_csid)
    : : : {
    : : : xout=xin;
    : : : yout=yin;
    : : : }
    : : : else
    : : : {
    : : : src_xlon[0]=xin;
    : : : src_ylat[0]=yin;
    : : : caCnvt(src_cs_id,src_npts,src_xlon,src_ylat,tgt_csid,&tgt_npts,&tgt_xlon[0],&tgt_ylat[0],&status);
    : : : xout=tgt_xlon[0];
    : : : yout=tgt_ylat[0];
    : : :
    : : : if (status)
    : : : {
    : : : FXMessageBox::error(this,MBOX_OK,"CaCnvt Error","Error converting data.");
    : : : goto end_run1;
    : : : }
    : : :
    : : : }
    : : : // writing data out
    : : : //fprintf(fout,"%15.2lf %15.2lf %15.2lf
    ",xout,yout,z);
    : : :
    : : : printf("Xout: %s %15.2lf %15.2lf %15.2lf %15.2f
    ",functionname,xout,yout,z,vel);
    : : : i++;
    : : : pbar->setProgress(100.0*i/nblines);
    : : : getApp()->forceRefresh();
    : : :
    : : :
    : : :
    : : : }
    : : :
    : : :
    : : : }
    : : : // set status bar
    : : : statusbar->getStatusline()->setNormalText("Ready.");
    : : : getApp()->flush();
    : : : textout= textout + "Done!
    ";
    : : : Addtext(textout);
    : : :
    : : : end_run1:
    : : :
    : : : // close files
    : : :
    : : :
    : : : fin3.close();
    : : : fclose(fout);
    : : : runenable=0;
    : : : stopgray=0;
    : : :
    : : : the data file is:
    : : : #FUNCTION_TYPE = TVave
    : : : #LINEAR_UNITS = FEET
    : : : #DATUM = 0.000000
    : : : #
    : : : #FIELDS = Function ID, X, Y, Time, Vave
    : : : #
    : : : Function1 420975.87 6759685.99 0.0000 6252.8657
    : : : Function1 420975.87 6759685.99 933.3000 6252.8657
    : : : Function1 420975.87 6759685.99 1070.8000 6384.1987
    : : : Function1 420975.87 6759685.99 1211.9000 6465.7144
    : : : Function1 420975.87 6759685.99 1360.1000 6496.7280
    : : : Function1 420975.87 6759685.99 1388.2996 6508.8252
    : : : Function1 420975.87 6759685.99 1444.5000 6580.6851
    : : : Function1 420975.87 6759685.99 1482.6000 6634.4258
    : : : Function1 420975.87 6759685.99 1546.0000 6730.7886
    : : : Function1 420975.87 6759685.99 1597.7000 6782.3750
    : : : Function1 420975.87 6759685.99 1691.6993 6860.4370
    : : : Function1 420975.87 6759685.99 1867.6000 6943.6709
    : : : Function1 420975.87 6759685.99 1898.0000 6973.5508
    : : : Function1 420975.87 6759685.99 1961.0000 7055.4814
    : : : Function1 420975.87 6759685.99 2179.8999 7264.4624
    : : : Function1 420975.87 6759685.99 2308.0000 7388.3008
    : : : Function1 420975.87 6759685.99 2388.2000 7468.3862
    : : : Function1 420975.87 6759685.99 2407.8000 7490.6548
    : : :
    : : :
    : : :
    : :
    : :
    : Hi,
    :
    : You can't write strcpy(dummchar," "); because the length of dummchar is 1 and with a char array you must have a '' at the end of the array.
    :
    : With strncpy and strcat you must add the '' at the end of the array.
    :
    : They are perhaps other mistakes but I haven't the time to find them.
    :
    : Good luck,
    :
    : Vincent.
    :
    :
    If I remove strcpy(dummchar," "); then the program crashes but with it does not why is that?
    Is there a better way to
    1) extract the first character of a char array which I get from getline(in,line)
    2) compare it to # char?


    My other problem is that that the program crashes when it does the finput.close() what could be the reason?

    Thanks,

    Fabien

  • : : : : Below is the part of my program that is crashing. It simply reads a data file once to determine the number of lines. It then reads it a second time and perform some data conversions.
    : : : : The crash occurs 75% through reading of the file and the output is line1 though should be function1. What's wrong?
    : : : :
    : : : : // read the data once to determine the number of lines
    : : : : //
    : : : : while(!fin.eof())
    : : : : {
    : : : : if (!fin.eof())
    : : : : {
    : : : : // get the entire line
    : : : : fin.getline(line,sizeof(line));
    : : : : cout << "Line: " << line << endl;
    : : : : nblines++;
    : : : : cout << "Nblines:" << nblines << endl;
    : : : : }
    : : : :
    : : : : }
    : : : :
    : : : : // close input file
    : : : : fin.close();
    : : : :
    : : : : cout << "Nb lines found: " << nblines << endl;
    : : : : nblines--;
    : : : :
    : : : : textout = textout + "Found ";
    : : : : sprintf(buff,"%d",nblines);
    : : : : textout = textout + buff;
    : : : : textout = textout + " lines of data
    ";
    : : : : textout= textout + "Reading and Converting Data.. ";
    : : : : Addtext(textout);
    : : : : // read data and convert it
    : : : : //
    : : : :
    : : : : statusbar->getStatusline()->setNormalText("Converting and writing data ...");
    : : : : getApp()->flush();
    : : : : getApp()->forceRefresh();
    : : : :
    : : : : // open input file
    : : : : ifstream fin3(input_file_option.text());
    : : : : char dumchar[1]="";
    : : : : char functionname[300]= " ";
    : : : : double vel=0.0;
    : : : :
    : : : : strcpy(dumchar," ");
    : : : : i=0;
    : : : :
    : : : : while((irunWhileEvents();
    : : : : // get the entire line
    : : : : fin3.getline(line1,sizeof(line1));
    : : : : cout << "line1 " << line1 << endl;
    : : : : data1=strtok(line1, " ");
    : : : : data2=strtok(NULL, " ");
    : : : : data3=strtok(NULL, " ");
    : : : : data4=strtok(NULL, " ");
    : : : : data5=strtok(NULL, " ");
    : : : :
    : : : : cout << " toto" << endl;
    : : : :
    : : : : // check if line starts with # then just write it out
    : : : : // extract first character
    : : : : strncpy(dumchar,data1,1);
    : : : :
    : : : : if (strcmp(dumchar,"#")==0)
    : : : : {
    : : : : // writing data out
    : : : : fprintf(fout,"%s
    ",line);
    : : : :
    : : : : printf("%s
    ",line);
    : : : : }
    : : : :
    : : : : else
    : : : :
    : : : : {
    : : : :
    : : : : //get vars from line should be functioname X Y Time velocity
    : : : : //
    : : : :
    : : : : strcpy(functionname,data1);
    : : : :
    : : : : //convert char to doubles
    : : : : xin=atof(data2);
    : : : : yin=atof(data3);
    : : : : z=atof(data4);
    : : : : vel=atof(data5);
    : : : :
    : : : :
    : : : : printf("Xin: %s %15.2lf %15.2lf %15.2lf %15.2f
    ",functionname,xin,yin,z,vel);
    : : : :
    : : : :
    : : : : //convert the data
    : : : : // case same or&target crs ids
    : : : : if (src_cs_id==tgt_csid)
    : : : : {
    : : : : xout=xin;
    : : : : yout=yin;
    : : : : }
    : : : : else
    : : : : {
    : : : : src_xlon[0]=xin;
    : : : : src_ylat[0]=yin;
    : : : : caCnvt(src_cs_id,src_npts,src_xlon,src_ylat,tgt_csid,&tgt_npts,&tgt_xlon[0],&tgt_ylat[0],&status);
    : : : : xout=tgt_xlon[0];
    : : : : yout=tgt_ylat[0];
    : : : :
    : : : : if (status)
    : : : : {
    : : : : FXMessageBox::error(this,MBOX_OK,"CaCnvt Error","Error converting data.");
    : : : : goto end_run1;
    : : : : }
    : : : :
    : : : : }
    : : : : // writing data out
    : : : : //fprintf(fout,"%15.2lf %15.2lf %15.2lf
    ",xout,yout,z);
    : : : :
    : : : : printf("Xout: %s %15.2lf %15.2lf %15.2lf %15.2f
    ",functionname,xout,yout,z,vel);
    : : : : i++;
    : : : : pbar->setProgress(100.0*i/nblines);
    : : : : getApp()->forceRefresh();
    : : : :
    : : : :
    : : : :
    : : : : }
    : : : :
    : : : :
    : : : : }
    : : : : // set status bar
    : : : : statusbar->getStatusline()->setNormalText("Ready.");
    : : : : getApp()->flush();
    : : : : textout= textout + "Done!
    ";
    : : : : Addtext(textout);
    : : : :
    : : : : end_run1:
    : : : :
    : : : : // close files
    : : : :
    : : : :
    : : : : fin3.close();
    : : : : fclose(fout);
    : : : : runenable=0;
    : : : : stopgray=0;
    : : : :
    : : : : the data file is:
    : : : : #FUNCTION_TYPE = TVave
    : : : : #LINEAR_UNITS = FEET
    : : : : #DATUM = 0.000000
    : : : : #
    : : : : #FIELDS = Function ID, X, Y, Time, Vave
    : : : : #
    : : : : Function1 420975.87 6759685.99 0.0000 6252.8657
    : : : : Function1 420975.87 6759685.99 933.3000 6252.8657
    : : : : Function1 420975.87 6759685.99 1070.8000 6384.1987
    : : : : Function1 420975.87 6759685.99 1211.9000 6465.7144
    : : : : Function1 420975.87 6759685.99 1360.1000 6496.7280
    : : : : Function1 420975.87 6759685.99 1388.2996 6508.8252
    : : : : Function1 420975.87 6759685.99 1444.5000 6580.6851
    : : : : Function1 420975.87 6759685.99 1482.6000 6634.4258
    : : : : Function1 420975.87 6759685.99 1546.0000 6730.7886
    : : : : Function1 420975.87 6759685.99 1597.7000 6782.3750
    : : : : Function1 420975.87 6759685.99 1691.6993 6860.4370
    : : : : Function1 420975.87 6759685.99 1867.6000 6943.6709
    : : : : Function1 420975.87 6759685.99 1898.0000 6973.5508
    : : : : Function1 420975.87 6759685.99 1961.0000 7055.4814
    : : : : Function1 420975.87 6759685.99 2179.8999 7264.4624
    : : : : Function1 420975.87 6759685.99 2308.0000 7388.3008
    : : : : Function1 420975.87 6759685.99 2388.2000 7468.3862
    : : : : Function1 420975.87 6759685.99 2407.8000 7490.6548
    : : : :
    : : : :
    : : : :
    : : :
    : : :
    : : Hi,
    : :
    : : You can't write strcpy(dummchar," "); because the length of dummchar is 1 and with a char array you must have a '' at the end of the array.
    : :
    : : With strncpy and strcat you must add the '' at the end of the array.
    : :
    : : They are perhaps other mistakes but I haven't the time to find them.
    : :
    : : Good luck,
    : :
    : : Vincent.
    : :
    : :
    : If I remove strcpy(dummchar," "); then the program crashes but with it does not why is that?
    : Is there a better way to
    : 1) extract the first character of a char array which I get from getline(in,line)
    : 2) compare it to # char?
    :

    [blue]Try changing [b]char dumchar[1]="";[/b] to [b]char dumchar;[/b], take out the [b]strcpy(dumchar," ");[/b] and [b]strncpy(dumchar,data1,1);[/b] lines. Instead of [b]if (strcmp(dumchar,"#")==0)[/b], use [b]if(data1[0]=='#')[/b]. Try that and see what happens. Don't know about that other problem with closing the file stream though, maybe this will clear it up hopefully. Good luck![/blue]

    :
    : My other problem is that that the program crashes when it does the finput.close() what could be the reason?
    :
    : Thanks,
    :
    : Fabien
    :


  • : : : : : Below is the part of my program that is crashing. It simply reads a data file once to determine the number of lines. It then reads it a second time and perform some data conversions.
    : : : : : The crash occurs 75% through reading of the file and the output is line1 though should be function1. What's wrong?
    : : : : :
    : : : : : // read the data once to determine the number of lines
    : : : : : //
    : : : : : while(!fin.eof())
    : : : : : {
    : : : : : if (!fin.eof())
    : : : : : {
    : : : : : // get the entire line
    : : : : : fin.getline(line,sizeof(line));
    : : : : : cout << "Line: " << line << endl;
    : : : : : nblines++;
    : : : : : cout << "Nblines:" << nblines << endl;
    : : : : : }
    : : : : :
    : : : : : }
    : : : : :
    : : : : : // close input file
    : : : : : fin.close();
    : : : : :
    : : : : : cout << "Nb lines found: " << nblines << endl;
    : : : : : nblines--;
    : : : : :
    : : : : : textout = textout + "Found ";
    : : : : : sprintf(buff,"%d",nblines);
    : : : : : textout = textout + buff;
    : : : : : textout = textout + " lines of data
    ";
    : : : : : textout= textout + "Reading and Converting Data.. ";
    : : : : : Addtext(textout);
    : : : : : // read data and convert it
    : : : : : //
    : : : : :
    : : : : : statusbar->getStatusline()->setNormalText("Converting and writing data ...");
    : : : : : getApp()->flush();
    : : : : : getApp()->forceRefresh();
    : : : : :
    : : : : : // open input file
    : : : : : ifstream fin3(input_file_option.text());
    : : : : : char dumchar[1]="";
    : : : : : char functionname[300]= " ";
    : : : : : double vel=0.0;
    : : : : :
    : : : : : strcpy(dumchar," ");
    : : : : : i=0;
    : : : : :
    : : : : : while((irunWhileEvents();
    : : : : : // get the entire line
    : : : : : fin3.getline(line1,sizeof(line1));
    : : : : : cout << "line1 " << line1 << endl;
    : : : : : data1=strtok(line1, " ");
    : : : : : data2=strtok(NULL, " ");
    : : : : : data3=strtok(NULL, " ");
    : : : : : data4=strtok(NULL, " ");
    : : : : : data5=strtok(NULL, " ");
    : : : : :
    : : : : : cout << " toto" << endl;
    : : : : :
    : : : : : // check if line starts with # then just write it out
    : : : : : // extract first character
    : : : : : strncpy(dumchar,data1,1);
    : : : : :
    : : : : : if (strcmp(dumchar,"#")==0)
    : : : : : {
    : : : : : // writing data out
    : : : : : fprintf(fout,"%s
    ",line);
    : : : : :
    : : : : : printf("%s
    ",line);
    : : : : : }
    : : : : :
    : : : : : else
    : : : : :
    : : : : : {
    : : : : :
    : : : : : //get vars from line should be functioname X Y Time velocity
    : : : : : //
    : : : : :
    : : : : : strcpy(functionname,data1);
    : : : : :
    : : : : : //convert char to doubles
    : : : : : xin=atof(data2);
    : : : : : yin=atof(data3);
    : : : : : z=atof(data4);
    : : : : : vel=atof(data5);
    : : : : :
    : : : : :
    : : : : : printf("Xin: %s %15.2lf %15.2lf %15.2lf %15.2f
    ",functionname,xin,yin,z,vel);
    : : : : :
    : : : : :
    : : : : : //convert the data
    : : : : : // case same or&target crs ids
    : : : : : if (src_cs_id==tgt_csid)
    : : : : : {
    : : : : : xout=xin;
    : : : : : yout=yin;
    : : : : : }
    : : : : : else
    : : : : : {
    : : : : : src_xlon[0]=xin;
    : : : : : src_ylat[0]=yin;
    : : : : : caCnvt(src_cs_id,src_npts,src_xlon,src_ylat,tgt_csid,&tgt_npts,&tgt_xlon[0],&tgt_ylat[0],&status);
    : : : : : xout=tgt_xlon[0];
    : : : : : yout=tgt_ylat[0];
    : : : : :
    : : : : : if (status)
    : : : : : {
    : : : : : FXMessageBox::error(this,MBOX_OK,"CaCnvt Error","Error converting data.");
    : : : : : goto end_run1;
    : : : : : }
    : : : : :
    : : : : : }
    : : : : : // writing data out
    : : : : : //fprintf(fout,"%15.2lf %15.2lf %15.2lf
    ",xout,yout,z);
    : : : : :
    : : : : : printf("Xout: %s %15.2lf %15.2lf %15.2lf %15.2f
    ",functionname,xout,yout,z,vel);
    : : : : : i++;
    : : : : : pbar->setProgress(100.0*i/nblines);
    : : : : : getApp()->forceRefresh();
    : : : : :
    : : : : :
    : : : : :
    : : : : : }
    : : : : :
    : : : : :
    : : : : : }
    : : : : : // set status bar
    : : : : : statusbar->getStatusline()->setNormalText("Ready.");
    : : : : : getApp()->flush();
    : : : : : textout= textout + "Done!
    ";
    : : : : : Addtext(textout);
    : : : : :
    : : : : : end_run1:
    : : : : :
    : : : : : // close files
    : : : : :
    : : : : :
    : : : : : fin3.close();
    : : : : : fclose(fout);
    : : : : : runenable=0;
    : : : : : stopgray=0;
    : : : : :
    : : : : : the data file is:
    : : : : : #FUNCTION_TYPE = TVave
    : : : : : #LINEAR_UNITS = FEET
    : : : : : #DATUM = 0.000000
    : : : : : #
    : : : : : #FIELDS = Function ID, X, Y, Time, Vave
    : : : : : #
    : : : : : Function1 420975.87 6759685.99 0.0000 6252.8657
    : : : : : Function1 420975.87 6759685.99 933.3000 6252.8657
    : : : : : Function1 420975.87 6759685.99 1070.8000 6384.1987
    : : : : : Function1 420975.87 6759685.99 1211.9000 6465.7144
    : : : : : Function1 420975.87 6759685.99 1360.1000 6496.7280
    : : : : : Function1 420975.87 6759685.99 1388.2996 6508.8252
    : : : : : Function1 420975.87 6759685.99 1444.5000 6580.6851
    : : : : : Function1 420975.87 6759685.99 1482.6000 6634.4258
    : : : : : Function1 420975.87 6759685.99 1546.0000 6730.7886
    : : : : : Function1 420975.87 6759685.99 1597.7000 6782.3750
    : : : : : Function1 420975.87 6759685.99 1691.6993 6860.4370
    : : : : : Function1 420975.87 6759685.99 1867.6000 6943.6709
    : : : : : Function1 420975.87 6759685.99 1898.0000 6973.5508
    : : : : : Function1 420975.87 6759685.99 1961.0000 7055.4814
    : : : : : Function1 420975.87 6759685.99 2179.8999 7264.4624
    : : : : : Function1 420975.87 6759685.99 2308.0000 7388.3008
    : : : : : Function1 420975.87 6759685.99 2388.2000 7468.3862
    : : : : : Function1 420975.87 6759685.99 2407.8000 7490.6548
    : : : : :
    : : : : :
    : : : : :
    : : : :
    : : : :
    : : : Hi,
    : : :
    : : : You can't write strcpy(dummchar," "); because the length of dummchar is 1 and with a char array you must have a '' at the end of the array.
    : : :
    : : : With strncpy and strcat you must add the '' at the end of the array.
    : : :
    : : : They are perhaps other mistakes but I haven't the time to find them.
    : : :
    : : : Good luck,
    : : :
    : : : Vincent.
    : : :
    : : :
    : : If I remove strcpy(dummchar," "); then the program crashes but with it does not why is that?
    : : Is there a better way to
    : : 1) extract the first character of a char array which I get from getline(in,line)
    : : 2) compare it to # char?
    : :
    :
    : [blue]Try changing [b]char dumchar[1]="";[/b] to [b]char dumchar;[/b], take out the [b]strcpy(dumchar," ");[/b] and [b]strncpy(dumchar,data1,1);[/b] lines. Instead of [b]if (strcmp(dumchar,"#")==0)[/b], use [b]if(data1[0]=='#')[/b]. Try that and see what happens. Don't know about that other problem with closing the file stream though, maybe this will clear it up hopefully. Good luck![/blue]
    :
    : :
    : : My other problem is that that the program crashes when it does the finput.close() what could be the reason?
    : :
    : : Thanks,
    : :
    : : Fabien
    : :
    :
    :


Sign In or Register to comment.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories