Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Borderlands 4, tra divertimento e problemi tecnici
Recensione Borderlands 4, tra divertimento e problemi tecnici
Gearbox Software rilancia la saga con Borderlands 4, ora disponibile su PS5, Xbox Series X|S e PC. Tra le novità spiccano nuove abilità di movimento, un pianeta inedito da esplorare e una campagna che lascia al giocatore piena libertà di approccio
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
NXTPAPER 60 Ultra è il primo smartphone con tecnologia NXTPAPER 4.0 per il display, un ampio IPS da 7,2 pollici. Con finitura anti-riflesso, processore MediaTek Dimensity 7400, fotocamera periscopica e modalità Max Ink per il detox digitale, NXTPAPER 60 Ultra punta a essere il riferimento tra gli smartphone pensati per il benessere degli occhi.
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Questo mouse ultraleggero, con soli 36 grammi di peso, è stato concepito per offrire un'esperienza di gioco di alto livello ai professionisti degli FPS, grazie al polling rate a 8.000 Hz e a un sensore ottico da 33.000 DPI. La recensione esplora ogni dettaglio di questo dispositivo di gioco, dalla sua agilità estrema alle specifiche tecniche che lo pongono un passo avanti
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: 6263
[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: 6263
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: 6263
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: 6263
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


Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale TCL NXTPAPER 60 Ultra: lo smartphone che trasfor...
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza Sottile, leggero e dall'autonomia WOW: OPPO Reno...
La Cina sorprende tutti: annunciato il p...
Samsung Galaxy S26 Ultra: la ricarica sa...
Disagi al traffico aereo europeo: le ind...
Intel in crisi chiama Apple: un riavvici...
Snapdragon X2 Elite Extreme, il cuore de...
Snapdragon 8 Elite Gen 5 è il nuovo rife...
Bombe Apple su Amazon: iPhone di scorsa ...
Micron: memoria HBM4 a 11 Gbps e patto d...
NVIDIA rende Audio2Face open source: ecc...
Logitech Signature Slim Solar K980+: 10 ...
Disney Plus aumenta i prezzi: si parte d...
Intel XeSS con Multi Frame Generation: u...
iPhone 16 a soli 700€ su Amazon: stile e...
Signature Slim Solar+ K980, la nuova tas...
Logitech MX Master 3S, il mouse perfetto...
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: 07:07.


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