PDA

View Full Version : [C++]: comportamento anomalo


bob80
19-04-2008, 10:02
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

cionci
19-04-2008, 11:41
Puoi postare lo spezzone di codice ?

bob80
19-04-2008, 15:18
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();

}

cionci
19-04-2008, 16:04
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.

bob80
19-04-2008, 16:41
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?