Tworzenie dynamicznej tablicy struktur z danych z pliku.

0

Hej witam wszystkich. Mam taki problem. Mam zrobić program który odczyta dane z pliku, a następnie wczyta je do nowej struktury, posegreguje i wyświetli imiona taych który zaplacili ponad 10ty a dopiero potem tych którzy zapłacili mniej.
Format pliku .txt
wygląd

[x - liczba osób
imie
wpłata
imie
wplata
... ]

//Zadanie59.cpp
#include<iostream>
#include<fstream>
using namespace std;

struct sponsorzy 
{
	char imie[40];
	int wplata;
};

int main()
{
	char filename[30];
	fstream File;

	cout << "Podaj nazwe pliku z danymi: ";
	cin.getline(filename, 30);
	File.open(filename); // polaczenie inFile z plikiem filename

	if (!File.is_open())
		{
			cout << "Otwarcie pliku nie powidoło sie";
			exit(EXIT_FAILURE);
		};
	cin.clear();

	int liczbawplacajacych;
	File >> liczbawplacajacych;

	sponsorzy *ludzie = new sponsorzy[liczbawplacajacych];
	char odczyt[40];
	int i = 0;


	while(File.good(), File.getline(odczyt, 40))
	{
		if(isalpha(odczyt[0]))
		{
			memcpy ((*(ludzie+i)).imie, odczyt, strlen(odczyt+1));
		}
		else if(isdigit(odczyt[0]))
		{
			strncpy (odczyt, (*(ludzie+i)).wplata, sizeof(odczyt)); // tu mam problem i nie wiem jak rozwiązać.
		}
		else
			continue;
		i++;
	};
	

	if (liczbawplacajacych == 0)
		cout << "Brak";
	else
	{
		cout << "Nasi wspaniali sponsorzy: " << endl;
		for (int j = 0; j < liczbawplacajacych; j++)
		{
			if (((*(ludzie+j)).wplata) > 10000)
				cout << (*(ludzie+j)).imie;
		}
		cout << endl <<"Nasi sponsorzy: " << endl;
		for (int k = 0; k < liczbawplacajacych; k++)
		{
			if (((*(ludzie+k)).wplata) <= 10000)
				cout << (*(ludzie+k)).imie;
		}
	};
	system("pause");
	return 0;
	}
1
   ifstream fin(filename);
   size_t count;
   fin>>count;
   vector<sponsorzy> tb(count);
   sponsorzy tmp;
   for(int i=0;(i<count)&&(fin>>ws>>tmp.imie>>tmp.wplata);++i) tb[i]=tmp; // do ws - <iomanip>
0

Rozumiem, że chodzi o ten myk z vectorem. ale nie rozumiem całej reszty. Dobrze myślę że tworzysz vector który zawiera w sobie struktury, następnie tworzysz czasową strukturę tmp i w pętli wczytujesz do niej dane a następnie zapisujesz je to tablicy? Ale jeśli tak to mam dwa pytania.

  1. co do ws - <iomanip>?
  2. Jak następnie mam odczytać te dane?
    a i pytanie bonusowe tb nie powinien mieć tb[count]?
    Sorry, ze tak teraz piszę ale nie dam rady usiąść do Visula przed 22 a mnie ciekawość zżera.
0

Czy masz bana na googlach?

  1. http://www.cplusplus.com/reference/istream/ws/
  2. cout<<tb[i].imie<<' '<<tb[i].wplata;
  3. Nie, http://www.cplusplus.com/reference/vector/vector/
0

Ok przeczytałem i poprawiłem, nie wiem czemu ale jak wpisywałem ws to mi Google wyszukiwało tylko wskaźniki.
Program działa tylko nie chce potem odczytać danych.
plik txt

4
Piotr Adamczyk
10000
Baba jaga
2000
Piotruś Pan
12000
Zuzanna 
5000
//Zadanie59.cpp
#include<iostream>
#include<fstream>
#include<vector>
#include<iomanip>

using namespace std;

struct sponsorzy 
{
	char imie[40];
	int wplata;
};

int main()
{
	char filename[30];
	cout << "Podaj nazwe pliku: ";
	cin.getline(filename,30);

	ifstream file (filename);
	 if (!file.is_open())
        {
            cout << "Otwarcie pliku nie powidoło sie";
            exit(EXIT_FAILURE);
        };
    cin.clear();

	size_t liczba;
	file >> liczba;
	cout << liczba;
	vector <sponsorzy> ludzie (liczba);
	sponsorzy czasowe;

	for(int i=0;(i<liczba)&&(file>>ws>>czasowe.imie>>czasowe.wplata);++i) 
		ludzie[i]=czasowe;


	if (liczba == 0)
		cout << "Brak";
	else
	{
		cout << "Nasi wspaniali sponsorzy: " << endl;
		for (int j = 0; j < liczba; j++)
		{
			if (ludzie[j].wplata > 10000)
				cout<<ludzie[j].imie<<' '<<ludzie[j].wplata;
		}
		cout << endl <<"Nasi sponsorzy: " << endl;
		for (int k = 0; k < liczba; k++)
		{
			if (ludzie[k].wplata <= 10000)
				cout<<ludzie[k].imie<<' '<<ludzie[k].wplata;
		}
	};
	system("pause");
	return 0;
	}
1

Chodzi o to że masz nie imie jak napisałeś zaś imie nazawisko czyli ciąg że spacją, więc pętla musi się zmienić:

for(int i=0;(i<liczba)&&(((cin>>ws).getline(czasowe.imie,40))>>czasowe.wplata);++i) ludzie[i]=czasowe;
0

Teraz program nie idzie dalej po tej pętli.

0

Bez kodu - do wróżbitów.

0

Wprowadziłem tylko tą pętle którą podałeś, teraz program karze mi wprowadzić 4 dane i z nich wczytuje dane.

//Zadanie59.cpp
#include<iostream>
#include<fstream>
#include<vector>
#include<iomanip>

using namespace std;

struct sponsorzy 
{
	char imie[40];
	int wplata;
};

int main()
{
	char filename[30];
	cout << "Podaj nazwe pliku: ";
	cin.getline(filename,30);

	ifstream file (filename);
	 if (!file.is_open())
        {
            cout << "Otwarcie pliku nie powidoło sie";
            exit(EXIT_FAILURE);
        };
    cin.clear();

	size_t liczba;
	file >> liczba;
	vector <sponsorzy> ludzie (liczba);
	sponsorzy czasowe;

	for(int i=0;(i<liczba)&&(((cin>>ws).getline(czasowe.imie,40))>>czasowe.wplata);++i) 
		ludzie[i]=czasowe;
	

	if (liczba == 0)
		cout << "Brak";
	else
	{
		cout << "Nasi wspaniali sponsorzy: " << endl;
		for (int j = 0; j < liczba; j++)
		{
			if (ludzie[j].wplata > 10000)
				cout<<ludzie[j].imie<<' '<<ludzie[j].wplata;
		}
		cout << endl <<"Nasi sponsorzy: " << endl;
		for (int k = 0; k < liczba; k++)
		{
			if (ludzie[k].wplata <= 10000)
				cout<<ludzie[k].imie<<' '<<ludzie[k].wplata;
		}
	};
	system("pause");
	return 0;
	}

/ Już nie ważne, cin na file zamieniłem i działa. Dzięki jak zwykle za pomoc, może kiedyś ja zacznę tu pomagać. Miłego wieczoru ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1