Newsgroup: it.comp.lang.c++
Titolo: Leggere un valore in un file

Ciao a tutti!
Sono un ....o meglio non sono un programmatore, sono uno che ci prova.
Avrei bisogno di un aiuto per fare una cosa, che per il 99% di voi è sicuramente semplicissima.
Io ho un file di testo così formattato :
H/L	500	600	700	800	900	1000	1100	1200	1300	1400	1500
500	10	20	40	80	160	320	640	641	642	643	644
600	20	40	80	160	320	640	1280	1281	1282	1283	1284
700	30	60	120	240	480	960	1920	1921	1922	1923	1924
800	40	80	160	320	640	1280	2560	2561	2562	2563	2564
900	50	100	200	400	800	1600	3200	3201	3202	3203	3204
1000	60	120	240	480	960	1920	3840	3841	3842	3843	3844
1100	70	140	280	560	1120	2240	4480	4481	4482	4483	4484
1200	80	160	320	640	1280	2560	5120	5121	5122	5123	5124
1300	90	180	360	720	1440	2880	5760	5761	5762	5763	5764
1400	100	200	400	800	1600	3200	6400	6401	6402	6403	6404
1500	110	220	440	880	1760	3520	7040	7041	7042	7043	7044
In pratica sulla prima riga c'è la larghezza e nella prima colonna l'altezza.
Ora, in base a l'altezza e la larghezza che io inputo il programma dovrebbe aprire il file, prendere il valore corretto e ridarmelo indietro.
Naturalmente ho alcuni vincoli, per esempio se lalrghezza (ma anche l'altezza) è 1050 deve prendermi la colonna del 1000, se invece
è 1051 deve prendermi la colonna del 1100.
E con le righe è lo stesso.
Ho scritto una funzione, che probabilmente è una robaccia mostruosa che fare rivoltare nella tomba l'inventore del microprocessore
però se un anima buona me la controllasse un' attimo....io sarei felice!
Sono riuscito a leggere il valore...però non ho ben capito come fare in modo che se supera la metà(1050) va nella colonna e nella riga dopo
soprattutto senza che si pianti tutto (come succede ora) quando inputo una misura che non c'è, per es. 1600
Grazie !
double CLeggiListini::TrovaPrezzo(HWND hWnd,CString Nomefile,double L,double H)
{
	int colonna=0;
	int riga=0;
    	FILE *stream;
    	char s[4+1]="";
	char p[4+1]="";
	signed int indietro=0;
	int lungh =0;
	int r=0;
	int c=0;
//trovo la colonna giusta
stream = fopen(Nomefile, "r");
fscanf (stream,"%4s",s);
    while (!(getc(stream)=='\n'))//(!feof(stream))
    {
	fscanf (stream,"%4s",s);
	colonna++;
	fscanf (stream,"%4s",p);
	lungh = sizeof(p);
	indietro = lungh *(-1);
	fseek(stream,indietro,SEEK_CUR);
	if (atoi(s)>L && L<atoi(p))
	{
		colonna--;
		break;
	}
    }
	fclose (stream);
	indietro=0;
	lungh =0;
	CString tmp;
	short nr=0;
	//Trovo la riga giusta
	stream = fopen(Nomefile, "r");
	fscanf (stream,"%4s",s);
	while (!(feof(stream)))
	{
	if ((getc(stream)=='\n'))//(!feof(stream))
		{
			fscanf(stream,"%4s",s);
			riga++;
			while ((getc(stream)!='\n'))
			{
				fscanf(stream,"%4s",s);
				nr++;
			}
				fscanf(stream,"%4s",p);
				indietro = -10;
				fseek(stream,indietro,SEEK_CUR);
			//Troviamo il prezzo ora!
			if (atoi(s)>H && H<atoi(p))
			{
				colonna++; // non so perchè di questo ma così viene giusto!
				rewind(stream);
				while (!(feof(stream)))
				{
					while (r!=riga)
					{
						if (getc(stream)=='\n')
						r++;
					}
					while (c!=colonna)
					{
						fscanf(stream,"%4s",s);
						c++;
					}
					break;
				}break;
			}
		}
	}
	fclose(stream);
return atof(s);
}

 soprattutto senza che si pianti tutto (come succede ora) quando inputo una misura che non c'è, per es. 1600
Per prima cosa inizia a valutare che contenitore userai per i dati.
Tanto per sveltire diciamo che la struttura é
struct Dato {
  int X;
  int Y;
  int Val;
}
memorizzata in un vector<Dato>.
A questo punto puoi usare find_if per trovare il dato. Come predicato ti basta
una funzione che controlli che la distanza del punto richiesto da X e Y sia 
< 100.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! Asynchronous inputs are at the root of our race problems. !>-
                 D. Winker and F. Prosser