PDA

View Full Version : [c]Leggere stringa da file con spazi


MisterW2
21-06-2002, 01:02
Salve a tutti,
un piccolo aiutino...
Come posso leggere una stringa da file del tipo:
c:\documents and settings\cartella\file.ext

senza che mi si fermi allo spazio e senza sapere la sua lunghezza a priori? (cosa che fa fgets e scanf)?

Grazie per l'aiuto

cionci
21-06-2002, 10:23
Mmmmhhh...mi sembra che fgets legga fino alla fine della linea (o fino alla dimensione specificata) e non si fermi sugli spazi...

MisterW2
21-06-2002, 12:48
si infatti mi sono espresso male, ma fgets ha lo svantaggio di prendere anche il codice di fine riga, e se poi passo questa path che ho memorizzata su un buffer mi dice che non è valida (perchè ha il fine riga compreso) e non sapendo la size della path a priori imposto un fgets mettiamo di 100 caratteri per essere sicuro di prenderla tutta, ma poi prendo anche il \n
Come risolvo sta rogna?

MisterW2
21-06-2002, 13:04
Ho risolto in un modo orribile...

Char *cImagePath;
cImagePath = new char[100];
fscanf (pfVTCPara, "%[^@]", cImagePath);

Avendo memorizzato la stringa nella forma:
c:\documents and settings\cartella\file.ext@

ossia con un carattere @ che appena lo incontra si ferma.... esiste un modo decisamente più carino?
Mi domando perchè ogni tanto il c++ è così poco flessibile.. bah!

cionci
21-06-2002, 13:41
Originariamente inviato da MisterW2
[B]Ho risolto in un modo orribile...

Char *cImagePath;
cImagePath = new char[100];
fscanf (pfVTCPara, "%[^@]", cImagePath);

Avendo memorizzato la stringa nella forma:
c:\documents and settings\cartella\file.ext@

ossia con un carattere @ che appena lo incontra si ferma.... esiste un modo decisamente più carino?
Mi domando perchè ogni tanto il c++ è così poco flessibile.. bah!
Il modo più semplice è questo, basta mttere un buffer molto grande (oltre MAX_PATH il nome del file non può essere lungo) :

char file[MAX_PATH + 1];

//apri il file
if(fgets(file, MAX_PATH, f);)
{
if(file[strlen(file)-1] != '\n')
//errore il nome del file è troppo lungo
else
{
file[strlen(file)-1] = '\0';
//fai quello che devi fare con il nome del file
}
}
//chiudi il file

Questo procedimento è corretto...anche perchè evita buffer overflow...
Mentre la fscanf non li evita...

PS : al posto della @ potresti mettere \n...almeno non dovresti cambiare il contenuto del file...

MisterW2
21-06-2002, 13:58
Grazie ora funziona... sei un mito ;)

cionci
21-06-2002, 15:49
Bene :)