Odczyt i zapis do pliku. Kobieta czy Mężcz.

0

Witam, mam problem z pewnym zadaniem, siedze nad nim i nie wiem gdzie popełniłem błąd.
Dopiero się uczę więc proszę o wyrozumiałość :)
Zadanie: Masz plik imiona.txt, wczytujesz z niego dane do programu, a program szuka po wierszach i jeśli imie jest damskie to zapisuje je w pliku damskie.txt, jak męskie to analogicznie. Kolejność wierszy zgodna z tymi w imiona.txt. (Na koniec w programie sobie zliczam jeszcze)
Takie coś nabazgrałem:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>

using namespace std;

int main()
{
    fstream plik, plikk, plikm;
    int kobiety = 0;
    int mezczyzni = 0;
    plik.open("imiona.txt", ios::in);
    {
        if (plik.good() == false)
        {
            cout << "Nie ma takiego pliku!" << endl;
            exit(0);
        }
        else
        {
            string linia[50];
            int nrl = 0;
            while (!plik.eof())
            {
                getline(plik, linia[nrl]);
                nrl++;
            }
            plikk.open("kobiety.txt", ios::out);
            plikm.open("mezczyzni.txt", ios::out);
            for (int i = 0; i <= nrl; i++)
            {
                int dlugosc = linia[i].length();
                if (linia[i][dlugosc - 1 == 'a'])
                {
                    plikk << linia[i] << endl;
                    kobiety++;
                }
                else
                {
                    plikm << linia[i] << endl;
                    mezczyzni++;
                }
                i++;
            }
            plikk.close();
            plikk.clear();
            plikm.close();
            plikm.clear();
        }

        cout << kobiety << endl;
        cout << mezczyzni << endl;
    }


    return 0;
}

Do pliku kobiety.txt zapisuje prawie dobrze (nie chce zapisać np imienia Paulina nie wiedzieć czemu). Do pliku mezczyzni.txt nie chce zapisać.
Proszę o pomoc.
Pozdrawiam.

3

Po poprawieniu formatowania wszystko staje się jasne.

if (linia[i][dlugosc - 1 == 'a'])

if nie sprawdza czy linia kończy się a, tylko czy jej pierwszy lub drugi znak jest różny od \0

Swoją drogą, nie masz tam off-by-one przy iteracji po ilości wczytanych linii?

3
  
       for (int i = 0; i <= nrl; i++)
            {
                int dlugosc = linia[i].length();
                if (linia[i][dlugosc - 1 == 'a'])
                {
                    plikk << linia[i] << endl;
                    kobiety++;
                }
                else
                {
                    plikm << linia[i] << endl;
                    mezczyzni++;
                }
                i++;
            }

W kroku pętli i++ i na koniec i++ ?

0

@xfin
Z tą iteracją to faktycznie gafa :s
Program nadal nie działa tak jak powinien. Rozumiem, że mam błąd w warunku: if (linia[i][dlugosc - 1 =='a']) tak?
@kq
Nie wywala błędu, ale rozumiem, że chodzi o to, że zlicza za dużo elementów z tablicy o jeden i trzeba ją zmniejszyć w pętli for: for(int i=0; i<=nrl-1; i++), tak? (Przynajmniej tak zrozumiałem błąd off by one).

1

Tak, spodziewałbym się, że będziesz iterował for(int i = 0; i < nrl; i++).

2

Si. Raczej chodziło Ci o coś takiego:

if (linia[i][dlugosc - 1]=='a')

Ale lepiej powiedz co chciałeś osiągnąć ;)

0

@kq
No tak, przecież zamiast pisać fora z i<=nrl-1 można napisać i<nrl . Kolejna gafa.
@xfin
Człowiek siedzi przed tym komputerem, myśli, zastanawia sie czy w ogolę dobrze to napisał, a tu taki błąd i wszystko się wyjaśnia.

Program działa jak należy. Dziękuje za poświęcenie mi czasu :) A na forum będę zaglądał co jakiś czas i w przyszłości może też będę mógł komuś coś doradzić. Pozdrawiam.

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