Core dump creato da un file non trovato (?)

di il
14 risposte

Core dump creato da un file non trovato (?)

Ciao ragazzi, sono nuovo nel forum quindi se sbaglio in qualcosa fatemelo notare.
Sto scrivendo un programma per l' università e sono da un paio di giorni piantato su questa cosa.
Il programma viene complilato senza problemi, solo che quando lo eseguo crusha ubuntu e devo riavviarlo per poter riiniziare.
Ho provato a compilarlo su un altro computer e da quel che ho capito il problema è nella acquisizione del file da leggere.
Esso dovrebbe essere preso in fase di esecuzione da terminale, poi passato ad una classe che lo legge.
 
int main( int argc, char* argv[] ) {

  // create data source
  EventSource* es; 
  const string type = argv[1];
  if ( type == "input" ) {
    const string name = argv[2];
    es = new EventReadFromFile( name );
  }
  else {
    cout << "invalid keyword" << endl;
    return 0;
  }
 

e posto la classe:

class EventReadFromFile: public EventSource {

 public:

  // read data from file "name"
  EventReadFromFile( const std::string& name );
  virtual ~EventReadFromFile();

 private:

  // dummy copy constructor and assignment to prevent unadvertent copy
  EventReadFromFile           ( const EventReadFromFile& x );
  EventReadFromFile& operator=( const EventReadFromFile& x );

  // get an event
  virtual const Event* get(); //è virtual qui perchè deriva da una classe base che ha il questa funzione virtual

  // input file
  std::ifstream* ifi;

  // read and event
  const Event* readFile();

// read data from file "name"
EventReadFromFile::EventReadFromFile( const string& name ) {

ifi = new ifstream( name.c_str(), ios::in );  
}


EventReadFromFile::~EventReadFromFile() {
  delete ifi;
}


// get an event
const Event* EventReadFromFile::get() {
  return readFile();
}


  // read an event
const Event* EventReadFromFile::readFile() {
Event* q ;//pointer to object
int j =0;// event id
if( ifi->read(reinterpret_cast<char*>( &j ),sizeof(j)) ) {/*se apre il file creo nuovo evento, altrimenti ritorno 0 */


float a,b,c; 
a=b=c=0.0;// event coordinates
ifi->read(reinterpret_cast<char*>( &a ),sizeof(a));


q=new Event(j,a) ;  }
else {cout<<"houston abbiamo un problema"<<endl;
return 0 ;
} 
...
la classe prende il nome e crea un file ifstream per poi leggerlo, non capisco perchè se non trova il file non mi ritorna errori.
Grazie per l' attenzione e se ho dimenticato di dire qualcosa fatemi sapere.

14 Risposte

  • Re: Core dump creato da un file non trovato (?)

    A parte l'allegra gestione della memoria alla Java, sei sicuro che argv[2] contenga sempre qualcosa?
  • Re: Core dump creato da un file non trovato (?)

    Sì lo ho provato a parte ed effettivamente prende quello che deve.
  • Re: Core dump creato da un file non trovato (?)

    Controlla sempre di avere almeno tre argomenti nella linea di comando (argc == 3), perché ne std::string ne std::ifstream prevedono come argomento di input un puntatore nullo e vanno in crash se glielo passi e tu nel main ti limiti solo a creare un'istanza della classe (quindi a richiamare il costruttore).
  • Re: Core dump creato da un file non trovato (?)

    Ho provato a compilarlo con ./nome_eseguibile input nomefile.txt e non funziona, ci sono sempre tre parole nella linea di comando ma niente, anche se ne aggiungo altre non cambia la situazione. Sai per caso se fosse possibile aggiungere qualche comando per forzarmi un errore ed evitare di dover riavviare il sistema operativo o se mi converrebbe provare a compilarlo su windows con programmi tipo codeblock o simili ??
  • Re: Core dump creato da un file non trovato (?)

    Che io sappia non esistono switch del genere. Puoi mettere -Wall -pedantics ma si limitano a degli warning.
    Puoi provare a circoscrivere il problema forzando le variabili:
    
    
    int main( int argc, char* argv[] ) {
    
    try {
      // create data source
      EventSource* es;
      const string type = "input";
      if ( type == "input" ) {
        const string name = "nomefile.txt";
        es = new EventReadFromFile( name );
      }
      else {
        cout << "invalid keyword" << endl;
        return 0;
      }
    } catch(std::exception& e)
        cout << e.what() << endl;
    }
    
    Se non hai errori significa che per qualche motivo argv[1] o argv[2] non sono correttamente inizializzati (o NULL).
    Può darsi che venga lanciata una std::bad_alloc (ipotesi remota ma possibile), ma non impalla il SysOp.
  • Re: Core dump creato da un file non trovato (?)

    Ho provato a circoscrivere il problema come mi hai suggerito ma il risultato è lo stesso, nel caso sia una std::bad_alloc come potrei trovarla?
    PS: grazie per il disturbo comunque.
  • Re: Core dump creato da un file non trovato (?)

    Il main che ti ho postato ha l'intercettazione della std::bad_alloc, ma il tuo main si limita a quanto hai postato o prosegue?
  • Re: Core dump creato da un file non trovato (?)

    Prosegue con altre cose che però fanno quello che devono fare e non danno problemi.
    Piuttosto il problema potrebbe essere quando vado a leggere il file di tipo testo con il read?
    Di solito uso l' operatore '>>' ma nella classe non me lo riconosce.
  • Re: Core dump creato da un file non trovato (?)

    Prosegue con altre cose che però fanno quello che devono fare e non danno problemi.
    Ci metteresti la mano sul fuoco?
    Piuttosto il problema potrebbe essere quando vado a leggere il file di tipo testo con il read?
    Certo che si, però se non mostri il main completo (o non dici che poi vai a leggere il file), eventuali risposte devono basarsi sul codice che si ha a disposizione. Nello specifico se il tuo main fosse stato tipo:
    
    int main( int argc, char* argv[] ) {
    
      // create data source
      EventSource* es;
      const string type = argv[1];
      if ( type == "input" ) {
        const string name = argv[2];
        es = new EventReadFromFile( name );
      }
      else {
        cout << "invalid keyword" << endl;
        return 0;
      }
      Event ev* = es->readfile(); // 
      ev->get(); // qui se l'ifstream è chiuso ev == NULL
    }
    
    si sarebbe capito subito che se argv[2] contiene un nome di un file che non esiste, ogni successiva operazione su ifstream fallisce.Di conseguenza la readfile() restituisce un NULL e quell' e->get() messo da me (come esempio), viene effettuato su un puntatore non valido -> crash.
    Ma se non metti una esplicita chiamata alla readfile(), tutto il codice della classe a eccezione del costruttore nemmeno lo considero e nel tuo main originale tale chiamata non c'è.
  • Re: Core dump creato da un file non trovato (?)

    int main( int argc, char* argv[] ) {
    
      // create data source
    try{
      EventSource* es;
      const string type = argv[1];
      if ( type == "input" ) {
       // const string name = argv[2];
     const string name = "pdu1.txt";
        es = new EventReadFromFile( name );  
     //es = new EventReadFromFile( name );
      }
      else
      if ( type == "sim" ) { // simula degli eventi con cui fa le stesse operazioni del caso in cui vengano prese da file 
        const string nevt = argv[2];
        const string seed = ( argc > 3 ? argv[3] : "1" );
        stringstream sstr;
        unsigned int n;
        sstr.str( nevt );
        sstr >> n;
        sstr.clear();
        unsigned int s;
        sstr.str( seed );
        sstr >> s;
        es = new EventSim( n, s );
      }
      else {
        cout << "invalid keyword" << endl;
        return 0;
     }
    
     
    
      // create a list of analyzers
      vector<AnalysisSteering*> aList;
    
      // create object to dump event
      // and store into list of analyzers
      aList.push_back( new EventDump );
    
      // create object to compute mean and rms energies
      // and store into list of analyzers
      aList.push_back( new ParticleMass );
    
      // variables to loop over analyzers
      int l = aList.size();
      int i;
    
      // initialize all analyzers
      for ( i = 0; i < l; ++ i ) aList[i]->beginJob();
    
      // loop over events
      const Event* ev;
      while ( ( ev = es->get() ) != 0 ) {
        for ( i = 0; i < l; ++ i ) aList[i]->process( *ev );
        delete ev;
      }
    
      // finalize all analyzers
      for ( i = 0; i < l; ++ i ) aList[i]->endJob();
    
      return 0;
    
    	} catch(std::exception& e)
    	{cout<< e.what()<<endl;
    }} 
    il main è questo, praticamente la parte in cui digito sim viene eseguita per bene, quindi sono sicuro che il problema sia in quello che riguarda l' input da file, per questo non ho postato tutto il codice. Forse son stato poco chiaro scusami.
  • Re: Core dump creato da un file non trovato (?)

    I puntini di sospensione rappresentano una continuazione?
    
      // read an event
    const Event* EventReadFromFile::readFile() {
        Event* q = 0; //pointer to object, fortemente consigliato porlo a NULL.
        int j =0;// event id
        if( ifi->read(reinterpret_cast<char*>( &j ),sizeof(j)) ) {/*se apre il file creo nuovo evento, altrimenti ritorno 0 */
            float a,b,c;
            a=b=c=0.0;// event coordinates
            ifi->read(reinterpret_cast<char*>( &a ),sizeof(a));
            q=new Event(j,a) ; 
            // return q? 
        } else { 
            cout<<"houston abbiamo un problema"<<endl;
            return 0 ;
       }
    ... // e questi?
    
    non è che hai semplicemente dimenticato un
    return q da qualche parte?
  • Re: Core dump creato da un file non trovato (?)

    I puntini li avevo messi perchè seguono altre operazioni uguali, il return c'è , adesso la metto intera:
     #include "Event.h"
    #include <iostream>
    #include <fstream>
    #include <string>
    #include "EventReadFromFile.h"
    
    using namespace std;
    
    // read data from file "name"
    EventReadFromFile::EventReadFromFile( const string& name ) {
    if (name!="") {ifi = new ifstream( name.c_str());} 
    else {cout<<"che cazz";};
    }
    
    
    EventReadFromFile::~EventReadFromFile() {
      delete ifi;
    }
    
    
    // get an event
    const Event* EventReadFromFile::get() {
      return readFile();
    }
    
    
      // read an event
    const Event* EventReadFromFile::readFile() {
    Event* q ;//pointer to object
    int j =0;// event id
    if( ifi->read(reinterpret_cast<char*>( &j ),sizeof(j)) ) {/*se apre il file creo nuovo evento, altrimenti ritorno 0 */
    
    
    float a,b,c; 
    a=b=c=0.0;// event coordinates
    ifi->read(reinterpret_cast<char*>( &a ),sizeof(a)); // è il modo giusto per leggere un file txt ??
    ifi->read(reinterpret_cast<char*>( &b ),sizeof(b));
    ifi->read(reinterpret_cast<char*>( &c ),sizeof(c));
    /*ifi>>a; //perchè non va ?
    ifi>>b;
    ifi>>c;*/
    
    
    q=new Event(j,a,b,c) ;   //modificare questo? 
    }
    else {cout<<"houston abbiamo un problema"<<endl;
    return 0 ;
    }
    
    int l=0;
     //read number of particle
    ifi->read(reinterpret_cast<char*>( &l ),sizeof(l));
    
    int charge = 0 ;
    float p1,p2,p3 ;
    p1=p2=p3=0.0;
    
    for(int i =0;i<l ;++i){ // add a particle 
    ifi->read( reinterpret_cast<char*>( &charge ), sizeof( charge ) );
    ifi->read( reinterpret_cast<char*>( &p1     ), sizeof( p1     ) );
    ifi->read( reinterpret_cast<char*>( &p2     ), sizeof( p2     ) );
    ifi->read( reinterpret_cast<char*>( &p3     ), sizeof( p3     ) );
    
    q->add(p1,p2,p3,charge);
    }
    return q;
    }
       
  • Re: Core dump creato da un file non trovato (?)

    Ok, onestamente mi era sfuggito il fatto che a linea di comando inviavi un file.txt, ma dalla descrizione del problema mi aspettavo qualche puntatore impazzito.
    // è il modo giusto per leggere un file txt ??
    No, non lo è. Almeno nell'accezione comune. In quel modo si leggono i file binari.
    /*ifi>>a; //perchè non va ?
    Precedenza degli operatori. Dev'essere:
    
    (*ifi) >>a;
    
    ma è un po' scomodo. Potresti modificare la funzione in questo modo:
    
    // read an event
    const Event* EventReadFromFile::readFile() {
    	Event* q;//pointer to object
    	int j = 0;// event id
    	if (!ifi->good()) {
    		cout << "houston abbiamo un problema" << endl;
    		return 0;
    	}
    
    	std::ifstream& in = *ifi; // utilizzi un alias e procedi come sempre.
    	in >> j;
    	float a, b, c;
    	a = b = c = 0.0;// event coordinates
    
    	in >> a >> b >> c;
    	q = new Event(j, a);
    
    	int l = 0;
    	//read number of particle
    	in >> l;
    
    	int charge = 0;
    	float p1, p2, p3;
    	p1 = p2 = p3 = 0.0;
    
    	for (int i = 0; i < l; ++i) { // add a particle
    		in >> charge >> p1 >> p2 >> p3;
    		q->add(p1, p2, p3, charge);
    	}
    	return q;
    }
    
    Meglio ancora sarebbe dichiarare ifi non come puntatore ma come oggetto e aprire il file con la classica .open(). Ti risparmi il corpo del distruttore, l'alias nella funzione su riportata e puoi scrivere ifi >> etc...
    Ho testato il codice creando un file con i campi intuiti dalla sequenza di lettura e funziona tutto. Eventualmente posta un paio di righe del file in questione se hai ancora problemi.
  • Re: Core dump creato da un file non trovato (?)

    Grazie mille ora funziona, gentilissimo.
Devi accedere o registrarti per scrivere nel forum
14 risposte