Zliczanie średników w pliku tekstowym – czy mój kod jest dobry?

0

Witam, chcę zrobić takie zadanie:

Napisz funkcję Średniki, która zliczy ile razy znak ';'(średnik) występuje w pliku tekstowym,
którego nazwa jest jedynym parametrem funkcji. Jeśli operacje plikowe nie powiodą się, wartością
funkcji ma być –1. W programie jako pliku do testowania użyj pliku z kodem źródłowym
programu, który właśnie piszesz

Napisałem już cały kod programu , czy to rozwiązanie jest dobre? I jak mam to zrobić jeśli się nie powiedzie, żeby wartość funkcji była -1?

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    cout << "Liczba srednikow w tekscie" << endl;
    ifstream srednik;
    srednik.open("sredniki.cpp");
    if(!srednik.is_open())
    {
        cout<<" Blad, nie mozna odczytac pliku. ";
        return 1;
    }
    char sredniki;
    int ilesred=0;
    while(srednik>>sredniki)
        {
            if(sredniki==';')
            {
                ilesred++;

            }

        }
        srednik.close();


        if(ilesred==0)
            cout<<"Brak srednikow w tekście "<<endl;
        else

            cout<<"W tekscie jest: "<<ilesred<<" srednikow"<<endl;

        return 0;

}
3
Piotr cezary napisał(a):

Napisałem już cały kod programu , czy to rozwiązanie jest dobre? I jak mam to zrobić jeśli się nie powiedzie, żeby wartość funkcji była -1?

Ale jakiej funkcji, skoro jej nie napisałeś? Wszystko masz w main, a powinieneś mieć funkcję sredniki. Napisz ją i wywołaj w main – wtedy pomyślimy nad ewentualnymi poprawkami.

Wyjaśniając treść zadania – wartość -1 masz zwrócić wtedy, gdy wystąpi błąd podczas operacji plikowych. Czyli wtedy, gdy np. otwarcie pliku nie powiedzie się.

3

czy te rozwiązanie jest dobre?

​​​No tak średnio bym powiedział.

Napisz funkcję Średniki, która zliczy ile razy znak ';'(średnik) występuje w pliku tekstowym, którego nazwa jest jedynym parametrem funkcji.

Gdzie jest ta funkcja?

5

:P

using CharIter = std::istream_iterator< char >;

int CountSemicolon(const std::string& file_path)
{
   int res = -1;
   std::ifstream file( file_path );
   if (file) {
      res = std::count_if( CharIter( file ), CharIter(), [](char chr){ return chr == ';'; });
   }
   return res;
}
0

Mogę użyć do napisania funkcji void ?

2

Samo

Jeśli operacje plikowe nie powiodą się, wartością
funkcji ma być –1.

oznacza, że funkcja jednak musi zwracać wartość liczbową.

0

Zmieniłem już ale nadal mi coś źle działa.

#include <iostream>
#include <fstream>
using namespace std;

int sredniki(int liczsred)
{
    liczsred++;
}

int main()
{
    cout << "Liczba srednikow w tekscie" << endl;
    ifstream srednik;
    srednik.open("sredniki.cpp");
    if(!srednik.is_open())
    {
        cout<<" Blad, nie mozna odczytac pliku. ";
        return 1;
    }
    char znak;
int ilesred;
    while(srednik>>znak)
    {
        if(znak==';')

        {
             sredniki(ilesred);
        }
        }
        srednik.close();


        if(ilesred==0)
            cout<<"Brak srednikow w tekście "<<endl;
        else

            cout<<"W tekscie jest: "<<ilesred<<" srednikow"<<endl;

        return 0;

}


2
int sredniki(int liczsred)
{
    liczsred++;
}

WTF?

Niech ta funkcja zajmie się całą operacją liczenia średników.
Przykład masz wyżej. Jeśli go nie możesz zrozumieć napisz po swojemu, ale na tej samej zasadzie działającą.

w pliku tekstowym,
którego nazwa jest jedynym parametrem funkcji.

TA funkcja jest niezgodna z opisem zadania.

W twoim przypadku nie modyfikujesz przekazywanej wartości w funkcji. Działasz na kopii lokalnej i po wyjściu z funkcji,
zmienna nadal ma swoją wartość.
Przekazywanie parametru przez wartość i referencję

0

Czyli w tej funkcji ma być tylko otwarcie pliku? Bo nie rozumiem o co chodzi w koncu :(

2

Napisz funkcję Średniki, która zliczy ile razy znak ';'(średnik) występuje w pliku tekstowym, którego nazwa jest jedynym parametrem funkcji.

Czego tu nie rozumiesz? Funkcja Sredniki ma przyjmować w parametrze wyłącznie nazwę pliku. Ma ona otworzyć ten plik, policzyć wszystkie średniki, zamknąć plik i zwrócić liczbę. Przecież to proste.

2

Z funkcji, jaką przedstawił @tajny_agent możesz nie rozumieć

res = std::count_if( CharIter( file ), CharIter(), [](char chr){ return chr == ';'; });

std::count_if

Można napisać na około

int Sredniki(const std::string& nazwaPliku) {
   int ileSrednikow = 0;
   std::ifstream fin(nazwaPliku);
   if (!fin) {
      return -1;      
   }   
   std::string linia;
   while (std::getline(fin, linia)) {
      for (std::size_t i = 0; i < linia.size(); ++i) {
         if (linia[i] == ';') {
            ++ileSrednikow;
         }
      }
   }
   return ileSrednikow;
}

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