C++ Program wczytujący dane z pliku


(Grzegorzpiasecki2) #1

Witam, mam problem z programem, który ma pobierać dane z pliku, dane w pliku wejściowym są zapisane w postaci:

imię nazwisko l1 l2 l3 l4 l5 l6 l7 l8 l9 l10

imię2 nazwisko2 l1 l2 l3 l4 l5 l6 l7 l8 l9 l10

...

itd. aż do 12 osoby (l1 = liczba1) Chcę wczytywać te dane kolejno na:

string imie;

string nazwisko;

int liczba;

Nie wiem jak efektywnie wczytać dane z pliku do podanych zmiennych, na razie napisałem coś takiego, ale nie wiem jak mam przejść do wczytywania kolejnej linii z pliku:

#include

#include

using namespace std;


int main()

{

    fstream plik;

    string napis;

    string imie, nazwisko;

    int liczba;

    int liczby[10];

    int pos;

    plik.open( "dane14.txt", ios::in | ios::out );

        if( plik.good() == true )

        {

            cout << "Uzyskano dostep do pliku!" << endl;

                for (int i=0 ; i<12 ; i++)

                {

                    getline( plik, napis );

                    plik.seekg(0, ios_base::beg);

                    plik>>nazwisko;

                    plik.seekg(nazwisko.length(), ios_base::beg);

                    plik>>imie;

                    pos = imie.length() + nazwisko.length();

                    plik.seekg( (pos +1) , ios_base::beg);

                     for (int j=0 ; j<10 ; j++)

                     {

                            plik>>liczba;

                            liczby[j]=liczba;

                     }

                }      

                 cout << pos << endl; 

                 cout<
       } else cout << "Dostep do pliku zostal zabroniony!" << endl;

system("pause");

return 0;

}

([alex]) #2

Podmieniłem na pełną wersje:

#include

(Blapiter) #3

Może coś takiego :slight_smile:

void wczytaj()

{	

	int liczby[10];

	short odlicz=-2;

	string bufor, imie, nazwisko, liczba;

	string::size_type poczatek, koniec;

	fstream plik("odczyt.txt", ios::in);


	if(plik.is_open())

	{

		while(!plik.eof()) // wczytywanie do momentu wystąpienia znaczniki końca pliku

		{

			getline(plik,bufor);			

			poczatek = bufor.find_first_not_of(" ");			

			while(poczatek != string::npos)

			{

				koniec = bufor.find_first_of(" ",poczatek);

				if(koniec == string::npos)

				koniec = bufor.size();

				switch(odlicz)

				{

					case -2 : imie.assign(bufor, poczatek, koniec-poczatek);

						break;

					case -1 : nazwisko.assign(bufor, poczatek, koniec-poczatek);

						break;

					default : liczba.assign(bufor, poczatek, koniec-poczatek);

							  liczby[odlicz] = atoi(liczba.c_str());

						break;					

				}

				++odlicz;

				poczatek = bufor.find_first_not_of(" ",koniec);

			}	

			odlicz=-2;	


			cout<
			for(short i=0; i<10; ++i)

			cout<
			cout<
		}		

		plik.close();		

	}

	else

	{

		cerr<<"blad";

	}	

}

([alex]) #4

blapiter , po pierwsze dłuższe, po drugie wyłoży się przy więcej niż jednej spacji oddzielającej lub tabulacji zamiast spacji. Poza tym nie zadziała bez kilku poprawek.


(Blapiter) #5

alex, napisałem to w ten sposób żeby unnamed3 zobaczył jak można pracować na stringach dlatego dłużej, Twój sposób jest lepszy to akurat jasne :slight_smile: po drugie nie wyłoży się po wecej niż jednej spacji a żeby ominęło tabulacje to wystarczy dodać "\t". po trzecie działa u mnie idealnie :slight_smile:


([alex]) #6

Początkującym pokazuje się proste rzeczy.

Nie jestem pewien czy autor tematu zrozumie tak skomplikowany przykład, tym bardziej jak mu się wyłoży na jakimś kompilatorze to zupełnie nie będzie wiedział o co chodzi.

Zamień wydruk:

cout<

na:

cout<<"\""<

a potem powiedz czy można to nazwać idealnie.

Owszem w niektórych implementacjach (kompilatorach) atoi akceptuje spacje na początku/końcu liczby, ale nie jest to standardem.