jepessen
01-06-2008, 10:33
Salve a tutti.
Ho il seguente problema: ho un file di testo contenente, in ogni riga, tre numeri, ad esempio la seguente lista:
-0.01975 0.185617 -0.0153931
-0.01925 0.185622 -0.0159337
-0.01875 0.185626 -0.0164744
-0.01825 0.185633 -0.0172854
-0.01775 0.185639 -0.0179612
-0.01725 0.185647 -0.0189073
-0.01675 0.185653 -0.0195831
Ogni riga rappresenta un punto nello spazio 3D, così, per caricare i valori, mi creo la struttura point e li carico lì, assieme ad un intero che fa da ID del punto. Qua sotto c'è il codice sorgente:
#include <iostream>
#include <fstream>
int main (int argc, char** argv)
{
struct coordinates
{
double x; /**< Coordinata x */
double y; /**< Coordinata y */
double z; /**< Coordinata z */
};
/** \struct point
* La struttura contiene informazioni generali su un punto, ovvero le sue
* coordinate, un identificativo numerico e la lista dei suoi descrittori.
*/
struct point
{
long int id; /**< ID del punto */
struct coordinates coords; /**< Coordinate del punto */
struct point *next; /**< Puntatore al prossimo elemento */
};
struct point *plist, *plist_temp;
std::ifstream infile;
long int count = 0;
plist = NULL;
plist_temp = NULL;
// Apertura file
infile.open(argv[1], std::ios::in);
// Lettura dei dati nel caso il file sia aperto con successo
if (infile)
{
while (!infile.fail())
{
// Incremento del contatore
count++;
// Creazione del nuovo elemento in testa
plist_temp = plist;
plist = new struct point;
// Memorizzazione dei valori
infile >> plist->coords.x;
infile >> plist->coords.y;
infile >> plist->coords.z;
// Memorizzazione del contatore
plist->id = count;
// inserimento dell'elemento della lista
plist->next = plist_temp;
// Scrittura a schermo dei valori
std::cout << "punto n. " << count << ": " << plist->coords.x <<
" " << plist->coords.y << " " <<plist->coords.z << std::endl;
}
std::cout << "Il numero di numeri letti e' " << count << std::endl;
plist_temp = plist;
plist = plist->next;
delete plist_temp;
}
else
{
std::cout << "Errore nella lettura deil file\n";
}
infile.close();
return 0;
}
Lo compilo con g++ -Wall test.c.
Tuttavia, se lo eseguo, ottengo il seguente output:
./a.out file_con_punti
punto n. 1: -0.01975 0.185617 -0.0153931
punto n. 2: -0.01925 0.185622 -0.0159337
punto n. 3: -0.01875 0.185626 -0.0164744
punto n. 4: -0.01825 0.185633 -0.0172854
punto n. 5: -0.01775 0.185639 -0.0179612
punto n. 6: -0.01725 0.185647 -0.0189073
punto n. 7: -0.01675 0.185653 -0.0195831
punto n. 8: 0 0 0
In pratica alla fine accoda un punto in più, con coordinate tutte nulle. Ora, per il lavoro non è un grosso problema, dato che alla fine cancello il punto in più e pace fatta, ma non mi sembra un modo pulito per fare le cose.
Per sicurezza, ho provato a modificare il file contenente i punti, aggiungendo delle righe vuote, oppure senza nessuna riga vuota alla fine ma con spazi dopo l'ultima cifra dell'ultimo numero, ed infine terminando il file esattamente subito dopo l'ultima cifra dell'ultimo numero, ma il risultato non cambia, ho sempre la presenza del punto 'fantasma' che non ci dovrebbe essere.
Come posso modificare il programmino in maniera tale che non legga l'ultimo punto inesistente?
Daniele
PS: Utilizzo g++ (GCC) versione 4.2.3.
Ho il seguente problema: ho un file di testo contenente, in ogni riga, tre numeri, ad esempio la seguente lista:
-0.01975 0.185617 -0.0153931
-0.01925 0.185622 -0.0159337
-0.01875 0.185626 -0.0164744
-0.01825 0.185633 -0.0172854
-0.01775 0.185639 -0.0179612
-0.01725 0.185647 -0.0189073
-0.01675 0.185653 -0.0195831
Ogni riga rappresenta un punto nello spazio 3D, così, per caricare i valori, mi creo la struttura point e li carico lì, assieme ad un intero che fa da ID del punto. Qua sotto c'è il codice sorgente:
#include <iostream>
#include <fstream>
int main (int argc, char** argv)
{
struct coordinates
{
double x; /**< Coordinata x */
double y; /**< Coordinata y */
double z; /**< Coordinata z */
};
/** \struct point
* La struttura contiene informazioni generali su un punto, ovvero le sue
* coordinate, un identificativo numerico e la lista dei suoi descrittori.
*/
struct point
{
long int id; /**< ID del punto */
struct coordinates coords; /**< Coordinate del punto */
struct point *next; /**< Puntatore al prossimo elemento */
};
struct point *plist, *plist_temp;
std::ifstream infile;
long int count = 0;
plist = NULL;
plist_temp = NULL;
// Apertura file
infile.open(argv[1], std::ios::in);
// Lettura dei dati nel caso il file sia aperto con successo
if (infile)
{
while (!infile.fail())
{
// Incremento del contatore
count++;
// Creazione del nuovo elemento in testa
plist_temp = plist;
plist = new struct point;
// Memorizzazione dei valori
infile >> plist->coords.x;
infile >> plist->coords.y;
infile >> plist->coords.z;
// Memorizzazione del contatore
plist->id = count;
// inserimento dell'elemento della lista
plist->next = plist_temp;
// Scrittura a schermo dei valori
std::cout << "punto n. " << count << ": " << plist->coords.x <<
" " << plist->coords.y << " " <<plist->coords.z << std::endl;
}
std::cout << "Il numero di numeri letti e' " << count << std::endl;
plist_temp = plist;
plist = plist->next;
delete plist_temp;
}
else
{
std::cout << "Errore nella lettura deil file\n";
}
infile.close();
return 0;
}
Lo compilo con g++ -Wall test.c.
Tuttavia, se lo eseguo, ottengo il seguente output:
./a.out file_con_punti
punto n. 1: -0.01975 0.185617 -0.0153931
punto n. 2: -0.01925 0.185622 -0.0159337
punto n. 3: -0.01875 0.185626 -0.0164744
punto n. 4: -0.01825 0.185633 -0.0172854
punto n. 5: -0.01775 0.185639 -0.0179612
punto n. 6: -0.01725 0.185647 -0.0189073
punto n. 7: -0.01675 0.185653 -0.0195831
punto n. 8: 0 0 0
In pratica alla fine accoda un punto in più, con coordinate tutte nulle. Ora, per il lavoro non è un grosso problema, dato che alla fine cancello il punto in più e pace fatta, ma non mi sembra un modo pulito per fare le cose.
Per sicurezza, ho provato a modificare il file contenente i punti, aggiungendo delle righe vuote, oppure senza nessuna riga vuota alla fine ma con spazi dopo l'ultima cifra dell'ultimo numero, ed infine terminando il file esattamente subito dopo l'ultima cifra dell'ultimo numero, ma il risultato non cambia, ho sempre la presenza del punto 'fantasma' che non ci dovrebbe essere.
Come posso modificare il programmino in maniera tale che non legga l'ultimo punto inesistente?
Daniele
PS: Utilizzo g++ (GCC) versione 4.2.3.