Szukanie znaku w tekście - 50% dobre wyświetlanie

0

witam!
Na psiałem program który z pliku wczytuje tekst i szukam w nim znaków np ' ! ' lub ' @ ' i wszytko działa dobrze, ale czasem jak dam inny przykład coś się miesza np:

sa$ 2 $
%sa %4% %
!!!s!!!a!!! 10!!!!
5@@@ 5 @@

Gdy wpisuje $ i % dobrze mi wyświetla ze są 2-$ i 4-%, a gdy wpisuje ! podaje 13-! i 6-@.
Mam pytanie dlaczego ???

KOD: [ program jest brzydko napisany bo go wyciąłem z innego dłuższego programu i dodałem tylko żeby działał, żeby ktoś mógł sobie sprawdzić.

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

using namespace std;

int main()
{


                                    int ile_z=0;
                                    char znaczek;
                                    char znak=' ';
                                    char dokument[255];
                                    char menu;
                                    string tekst;

                                    do
                                    {
                                    cout <<"podaj     1- wprowadz dane     2-szukaj znaku     k-koniec : ";cin>>menu;
                                    switch (menu)
                                    {

                                    case '1':
                                    {
                                    cout <<"podaj nazwe pliku tekstowego z ktorego ma byc wczytany tekst: "; cin>>dokument;
                                    cout <<"\nTekst ktory byl w pliku tekstowym: "<<endl<<endl;
                                    ifstream mojplik;
                                    mojplik.open(dokument);
                                    if(mojplik.is_open())
                                    {
                                    while (mojplik.good())
                                    {
                                    getline(mojplik, tekst);
                                    cout <<tekst<<endl;
                                    }
                                    mojplik.close();
                                    }
                                    else
                                    {cout <<"Nie mozna otworzyc pliku do czytania"<<endl;
                                    return 0;
                                    }
                                    break;
                                    }

                                    case '2':
                                    {
                                    ile_z=0;
                                    cout <<"jaki znak ma byc suzkany: "; cin>>znaczek;
                                    ifstream mojplik(dokument);
                                    while (mojplik.eof()==false)
                                    {
                                    mojplik >> znak;
                                    if(znak == znaczek)
                                    ile_z++;
                                    }
                                    mojplik.close();
                                    cout << "Znak '" << znaczek << "' wystepuje w pliku: " <<dokument<<", "<< ile_z << " raz(y).\n";
                                    }
                                    break;

                                    default :
                                    {
                                        if (menu!='k')
                                        {
                                                cout<<endl<<"  nie ma takiej opcji!"<<endl;
                                        }
                                   break;
                                   }}
    }
    while (menu!='k');

    return 0;
}

0

Nie zagłębiałem się ale na oko czytasz z pliku o 1 linię za dużo. Eof pojawia się dopiero jak próbujesz przeczytać będąc na końcu pliku, w efekcie:

  • przeczytasz ostatnią linię
  • wykonasz obliczenia
  • znów wejdziesz do pętli i spróbujesz czytać, nic nie odczytasz, ustawi się eof ale wykonasz obliczenia na poprzedniej wartości
1
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int
main() {
	int count;
	char character;
	char character2 = ' ';
	char menu;
	string doc;
	string text;

	do {
		cout <<"podaj     1- wprowadz dane     2-szukaj znaku     k-koniec : ";
		cin >> menu;
		switch(menu) {
			case '1': {
				cout << "Nazwa pliku: ";
				cin >> doc;
				ifstream file(doc.c_str());
				if(!file.is_open()) return -1;
				while(getline(file, text));
					cout << text << endl;
			} break;
			case '2': {
				count = 0;
				cout << "Znak: ";
				cin >> character;
				ifstream file(doc.c_str());
				while(file.get(character2))
					if(character2 == character) count++;
				cout << "Znak: " << character << " wystepuje: " << count << endl;
			} break;
			default: break;
		}
	} while(menu != 'k');

	return 0;
}

Ew. zamien file.get(character2) na file >> character2.

2

Ja to rozwiązałem ładnie posługując się iteratorami:

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

int main()
{
    char z; //szukany znak w pliku
    std::cin >> z;

    std::ifstream plik("plik.txt");
    
    if(plik.bad()) {
     exit(-1);   
    }
    
    std::istream_iterator<char> it(plik);
    std::istream_iterator<char> end;
    std::string trescPliku(it,end);
    int count = std::count(trescPliku.begin(), trescPliku.end(), z);
    
    std::cout << "Znak: "<< z <<" wystapil: "<<count<<" razy\n";
    
    std::cin.get();
}
 

//EDIT

0

Dzięki n0name_l i Robcio
kod n0name_l'a jest napisany prościej łatwiej mi go zrozumieć, bo kod robicia zawiera elementy które na obecnym stanie wiedzy są mi obce
A mam pytanie jeszcze mógłby ktoś prościej wyjaśnić niż Shalom czemu w tym kodzie co ja psiałem na końcu w "@" dodawało mi jeden więcej bo reszta była dobra ??

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