C++ Program liczący średnią długość słowa

0

Witam, mam problem z plikiem liczącym średnią długość słowa w pliku (słowo jest to każdy ciąg znaków, przed którym znajduje się: spacja, przecinek, kropka, początek lub koniec wiersza). Na razie napisałem program, który podaje średnią długość słowa jeśli słowa w pliku wejściowym są podane po spacji w jednym wierszu i nie mam pomysłu co zrobić dalej, oto kod:

 
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
 
int main()
{
    char bufor[256];
    fstream plik;
    plik.open( "dane18.txt", ios::in );
    if( plik.good() == true )
        {
            cout << "Uzyskano dostep do pliku!" << endl;
            float suma, slowo, srednia;
            suma = 0;
            while (!plik.eof())
            {
                  plik.getline(bufor, 256, ' ');
                  cout<<"Dlugosc slowa= "<<strlen(bufor)<<endl;
                  slowo = strlen(bufor);
                  suma = suma + slowo;
            }
        srednia = suma/4;
        cout<<srednia<<endl;
        plik.close();
        } else cout << "Error! Nie udalo sie otworzyc pliku!" << endl;
    system("pause");
    return 0;
}
0

Jeżeli koniecznie chcesz korzystać z c-stringów zamiast z klasy string to zainteresuj się tym:
http://www.cplusplus.com/reference/clibrary/cstring/strtok/ - rozbija string na mniejsze wg. ustalonych znaków podziału
w przeciwnym wypadku tym:
http://www.cplusplus.com/reference/string/string/find_first_of/ - wyszukuje w stringu pozycję występowania określonych znaków

0

http://www.cplusplus.com/reference/clibrary/cstring/strtok/ - rozbija string na mniejsze wg. ustalonych znaków podziału

O masakra… ale zwalona funkcja… nie dość że miesza w oryginalnym stringu, to jeszcze utrzymuje własny stan (co na to inne wątki?)

EDIT: było.

0

O lol, teraz się jej przyjrzałem... trochę dramat. Kolejny powód, żeby nie lubić string.h ;)

0

Zrobiłem to za pomocą funkcji find_first_of() , i wymyśliłem, że za pomocą tej funkcji będę podmieniał wszystkie kropki przecinki itd. na spacje i słowa oddzielone samymi spacjami normalnie wczytywał tak jak to już wczesniej napisałem, ale pojawił się problem, bo gdy już zwrócę sobie string dane w której mam już same słowa ze spacjami, zeby wczytywać słowa i liczyć ich długość, potrzebuje je porozdzielać i myśle sobię, że funkcją strtok() sobie porozdzielam a tu nie, bo potrzebuje tablicy char*[] a nie string zeby ją rodzielić, proszę, aby ktoś pomógł albo zrzutować to jakoś na char albo dać inny pomysł rozdzielenia, bo jakbym już to miał w postaci char[], to mógłbym sobie nawet getline'm z delimiterem w postaci spacji to wczytywać ale potrzebuje mięc to w tablicy char...Oto kod:

 
#include<iostream>
#include<fstream>
#include<string.h>
#include<string>
using namespace std;
 
int main()
{
    char bufor[256];
    string dane, dane2;
    fstream plik;
    plik.open( "dane18.txt", ios::in | ios::out);
    if( plik.good() == true )
        {
        cout << "Uzyskano dostep do pliku!" << endl;
            for (int j = 0; j<2;j++)
            {
             getline(plik, dane);
             size_t found;
             found=dane.find_first_of(",\t\n.");
                  while (found!=string::npos)
                  {
                    dane[found]=' ';
                    found=dane.find_first_of(",\t\n.",found+1);
                    
                  }
             cout << dane << endl;
            
            }
            char pch[256];
            pch = strtok(bufor,' ');
            float suma, slowo, srednia;
            suma = 0;
            int m = 0;
                  slowo = dane.length();
                  suma = suma + slowo;
                  m=m+1;
                  srednia = suma/m;
        cout<<"Srednia dlugosc slow w pliku jest rowna: "<<srednia<<endl;
        plik.close();
        } else cout << "Error! Nie udalo sie otworzyc pliku!" << endl;
    getchar();
    return 0;
}
0

Przekombinowałeś jak już używasz find_first_of to nic więcej nie potrzebujesz, nie musisz nic zamieniać na spacje. Przecież find_first_of zwraca pozycję miejsca gdzie jest ta kropka, przecinek czy whatever. Bierzesz tą pozycję, odejmujesz od niej poprzednią i masz długość słowa.

0

Inne wątki na to : TLS

To cię i tak nie uratuje. Po pierwsze, wewnątrz pętli ze strtok-iem nie możesz zagnieździć drugiego strtok-a, więc musisz uważać co wywołujesz: potencjalnie każda wołana procedura może korzystać ze strtok-a. W rezulacie dla pewności nie możesz nic wywoływać. I z drugiej strony: nie wiesz, czy funkcja którą piszesz nie jest przypadkiem wykonywana wewnątrz pętli ze strtok-iem. Więc w praktyce nie możesz jej nigdy użyć z wyjątkiem main().

Wniosek się nasuwa jeden: strtok to zuo.

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