Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    7

    C++: anomalo comportamento

    Ciao a tutti,
    sono all'inizio di un progetto e come fase iniziale devo prendere dei dati da tre file.
    Ho scritto delle classi e implementato un po' di metodi e tutto funziona ma solo in debug. Quando faccio il build completo e lancio l'eseguibile creato non funziona tutto come dovrebbe. In particolare il primo file viene aperto e letto correttamente mentre gli altri due sembra come se fossero rimasti chiusi.
    Il comando che uso per aprire i file è
    ifstream file(stmp.c_str());
    (per il primo file cioè all'atto della dichiarazione della variabile file)
    e poi uso, dopo aver fatto i dovuti close,
    file.open(stmp.c_str());
    per aprire gli altri due file.
    Tutto cioò in fase di debug funziona, quando lacio l'eseguibile invece legge solo il primo file.
    Sto sviluppando con Visual c++ 2005 express edition ma lo stesso comportamento lo si ha con visual studio 6.0.
    Fatemi sapere.
    Grazie intanto per l'attenzione.
    Saluti,
    Roberto

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Devi mostrare tutto il codice non solo quelle due linee che non dicono nulla ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    7
    Volevo evitare, ma se proprio volete eccolo qui:

    void CIstanza::getData(COptions options) {

    int i = 0;
    int dimension;
    int tmp;
    char * ctmp;
    string linea;

    string stmp("./");

    stmp.append(options.sFileCorse);

    ifstream file(stmp.c_str());

    file >> dimension;

    corse.trips = new CTrip[dimension];

    while (i<dimension)
    {
    file >> corse.trips[i].sCode;
    file >> corse.trips[i].iReferenceDay;
    file >> corse.trips[i].sStartingTime;
    file >> corse.trips[i].sEndingTime;
    file >> corse.trips[i].sStartingPlace;
    file >> corse.trips[i].sEndingPlace;
    file >> corse.trips[i].sVehicleType;
    file >> corse.trips[i].sDuty;
    file >> corse.trips[i].sLine;
    file >> corse.trips[i].iFlag_50km;
    file >> corse.trips[i].iOneWayReturn;
    file >> tmp;

    cout << corse.trips[i].sCode<<" ";
    cout << corse.trips[i].iReferenceDay<<" ";
    cout << corse.trips[i].sStartingTime << " ";
    cout << corse.trips[i].sEndingTime<<" ";
    cout << corse.trips[i].sStartingPlace<<" ";
    cout << corse.trips[i].sEndingPlace<<" ";
    cout << corse.trips[i].sVehicleType<<" ";
    cout << corse.trips[i].sDuty<<" ";
    cout << corse.trips[i].sLine<<" ";
    cout << corse.trips[i].iFlag_50km<<" ";
    cout << corse.trips[i].iOneWayReturn<<endl<<" ";
    i++;
    }
    file.close();


    //lettura file 2.txt
    stmp.assign("./");
    stmp.append(options.sFileDepositiResidenze);
    file.open(stmp.c_str());
    i=0;

    dimension=0;

    file >> dimension;

    paline.busStops = new CBusStop[dimension];

    while (i<dimension)
    {
    file >> paline.busStops[i].sCode;
    file >> paline.busStops[i].sDescription;
    file >> paline.busStops[i].fReliefPoint;
    file >> paline.busStops[i].sResidenceCode;

    cout << paline.busStops[i].sCode<<" ";
    cout << paline.busStops[i].sDescription<<" ";
    cout << paline.busStops[i].fReliefPoint << " ";
    cout << paline.busStops[i].sResidenceCode<<" "<<endl;
    i++;
    }

    file.close();

    stmp.assign("./");
    stmp.append(options.sFileTratte);
    file.open(stmp.c_str());
    i=0;
    dimension = 0;
    ctmp = (char*)malloc(sizeof(char)*300);
    while(file.good())
    {
    file.getline(ctmp,300);
    dimension++;
    }
    cout << dimension;

    file.clear();

    file.seekg(0, ios::beg);

    tratte.tracks = new CTrack[dimension];

    while (i<dimension)
    {
    file >> tratte.tracks[i].sStartingPlace;
    file >> tratte.tracks[i].sEndingPlace;
    file >> tratte.tracks[i].sDuration;
    file >> tratte.tracks[i].sStartingRange;
    file >> tratte.tracks[i].sEndingRange;

    cout << tratte.tracks[i].sStartingPlace << " ";
    cout << tratte.tracks[i].sEndingPlace << " ";
    cout << tratte.tracks[i].sDuration << " ";
    cout << tratte.tracks[i].sStartingRange << " ";
    cout << tratte.tracks[i].sEndingRange << " " << endl;
    i++;
    }

    file.close();

    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da bob80
    Volevo evitare, ma se proprio volete
    Guarda che non sei obbligato ... del resto il problema e' tuo ...

    Comunque ho notato che dopo che apri il file non controlli se effettivamente e' aperto o c'e' stato un errore ... dopo la open inserisci una

    if (!file.is_open())
    cout << "open error\n" << endl;

    per controllare se c'e' un problema di questo tipo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    7
    Fatto ma il comportamento è lo stesso.
    Non entra nell'if quindi il file è aperto.
    Mah!!!

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Quando leggi la dimension con

    file >> dimension;

    ti sei accertato del suo valore?

    Dovresti fare un po' di debug ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    7
    Originariamente inviato da oregon
    Quando leggi la dimension con

    file >> dimension;

    ti sei accertato del suo valore?

    Dovresti fare un po' di debug ...
    Ho fatto molto debug e lì è tutto ok. In debug tutto è come dovrebbe essere: variabili, dati presi in input, stampe a video, ecc... tutto ok.
    Una volta lanciato l'eseguibile funziona solo una prima parte e il resto non va e non ne capisco il motivo.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Da dove non funziona?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    inserisci dei cout sullo stdout (cout << "sono prima di aprire il file\n"; etc etc) per verificare dove esattamente compare il funzionamento anomalo a run time.
    ciao
    sergio

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    7
    Risolto!
    Era la gestione dei file forse un po' strana in esecuzione.
    Ho sostituito le condizioni del while con fille.good() invece che con il controllo della dimensione e prima di fare la close faccio una clear. Probabilmente era il failbit finale che dava fastidio (me lo ricordo perchè con seekg ho perso tempo per lo stesso motivo).
    Non so se fosse strettamente necessario, ma ora funziona.
    Che ne pensate?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.