Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wygląda na to, że wyrazy się nie wczytują...

Ostatnio zmodyfikowano 2013-12-11 16:30
Autor Wiadomość
Nitr0Skay
Temat założony przez niniejszego użytkownika
Wygląda na to, że wyrazy się nie wczytują...
» 2013-12-10 18:10:37
Witam. Mam pewien problem z programem. Oto kod programu:

C/C++
#include <iostream>
#include <fstream>
#include <string>

using namespace std;
int parzyste( string wyraz );
int porownanieWyrazow( string wyraz, int k );

int main()
{
    const int iloscNAPISOW = 1000;
    string pierwszyPlik = "napisy.txt";
    string drugiPlik = "zadanie.txt";
    string wyraz;
    fstream napisy;
    fstream zadanie;
   
    /* Otwarcie Pliku */
    napisy.open( pierwszyPlik.c_str() );
    if( !napisy.good() )
         cout << "Nie udalo sie otworzyc pliku: " << pierwszyPlik << endl;
   
    /* Pierwsza część Zadania */
    int parzysteWyrazy = 0;
    while( !napisy.eof() )
    {
        getline( napisy, wyraz );
        parzysteWyrazy += parzyste( wyraz );
    }
   
    /* Ustawienie Bufora pliku na sam początek tego pliku */
    napisy.seekg( 0, ios_base::beg );
   
    /* Druga część Zadania */
    int rowneWyrazy[ 18 ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    for( int k = 2; k <= 16; k++ )
    {
        napisy.seekg( 0, ios_base::beg );
        while( !napisy.eof() )
        {
            getline( napisy, wyraz );
            rowneWyrazy[ k ] += porownanieWyrazow( wyraz, k );
        }
    }
   
    /* Zapis do Pliku */
    zadanie.open( drugiPlik.c_str() );
    if( !zadanie.good() )
         cout << "Nie udalo sie otworzyc pliku: " << drugiPlik << endl;
   
    zadanie << "a)  Napisow parzystej dlugosci jest:  " << parzysteWyrazy << "\n";
    zadanie << "d)  \n";
    for( int k = 2; k <= 16; k++ )
         zadanie << "k = " << k << ", wyrazow: " << rowneWyrazy[ k ] << "\n";
   
    zadanie << "\n\nNitr0Skay\n\n";
   
    /* Zamknięcie Plików, Zakończenie Pracy Programu */
    zadanie.close();
    napisy.close();
    cout << "Koniec Programu." << endl;
    return 0;
}

int parzyste( string wyraz )
{
    int parzysta = 0;
    parzysta =( wyraz.size() % 2 );
    if( parzysta == 1 )
         return 1;
   
    if( parzysta == 0 )
         return 0;
   
}

int porownanieWyrazow( string wyraz, int k )
{
    int dlugoscWyrazu = 0;
    dlugoscWyrazu = wyraz.size();
   
    if( dlugoscWyrazu == k )
         return 1;
   
    if( dlugoscWyrazu != k )
         return 0;
   
}


Problem jest z drugą częścią Zadania, które brzmi następująco:
Dla każdej liczby k  2, 3, ...,16 podaj liczbę napisów o długości k znajdujących się
w pliku napisy.txt, tzn. podaj, ile jest napisów 2-znakowych, ile jest napisów
3-znakowych itd.

Założenie to ma realizować ta część Kodu:

C/C++
/* Druga część Zadania */
int rowneWyrazy[ 18 ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for( int k = 2; k <= 16; k++ )
{
    napisy.seekg( 0, ios_base::beg );
    while( !napisy.eof() )
    {
        getline( napisy, wyraz );
        rowneWyrazy[ k ] += porownanieWyrazow( wyraz, k );
    }
}


Oto co się pokazuje w pliku:


a)  Napisow parzystej dlugosci jest:  456
d) 
k = 2, wyrazow: 0
k = 3, wyrazow: 0
k = 4, wyrazow: 0
k = 5, wyrazow: 0
k = 6, wyrazow: 0
k = 7, wyrazow: 0
k = 8, wyrazow: 0
k = 9, wyrazow: 0
k = 10, wyrazow: 0
k = 11, wyrazow: 0
k = 12, wyrazow: 0
k = 13, wyrazow: 0
k = 14, wyrazow: 0
k = 15, wyrazow: 0
k = 16, wyrazow: 0


Nitr0Skay





A więc, wygląda na to, że najprawdopodobniej Wyrazy się nie wczytują, przez co
dlugoscWyrazu = wyraz.size();
  zwraca 0, przez co funkcja także zwraca zero, a ja nie wiem, co może być tego przyczyną. Nie mogę nigdzie znaleźć miejsca, gdzie mógłbym popełnić jakiś błąd. Byłbym wdzięczny, gdybyście mnie naprowadzili, bo już chyba dobre 40 minut się z tym męczę....

Z góry dziękuję.
P-98913
MrPoxipol
» 2013-12-10 18:38:18
C/C++
while( !napisy.eof() )
{
    getline( napisy, wyraz );
    parzysteWyrazy += parzyste( wyraz );
}
Krócej będzie (i lepiej):
C/C++
string text, buff;
while( getline( file, buff ) )
{
    text += buff;
}
P-98919
Adik80
» 2013-12-10 18:58:26
po dojsciu do konca pliku ystawia sie flaga eof, przesuniecie na poczatek pliku nie resetuje flag, dlatego przy kolejnej petli niczego nie odczyta. Ptrzebujesz dodac plik.clear() po seekg().
P-98921
Nitr0Skay
Temat założony przez niniejszego użytkownika
» 2013-12-10 21:14:21
A więc trzeba wyczyścić flagę eof. Dobrze, teraz rozumiem. Zaraz poprawię.

A więc tak. Zrobiłem coś takiego:

C/C++
/* Druga czesc Zadania */
int rowneWyrazy[ 18 ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for( int k = 2; k <= 16; k++ )
{
    napisy.seekg( 0, ios_base::beg );
    while( !napisy.eof() )
    {
        getline( napisy, wyraz );
        rowneWyrazy[ k ] += porownanieWyrazow( wyraz, k );
    }
    napisy.clear();
}

I działa, ale zastanawia mnie jedno. Nie rozumiem czegoś takiego:

C/C++
/* Druga czesc Zadania */
int rowneWyrazy[ 18 ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for( int k = 2; k <= 16; k++ )
{
    napisy.seekg( 0, ios_base::beg );
    napisy.clear();
    while( !napisy.eof() )
    {
        getline( napisy, wyraz );
        rowneWyrazy[ k ] += porownanieWyrazow( wyraz, k );
    }
}

W tym powyższym przypadku, jak dodam
napisy.clear();
 przed pętlą z
.eof()
 To wówczas bufor się nie czyści i nadal nie czyta wyrazów. Nie bardzo rozumiem, dlaczego
.clear()
 musi być po pętli, a nie może być przed pętlą...
P-98943
Nitr0Skay
Temat założony przez niniejszego użytkownika
» 2013-12-11 15:57:20
Ktoś mógłby mi to wytłumaczyć ?? Nigdzie nie mogę znaleźć odpowiedzi Na to, dlaczego w pierwszym przypadku działa, a w drugim nie do końca.
P-98983
Adik80
» 2013-12-11 16:30:54
Wyglada ze jesli eofbit jest ustawiony przed wywolaniem seekg to seekg nic nie zrobi, trzeba clear dac przed seekg
P-98985
« 1 »
  Strona 1 z 1