• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błędne zliczanie znaków w pliku.

Object Storage Arubacloud
0 głosów
2,307 wizyt
pytanie zadane 29 sierpnia 2015 w C i C++ przez heartagram Obywatel (1,770 p.)
Witam, potrzebuje napisać program który mi zliczy ilość wystąpień znaku " 1 " w pliku ilejedynek.txt. Gdzieś mam raczej błąd ponieważ albo mi nie pobiera całej zawartości programu albo coś gdzieś źle napisałem bo wynik mam 0...

Znów Was specialiści proszę o pomoc :D

 

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

using namespace std;

 

int pp()
{
    ifstream plik;
    string linia;
    int licznik;
    char znak_szukany;
    plik.open("ilejedynek.txt");
if (!plik)
{
    cout<<"nie ma pliku"<<endl;
plik.close();
}
else
{
    if (znak_szukany=='1')
        licznik++;
}
return licznik;
plik.close();

}

 

int main()
{

cout<<pp();

}

3 odpowiedzi

+2 głosów
odpowiedź 29 sierpnia 2015 przez niezalogowany

Aleee... Gdzie ty masz sprawdzanie ile jest tych jedynek? Ty masz po prostu takiego małego if()-a, no ale co z tego? Przecież to nic nie robi :D Dobra, tutaj masz poprawiony kod:

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

using namespace std;

int pp()
{
    ifstream plik;
    string linia;
    int licznik;
    char znak_szukany='1';
    plik.open("ilejedynek.txt");
    if(!plik.good())
    {
        cout << "\nNie ma pliku!" << endl;
        plik.close();
    }
    plik >> linia;
    for(int i=0;i<linia.length();i++)
    {
        if(linia[i]==znak_szukany)
            licznik++;
    }
    plik.close();
    return licznik;
}



int main()
{
    cout << "W pliku jest " << pp() << " jedynek.";
}

Tylko ci jeszcze wytknę jeden błąd ;) No więc w funkcji pp return masz przed close, a po return funkcja się zamyka, więc plik już by chyba się nie zamknął.

No, to chyba tyle, program działa, jak masz jeszcze jakieś pytania, to napisz w komentarzu ;)

komentarz 13 września 2015 przez niezalogowany
A którego kodu użyłeś? Tego do liczenia JEDYNEK czy ZNAKÓW? O_o
komentarz 13 września 2015 przez heartagram Obywatel (1,770 p.)

Tego pierwszego użyłem i już wszystko działa. Coś standardowo źle przepisałem >< Zlicza mi wszystkie znaki w pliku teraz dobrze tak jak chciałem, dzięki!

 

Ale to nie koniec.. Coś takiego jeszcze mi nie daje spokoju, znaczy funkcje:

-zwracającą liczbę wszystkich wystąpień DANEGO symbolu

-zwarającą największą liczbe w pliku

-filtrującą zawartość pliku wejściowego w celu znalezienia wszystkich wyrazów, w
których dany symbol występuje dwukrotnie

komentarz 13 września 2015 przez niezalogowany
edycja 13 września 2015
Żeby zrobić takie coś, żeby użytkownik mógł sobie wybrać jakikolwiek znak, to najprościej tak:
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int pp(char znak_szukany='1')
{
    ifstream plik;
    string linia;
    int licznik;
    plik.open("ilejedynek.txt");
    if(!plik.good())
    {
        cout << "\nNie ma pliku!";
        plik.close();
        return 0;
    }
    plik >> linia;
    for(int i=0;i<linia.length();i++)
    {
        if(linia[i]==znak_szukany)
            licznik++;
    }
    plik.close();
    return licznik;
}

int main()
{
    char znak;
    cout << "Jaki znak mam sprawdzic: ";
    cin >> znak;
    cout << endl << "W pliku jest " << pp(znak) 
<< znak << ".";
}
Czyli, że wystarczy dodać cin i ten znak wysłać do funkcji pp. Proste? Proste ;) Powinno działać, ale nie gwarantuję, bo piszę to na komórce i jest dość niewygodnie, więc jak będą jakieś błędy to mnie popraw ;)

Jeśli chodzi o największą liczbę w pliku, to trzeba było by zrobić to tak, żeby każda liczba była w nowej linii. Pobrać liczbę z pierwszej linni, następnie z drugiej, sprawdzić czy ta druga była większa. Jak pierwsza była większa, to do zmiennej najwieksza_liczba wsadzamy tą pierwszą liczbę, jak druga była większa, to wsadzamy drugą. Jeśli chcesz, żeby te liczby były pomiędzy tekstem i w różnych miejscach, to trzeba by było użyć bardziej złożonego sposobu, którego teraz nie wymyślę, a na komoa na razie nie wchodzę, bo mam dużo problemów (reklamacja i te sprawy, wyjdzie na moje, ale i tak muszę czekać :/), więc jeśli już miałbym ci podać gotowy program, to jednak kiedy indziej, póki co to trochę sam pokombinuj ;)

Z tą funkcją sprawdzającą, czy znak występuję w danym słowie podwójnie to to samo co wcześniej, teraz tego nie zrobię, chociaż zarys pomysłu to już mam, ale nie mam jak to sprawdzić :| Podpowiem ci tylko, że trzeba użyć paru pętli i if()-ów, a spacje to są separatory pomiędzy wyrazami. Póki co to sam pomyśl ;)
komentarz 13 września 2015 przez heartagram Obywatel (1,770 p.)
ok, to na bieżącą chwile już Cię nie męcze. Sam się troche z tym poszarpe i może coś napisze chodź i tak już mi masakrycznie dużo pomogłeś :D miłego rozwiązywania także swoich problemów :)
komentarz 13 września 2015 przez niezalogowany
Dziękuję i nawzajem, na razie trochę sam z tym pokombinuj ;) Jak już będę do dyspozycji, to podam kod i sprawdzimy czy będzie tak samo dobry, jak twój ;D
+1 głos
odpowiedź 29 sierpnia 2015 przez Michał Gibas Pasjonat (19,610 p.)
Nie będę dalej zgłębiał kodu bo już zauwarzyłem błąd w funkcji pp(). Źle wpisałeś zamiast fstream to ifstream...

Z góry pozdrawiam!
komentarz 29 sierpnia 2015 przez niezalogowany
Może być fstream, ofstream i ifstream. fstream to ofstream i ifstream w jednym ;)
komentarz 29 sierpnia 2015 przez heartagram Obywatel (1,770 p.)
faktycznie, ale nadal 0 pokazuje :)
+1 głos
odpowiedź 29 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
Po pierwsze w warunku if zamykasz plik, którego nie otwarłeś. Jak pliku nie będzie to wywali błąd. Po klauzuli else sprawdzasz czy znak_szukany=='1', ale nie przypisałeś mu żadnej wartości więc zwraca false. W else musisz zrobić pętlę while(getline(plik, zmienna_string)) i w tej pętli zliczać wystąpienia znaku '1' w tej zmiennej typu string, którą przekazujesz do funkcji getline. I zaincjalizuj licznik zerem.

Podobne pytania

0 głosów
1 odpowiedź 485 wizyt
pytanie zadane 21 stycznia 2018 w C i C++ przez magicznyukf Początkujący (260 p.)
0 głosów
1 odpowiedź 787 wizyt
pytanie zadane 4 grudnia 2016 w C i C++ przez Akiro Bywalec (2,910 p.)
0 głosów
1 odpowiedź 4,181 wizyt
pytanie zadane 28 listopada 2015 w C i C++ przez agre Użytkownik (550 p.)

92,634 zapytań

141,505 odpowiedzi

319,883 komentarzy

62,015 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...