Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Abbiamo provato per una settimana intera la Can-Am Origin, la Dual Sport elettrica del gruppo canadese BRP: ecco com'è andata tra città, autostrada e un primo assaggio di sterrato
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Nelle ultime settimane abbiamo provato il mouse Logitech G305, la tastiera G316 X 98 e le cuffie G325. Si tratta del setup entry-level di Logitech che ormai, di "entry-level" ha ben poco. Tastiera e mouse offrono prestazioni di livello competitivo con quasi nessuna rinuncia e un livello di personalizzazione estremamente elevato. Le cuffie, invece, hanno mostrato qualche debolezza, ma propongono un ventaglio di funzionalità completo che consente di abbandonare completamente i cavi
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
POCO F9 Pro arriva sul mercato con l'obiettivo di portare prestazioni da smartphone top di gamma in una fascia di prezzo "più aggressiva", senza rinunciare a un comparto fotografico finalmente all'altezza. Dopo averlo testato sul campo, emerge uno smartphone molto più completo rispetto alla generazione precedente, ma anche con alcuni piccoli compromessi che diventano difficili da ignorare quando il prezzo di listino sfiora i 1.000 euro.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-06-2008, 10:33   #1
jepessen
Senior Member
 
L'Avatar di jepessen
 
Iscritto dal: Jul 2007
Città: Sicilia
Messaggi: 6836
[C++] Carico una riga fantasma

Salve a tutti.

Ho il seguente problema: ho un file di testo contenente, in ogni riga, tre numeri, ad esempio la seguente lista:

Codice:
-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:

Codice:
#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:

Codice:
 ./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.
__________________
Non abbiamo ereditato il mondo dai nostri padri
L'abbiamo preso in prestito dai nostri figli
jepessen è offline   Rispondi citando il messaggio o parte di esso
Old 01-06-2008, 11:15   #2
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Sicuramente il while viene eseguito una volta di troppo.

Nella condizione io metterei ( !infile.fail() && !infile.eof() ), dato che eof() è la funzione più adatta a trovare la fine del file...
magari fail() viene chiamato se si effettua una lettura dopo eof()... e in questa maniera hai comunque una lettura vuota a eof().

E poi io sarei partito da 0 nella numerazione, mettendo count++ alla fine. Però è questione di gusti
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 01-06-2008, 11:58   #3
jepessen
Senior Member
 
L'Avatar di jepessen
 
Iscritto dal: Jul 2007
Città: Sicilia
Messaggi: 6836
Provato, ma non funge. Legge sempre la riga vuota. Anch'io pensavo al ciclo while di troppo, ma ancora non ho trovato soluzione...

Daniele

PS: Anch'io partirei da 0 per il conteggio, ma poi devo elaborare e salvare in un formato dove l'ID parte da 1, quindi mi adeguo.
__________________
Non abbiamo ereditato il mondo dai nostri padri
L'abbiamo preso in prestito dai nostri figli
jepessen è offline   Rispondi citando il messaggio o parte di esso
Old 01-06-2008, 13:02   #4
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
il problema e' che finche' il test iniziale ti da il risultato dell'ultima lettura, non quella di quella che stai per fare. Questo e' in particolare vero se hai un linea vuota alla fine: finche' non provi a leggere un nuovo valore il codice non si accorge che sei arrivato alla fine.
La soluzione corretta e' provare a leggere i tre valori, e _dopo_ verificare se c'e' stato un errore in lettura e in tal caso interrompere il loop, senza ovviamente salvare l'ultima lettura.

potresti sostituire il seguente codice
Codice:
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;
con qualcosa del tipo
Codice:
double x,y,z;
while ( infile >> x >> y >> z )
{
	count++;
	plist_temp = plist;
	plist = new struct point;
			
	// Memorizzazione dei valori
	plist->coords.x = x;
	plist->coords.y = y;
	plist->coords.z = z;
/* ... */
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 01-06-2008, 13:18   #5
jepessen
Senior Member
 
L'Avatar di jepessen
 
Iscritto dal: Jul 2007
Città: Sicilia
Messaggi: 6836
Grazie, hai risolto il mio problema... Ti devo una birrozza...

Daniele
__________________
Non abbiamo ereditato il mondo dai nostri padri
L'abbiamo preso in prestito dai nostri figli
jepessen è offline   Rispondi citando il messaggio o parte di esso
Old 01-06-2008, 13:19   #6
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Suggerimento 2, togli tutti quei commenti inutili .
Penso sia abbastanza chiaro che "double x" e' la coordinata x e che count++ incrementa il contatore. Se a qualcuno non risultasse chiaro, spero cambi mestiere in breve tempo

Suggerimento 3. Utilizza un contenitore standard per salvare i tuoi punti. A seconda dell'uso, un vector<> o una list<> dovrebbero fare al caso tuo. Anche perche' nel caso sopra mescoli informazioni relative al contenitore in se(il puntatore a next) con informazioni relative al punto (il suo id)
Meglio ancora se aggiungi i costruttori alle strutture
Ritengo piu' sensato qualcosa del genere:

Codice:
struct coordinates
{
    coordinates( double _x, double _y, double _z):x(_x),y(_y),z(_z){}
    double x; /**< Coordinata x */
    double y; /**< Coordinata y */
    double z; /**< Coordinata z */
};

struct point
{
    point( double x, double y, double x,long _id):id(_id),coords(x,y,z){}
    long int id;               /**< ID del punto */
    struct coordinates coords; /**< Coordinate del punto */
};

std::list<point> pointList;

/* ... */

 if (infile)
    {
        double x,y,z;
        while ( infile >> x >> y >> z )
        {
            pointList.push_back( point(x,y,z, pointList.size() + 1) );
            const point& p = pointList.back();
            std::cout << "punto n. " << pointList.size() << ":  " << p.coords.x <<
                " " << p.coords.y << " " <<p.coords.z << std::endl;
			
			
        }
		
        std::cout << "Il numero di numeri letti e' " << pointList.size() << std::endl;
		
    }
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 01-06-2008, 13:27   #7
jepessen
Senior Member
 
L'Avatar di jepessen
 
Iscritto dal: Jul 2007
Città: Sicilia
Messaggi: 6836
Ok, farò tesoro dei tuoi consigli.

Daniele
__________________
Non abbiamo ereditato il mondo dai nostri padri
L'abbiamo preso in prestito dai nostri figli
jepessen è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia) Test ride Can-Am Origin: la moto elettrica che f...
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco Logitech G325, G305 e G316 X: il tris per chi no...
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio Recensione POCO F9 pro: potenza da vero top di g...
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
Carburanti, dopo Eni anche IP annuncia u...
HEO Space ha rilasciato una nuova immagi...
La missione Artemis III sarebbe in ritar...
Apple apre Music Hall, una sala concerto...
Adobe arriva su Gemini e Claude: nuove f...
Non solo Fideuram: quasi 2 milioni di it...
I lettori CD di fascia alta potrebbero s...
Tutto il meglio di Amazon weekend: 5 nov...
Proscenic P15+ a 113€ su Amazon: scopa e...
TP-Link Wi-Fi 6 a 59,99€ e Tenda 4G03 Pr...
Un quasi top di gamma a 461€: lo smartph...
Roborock Saros 20 Neo e Flow Complete: 3...
Mac mini si trasforma: chip a 2 nanometr...
Su Amazon c'è un super TV Samsung...
La Cina ha rilasciato un satellite dallo...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:48.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v