Tworzenie dynamicznej tablicy struktur z danych z pliku.

Odpowiedz Nowy wątek
2014-12-19 15:23
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;
    }

Pozostało 580 znaków

2014-12-19 15:41
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>

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2014-12-19 15:46

Pozostało 580 znaków

2014-12-19 16:25
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.

Pozostało 580 znaków

2014-12-19 16:39
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/

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2014-12-19 16:41

Pozostało 580 znaków

2014-12-19 19:58
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;
    }
edytowany 1x, ostatnio: Argonus, 2014-12-19 20:00

Pozostało 580 znaków

2014-12-19 20:41

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;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-19 20:56
0

Teraz program nie idzie dalej po tej pętli.

Pozostało 580 znaków

2014-12-19 21:02
0

Bez kodu - do wróżbitów.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-19 21:03
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 ;)

edytowany 2x, ostatnio: Argonus, 2014-12-19 21:05

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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