Nieprawidłowy odczyt z pliku – jak się po nim "poruszać"?

0

Cześć,
Robię zadania z książki i dotarłem do ćwiczenia gdzie muszę odczytać dane z pliku tekstowego. Wszystko ładnie i pięknie, ale kiedy próbuję coś odczytać, to pokazuje błędne wyniki. Wiem, że na pewno w złym miejscu są odczytywane dane i zastanawiam się czy program nie próbuje wkładać liczb do łańcuchów i na odwrót. Da się jakoś ustawić od którego wiersza odczytywane będą dane z pliku? Pozdro!


#include <iostream>
#include <fstream>

struct Dane
{
    std::string nazwisko[4];
    double kwota[];
};

int main()
{
    std::ifstream plik;
    plik.open("C://Users/Sajmo/Desktop/eee.txt");
    if (!plik.is_open())
    {
        std::cout << "Otwarcie pliku nie powiodlo sie.\n";
        exit(EXIT_FAILURE);
    }
    std::cout << "Towarzystwo na Rzecz Zachowania Dobrych Wplywow\n";
    int iPayer;
    plik >> iPayer;
    Dane * zmienna = new Dane[iPayer];
    do
    {
        for (int i = 0; i < iPayer; i++)
        {
            getline(plik, zmienna->nazwisko[i]);
            plik >> zmienna->kwota[i];
        }
        std::cout << "\tNasi Wspaniali Sponsorzy\n\n";
        for(int i = 0; i < iPayer; i++)
        {
            if (zmienna->kwota[i] > 10000)
                std::cout << zmienna->nazwisko[i] << " wplacil " << zmienna->kwota[i] << "zl" <<  std::endl;
        }
        std::cout << "\n\n";
        std::cout << "\tNasi Sponsorzy \n\n";
        for (int i = 0; i < iPayer; i++)
        {
            if (zmienna->kwota[i] < 10000)
                std::cout << zmienna->nazwisko[i] << " wplacil " << zmienna->kwota[i] << "zl" << std::endl;
        }
    }while(plik.eof());
    delete [] zmienna;
    plik.close();
    return 0;
}

Zawartość pliku.txt:

4
Sam Stone
2000
Freida Flass
100500
Tammy Tubbs
5000
Rich Raptor
55000

1

Niestety nie mam windowsa, żeby to zweryfikować ale czy linijka:

plik.open("C://Users/Sajmo/Desktop/eee.txt");

nie powinna wyglądać tak:

plik.open("C:\\Users\\Sajmo\\Desktop\\eee.txt");
0

W strukturze Dane pole kwota jest tablicą - w którym momencie tę tablicę inicjujesz?

Dodatkowo w ogóle ta struktura wygląda dziwnie - nie powinno być tam samo std::string nazwisko; oraz double kwota;, bez zabawy w tablice wewnątrz struktury?

0

@Patryk27:

for (int i = 0; i < iPayer; i++)
        {
            getline(plik, zmienna->nazwisko[i]);
            plik >> zmienna->kwota[i];
        }

W tej pętli z pliku pobieram dane do tablicy. Ale czy one są liczbą?

1

Troszeczkę źle kombinujesz:

struct Wpis {
  std::string nazwisko;
  double kwota;
}
// ^ zauważ, że ta struktura reprezentuje *jeden* wpis, dlatego zawiera *jedno* nazwisko oraz jedną kwotę, nie wiele

int main() {
  Wpis* wpisy = new Wpis[2]; // dopiero tutaj tworzymy *listę* wpisów

  wpisy[0].nazwisko = "Pierwsze Nazwisko";
  wpisy[0].kwota = 1000.00;

  wpisy[1].nazwisko = "Drugie Nazwisko";
  wpisy[1].kwota = 2000.00;
}

Btw, nie mieszaj polskiego oraz angielskiego nazewnictwa (Dane vs iPayer) - pisz w całości po angielsku. I nie wykorzystuj notacji węgierskiej, mamy XXI wiek :-P

2

Ja jeszcze dodam, że od C++11 nie powinno się używać new i delete.
C++11 inne ładne zastępstwa używające RAII (Resource acquisition is initialization), a w tym wypadku std::vector<Dane> załatwia sprawę.

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