» »

[C++] file I/O

[C++] file I/O

JohnnyB ::

Pozdravljeni

Za vajo moram narediti program, ki prebere števila (elipsoidne koordinate) iz vhodne datoteke, izračuna druga števila (kartezične koordinate) in rezultate zapiše zapiše v izhodno datoteko.

Nalogo znam sprogramirati kot razred, ki obdela (prebere, izračuna in zapiše) le en primer naloge. Problem se pojavi, ker je zahtevana možnost, da imamo v vhodni datoteki zaporedoma zapisane podatke za več primerov naloge.

Ali mi lahko nekdo pomaga napisati zanke, ki bi prebrale več primerov naloge, jih izračunale in zapisale zaporedoma v izhodno datoteko?

Main

#include "pretvorbaPaketno.h"

int main() 
{
	// Primer programiranih podatkov.
	int fi_st,fi_min;
	float fi_sek;
	int lambda_st,lambda_min;
	float lambda_sek;
	float h;

	ifstream vhod;  // vhodna datoteka
	ofstream izhod; // izhodna datoteka
	char dat[32];

	// Odpri datoteke.
	//
	cout << "PAKETNO:" << endl << endl;
	cout << "Vnesi ime vhodne datoteke:";
	cin >> dat;
	vhod.open( dat );

	cout << "Vnesi ime izhodne datoteke:";
	cin >> dat;
	izhod.open( dat );
	
	if( !vhod || !izhod) 
	{    // Če datotek ni, ali naprave ne delujejo.
		cout << endl << "Datotek ni!" << endl;
	
		char znak;
		cout << endl << "Pritisni poljubno tipko za konec programa...";
		cin >> znak;

		return 1;
	}

	// Predmet demoPaketno predstavlja pretvorbaPogovorno nalogo, pri
	// kateri so podatki napisani v vhodni datoteki.
	pretvorbaPaketno demoPaketno;

	if(demoPaketno.preberiPodatke(vhod))
	{
		demoPaketno.izpisiRezultat(izhod,3);
	}
	else
	{
		cout << endl << "Neuspesno branje iz datoteke!" << endl;
	}
	
	char znak;
	cout << endl << "Pritisni poljubno tipko za konec programa...";
	cin >> znak;

	return 0;
}



Izvedba razreda

#include "pretvorbaPaketno.h"

pretvorbaPaketno::pretvorbaPaketno()
{
	a=6377397.155;
	b=6356078.96281819;
	PI=3.141592654; 
}

pretvorbaPaketno::pretvorbaPaketno(int nfi_st,int nfi_min,float nfi_sek,int nlambda_st,int nlambda_min,float nlambda_sek,float nh)
{
	a=6377397.155;
	b=6356078.96281819;
	PI=3.141592654; 

	fi_st=nfi_st; fi_min=nfi_min; fi_sek=nfi_sek;
	lambda_st=nlambda_st; lambda_min=nlambda_min; lambda_sek=nlambda_sek;
	h=nh;
}

bool pretvorbaPaketno::preberiPodatke(ifstream& vhod)
{
	vhod >> fi_st >> fi_min >> fi_sek;
	if( !vhod ) return false;


	vhod >> lambda_st >> lambda_min >> lambda_sek;
	if( !vhod ) return false;

	vhod >> h;
	if( !vhod ) return false;
	
	return true;  // Ob uspehu vrni true.
}

void pretvorbaPaketno::elipsoidneVkartezicne()
{
	double e;
	double N;
	double fi,lambda;

	fi=(fi_st+fi_min/60.0+fi_sek/3600.0)*PI/180.0;
	lambda=(lambda_st+lambda_min/60.0+lambda_sek/3600.0)*PI/180.0;

	e=sqrt(a*a-b*b)/a;
	N=a/sqrt(1.0-e*e*sin(fi));

	x=(N+h)*cos(fi)*cos(lambda);
	y=(N+h)*cos(fi)*sin(lambda);
	z=(b*b/a/a*N+h)*sin(fi);
}

void pretvorbaPaketno::izpisiRezultat(ofstream& izhod, int ndec)
{
	elipsoidneVkartezicne();

	izhod.setf( ios::fixed ); // Zahtevamo normalni izpis realnih vrednosti.
	izhod.precision(ndec);    // Zahtevamo izpis na "ndec" decimalk.

	izhod << "Pretvorba elipsoidnih koordinat v kartezicne: " << endl << endl;

	izhod << "Elipsoidne koordinate:" << endl;
	izhod << "fi=" << fi_st << "st " << fi_min << "min " << fi_sek << "sek" << endl;
	izhod << "lambda=" << lambda_st << "st " << lambda_min << "min " << lambda_sek << "sek" << endl;
	izhod << "h=" << h << "m" << endl << endl;

	izhod << "Kartezicne koordinate:" << endl;
	izhod << "x=" << x << "m" << endl;
	izhod << "y=" << y << "m" << endl;
	izhod << "z=" << z << "m" << endl;
}


Hvala

'FireSTORM' ::

v datoteki imaš takole:
nekaj lala hopsasa 0,6464 19 wfefwrhwth

torej vmes po presledkih ločeno?
treba je sparsat vhodne podatke
prebereš vrstico in jo parsaš kaj gre kam
drugo vrstico spet parsaš
in tako dokler ne prideš do konca
Those penguins.... They sure aint normal....

JohnnyB ::

V datoteki imam koordinate ločene s presledki

5 5 5.555 5 5 5.555 5.555
6 6 6.666 6 6 6.666 6.666
7 7 7.777 7 7 7.777 7.777

Tole sem popravil - while zanka prebere vsako vrstico posebej (7 števil) dokler ne pride do konca datoteke.

bool pretvorbaPaketno::preberiPodatke(ifstream& vhod)
{
	while ( !vhod.eof() )
	{
		vhod >> fi_st >> fi_min >> fi_sek >> lambda_st >> lambda_min >> lambda_sek >> h;
		if( !vhod ) return false;
	}
	return true;  // Ob uspehu vrni true.
}


Kako pa naj zdaj naredim zanko, da bo za vsako prebrano vrstico dopisala rezultat v izhodno datoteko. Zaenkrat mi izračuna samo zadnjo vrstico.

'FireSTORM' ::

Zato ker ti samo bereš bereš in bereš in vedno ko prebereš novo vrstico prepišeš staro v spremenljivkah, moraš vrstico prebrat jo sprocesirat, in zapisat v drug file.
Razen če uporabljaš seznam pointerjev(nisem prebral celotne tvoje kode).
Those penguins.... They sure aint normal....

JohnnyB ::

V mainu sem moral spremeniti, ne pa v razredu, kot sem jaz poskušal.

Hvala


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Python - pomoč!

Oddelek: Programiranje
71207 (1043) lknix
»

Java Objekti

Oddelek: Programiranje
102252 (1946) Mavrik
»

programiranje C

Oddelek: Programiranje
62429 (2291) bozjak
»

algoritem za pretvorbo koordinat

Oddelek: Programiranje
153351 (3178) Monster
»

[C++][Naloga_polja]MIN in MAX polja, izpis za x.100 stevil

Oddelek: Programiranje
222940 (2751) snow

Več podobnih tem