Torna indietro   Hardware Upgrade Forum > Software > Programmazione

BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX ha portato sul mercato Picco, un e-reader da 3,97 pollici che pesa 58 grammi e si aggancia al retro dello smartphone con un anello magnetico. Lo abbiamo usato con Pixel 11 Pro XL e iPhone 18 Pro per capire se un formato così ridotto regga la prova della lettura quotidiana
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
A Las Vegas AMD ha svelato i dettagli architetturali delle CPU EPYC di sesta generazione, note con il nome in codice Venice. Nuovi core Zen 6 e Zen 6c costruiti a 2 nanometri, fino a 256 core per socket, 16 canali di memoria, interfaccia PCI Express 6.0 e un'intera famiglia di proposte che va da Venice SP7 a Verano. Senza dimenticare la memoria, oggi la voce di costo più pesante in un server: AMD risponde con CXL 3.1 e con la tecnologia software MEXT, che porta la memoria flash dentro la gerarchia della DRAM.
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max mette un pannello IPS da 13 pollici con risoluzione 2,5K e refresh a 120 Hz davanti a una batteria da 10.100 mAh e a quattro altoparlanti. Il listino parte da 399,90 euro, per un progetto molto chiaro e ambizioso: schermo ampio, buon audio e giornate lontano dalla presa, a un prezzo che non pesa sul portafoglio
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-06-2008, 11:33   #1
jepessen
Senior Member
 
L'Avatar di jepessen
 
Iscritto dal: Jul 2007
Città: Sicilia
Messaggi: 6902
[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, 12: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, 12:58   #3
jepessen
Senior Member
 
L'Avatar di jepessen
 
Iscritto dal: Jul 2007
Città: Sicilia
Messaggi: 6902
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, 14: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, 14:18   #5
jepessen
Senior Member
 
L'Avatar di jepessen
 
Iscritto dal: Jul 2007
Città: Sicilia
Messaggi: 6902
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, 14: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, 14:27   #7
jepessen
Senior Member
 
L'Avatar di jepessen
 
Iscritto dal: Jul 2007
Città: Sicilia
Messaggi: 6902
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


BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone BOOX Picco: l'ebook reader minuscolo è un...
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria AMD EPYC Venice: dentro Zen 6, i SoC a 256 core ...
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro HONOR Pad X9 Max recensione, schermo ultra large...
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro Jabra Evolve3 85: le cuffie sia per l'intratteni...
Chi può sostituire Jensen Huang a...
Rilasciati i primi dati raccolti dal tel...
Leica M-A Hammertone e Leica M11-P Hamme...
L'IA non sostituisce la creatività...
Anche Formula E cambia il calendario per...
Defender contro BYD Ti 7: il giudice d&a...
32GB di RAM DDR4 a un prezzo sorprendent...
La nuova lavagna interattiva di LG arriv...
Lo smartphone Samsung passa da 16:9 a 21...
OPPO Pad 5 Pro arriva in Italia: display...
80 TOPS in un palmo di mano: il nuovo Mi...
Motorola Razr Flex: il pieghevole che sf...
NVIDIA, Jensen Huang lascia dopo lo scan...
Honor 700 Pro con Snapdragon 8 Gen 5 e 1...
Dentro una macchina del caffè c'&...
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: 22:06.


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