|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jun 2006
Messaggi: 22
|
[C++]: comportamento anomalo
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 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Puoi postare lo spezzone di codice ?
|
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Jun 2006
Messaggi: 22
|
Eccolo.
Saluti :-) 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 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Prova usando tre fstream. Sinceramente non mi è mai capitato di riaprire un fstream.
Sembra comunque che sia legale: "The file to be associated with the stream can be specified either as a parameter in the constructor or by calling member open. After all necessary operations on a file have been performed, it can be closed (or disassociated) by calling member close. Once closed, the same file stream object may be used to open another file." Molto strano. Ultima modifica di cionci : 19-04-2008 alle 16:06. |
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Jun 2006
Messaggi: 22
|
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 pensi? |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:00.