12 marca 2020

Operacje na stringach w plikach w C++

Kategoria: C++, Szablony stron Autor: FX

Zadanie:
Program operuje na 2 plikach – wejściowym i wyjściowym.
Wejściowy zawiera
znak1 napis1
znak2 napis2

Program liczy wystąpienia ZNAKU (char) w napisie (string),
zamienia napis na wielkie litery
wynik zapisuje w postaci
NAPIS ILERAZYxZNAK

1
2
3
a sdfda
b aaaaa
c dddddccdd
1
2
3
SDFDA 1xA
AAAAA 0xB
DDDDDCCDD 2xC

Wytyczne:
Program w klasie z polami
ifstream we;
ofstream wy;
… inne pola

Metody:

otwarcie plików w konstruktorze

zamknięcie w destruktorze

pętla odczytująca z pliku (while (!eof()) w osobnej metodzie

czytaj()
liczenie liter w osobnej metodzie
licz_litery()
_______________________________

Rozwiązanie, Filip Michałczyk:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <fstream>

using namespace std;

class zamiana{
       ifstream plik1;
       ofstream plik2;

  public:
        zamiana();
        ~zamiana();
       
        void licz();        
};

zamiana::zamiana(){ //konstruktor otwiera pliki
    plik1.open("c:\\od.txt");
    plik2.open("c:\\do.txt");
}

void zamiana::licz(){
    int licznik; //ilość wystąpień znaku
    string napis; //wczytany napis z pliku
    char znak; //wczytany znak z pliku

    while(!plik1.eof()){ //czyta plik linia po linii
        plik1 >> znak >> napis; //czyta kolejno znak i napis z pliku
        licznik = 0; //licznik powtórzeń znaku
 
        for(int i = 0; i<napis.length(); i++){ //liczy wystąpienia znaku
            if(napis[i] == znak)
                licznik++;
            napis[i] -= 32; //wg ASCII aby zmienić na wielką literę wystarczy odjąć od znaku (char) 32.            
        }
       
        znak -= 32; //znak też na wielką literę
        plik2 << napis << " " << licznik << "x" << znak << endl; //zapis wyniku dla 1 linii        
    }
}

zamiana::~zamiana(){ //destruktor - niejawnie wywołany przy zamknięciu main(), zamyka pliki
    plik1.close();
    plik2.close();
}

int main() {
    zamiana z1; //tworzymy obiekt klasy zamiana - tu uruchamia się konstruktor
    z1.licz(); //wywołujemy metodę, główną pętlę
    return 0;
} //tu uruchamia się niejawnie destruktor

Komentowanie wyłączone.