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

Język C++ Szkoła programowania wydanie VI, Rozdział 6 zadanie 8, liczenie ilości znaków w pliku.

0 głosów
199 wizyt
pytanie zadane 23 maja 2018 w C i C++ przez Junior_plusplus Obywatel (1,050 p.)

Witam,

mam problem z zadaniem 8 z rozdziału 6 z książki "Język C++ Szkoła programowania wydanie VI":

Treść zadania:

"Napisz program otwierający plik tekstowy, wczytujący go znak po znaku do końca, a następnie podający liczbę znaków w tym pliku."

polega on na tym, że na końcu programu wyświetla mi sumę wszystkich liter zamiast sumy wszystkich znaków co jest wymagane w warunku zadania.

Nie wiem jak skonstruować kod, aby wczytywał on z pliku całą linię tekstu ze wszystkim znakami zamiast liter (wydaje mi się, że z w tym tkwi problem). Myślałem, aby zastosować cin.getline() z tym, że nie wiem w jaki sposób zastosować tą instrukcję w przypadku odczytu danych z pliku?

Proszę o wskazówki jak rozwiązać powyższy problem i ogólną ocenę kodu.

Z góry dziękuję za pomoc.

Kod:

#include <iostream>
#include <fstream>
#include <cstdlib>


using namespace std;

int main()
{
    char nazwa_pliku[30];
    ifstream odczyt;

    cout << "Witaj! Prosze podaj nazwe pliku ktory chcesz wczytac: ";
    cin.getline(nazwa_pliku, 30);
    cout << endl;
    odczyt.open(nazwa_pliku);
    if (!odczyt.is_open())
    {
        cout << "Otwarcie pliku " << nazwa_pliku << " nie powiodlo sie.\n";
        cout << "Program zostanie zakonczony.\n";
        exit (EXIT_FAILURE);
    }
    char dane[200];
    int poszczegolne_znaki = 0;
    int suma_znakow = 0;

    while(odczyt.good())
    {
        while(odczyt>>dane)
        {
            ++poszczegolne_znaki;
            suma_znakow += poszczegolne_znaki;
            cout <<dane<<" ";
        }
    }
    if (odczyt.eof())
        cout << "Koniec pliku.\n";
    else if (odczyt.fail())
        cout << "Wczytywanie danych przerwana - blad.\n";
    else
        cout << "Wczytywanie danych przerwane, przyczyna nieznana.\n";
    if (suma_znakow == 0)
        cout << "Nie przetworzono zadnych danych.\n";
    else
    {
        cout << "Ilosc wczytanych znakow to: " << suma_znakow;
    }
    odczyt.close();
    cout << endl;

    return 0;
}


 

 

2 odpowiedzi

+1 głos
odpowiedź 23 maja 2018 przez Qwerty96 Stary wyjadacz (13,680 p.)
wybrane 24 maja 2018 przez Junior_plusplus
 
Najlepsza

Do odczytania znaku ze strumienia służy metoda get:

http://en.cppreference.com/w/cpp/io/basic_istream/get

komentarz 24 maja 2018 przez Junior_plusplus Obywatel (1,050 p.)
Ja zrozumiałem ilość znaków z polecenia jako (jeśli w pliku .txt napiszę zdanie "Ala ma 4 Koty." to ma mi podać ilość liter cyfr białych znaków itp. razem w sumie czyli 9 liter jedna cyfra 3 spacje i jedna kropka co łącznie daje 14.) Chyba, że źle rozumiem polecenie do zadania ?
komentarz 24 maja 2018 przez Qwerty96 Stary wyjadacz (13,680 p.)
To nie jest żadna suma, tylko liczba znaków w pliku. Tą liczbę trzymasz w zmiennej poszczegolne_znaki, którą warto byłoby przemianować na coś w stylu liczba_znakow.
komentarz 24 maja 2018 przez Junior_plusplus Obywatel (1,050 p.)

Pozmieniałem wszystko wg zaleceń  i działa pojawił się tylko jeden problem program wyświetla podwójnie ostatnią literę wczytywanego tekstu.

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <sstream>


using namespace std;

int main()
{
    char nazwa_pliku[30];
    ifstream odczyt;
    ifstream wczytanie_wiersza;


    cout << "Witaj! Prosze podaj nazwe pliku ktory chcesz wczytac: ";
    cin.getline(nazwa_pliku, 30);
    cout << endl;
    odczyt.open(nazwa_pliku);
    if (!odczyt.is_open())
    {
        cout << "Otwarcie pliku " << nazwa_pliku << " nie powiodlo sie.\n";
        cout << "Program zostanie zakonczony.\n";
        exit (EXIT_FAILURE);
    }
    char znak_po_znaku;
    int liczba_znakow = 0;

    while(odczyt.good())
    {
        odczyt.get(znak_po_znaku);
        liczba_znakow++;
        cout <<znak_po_znaku;
    }
    if (odczyt.eof())
        cout << "\n\nKoniec pliku.\n";
    else if (odczyt.fail())
        cout << "Wczytywanie danych przerwana - blad.\n";
    else
        cout << "Wczytywanie danych przerwane, przyczyna nieznana.\n";
    if (liczba_znakow == 0)
        cout << "Nie przetworzono zadnych danych.\n";
    else
    {
        cout << "Ilosc wczytanych znakow to: " << liczba_znakow;
    }
    odczyt.close();
    cout << endl;

    return 0;
}

 

komentarz 24 maja 2018 przez Qwerty96 Stary wyjadacz (13,680 p.)

Bo powinna być ta wersja pętli while:

while(odczyt.get(znak_po_znaku))
komentarz 24 maja 2018 przez Junior_plusplus Obywatel (1,050 p.)

Zrobione, wszystko super działa tak jak chciałem.

Bardzo dziękuję wszystkim za pomoc, cierpliwość i wyrozumiałość ;).

Aktualny działający kod:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <sstream>


using namespace std;

int main()
{
    char nazwa_pliku[30];
    ifstream odczyt;
    ifstream wczytanie_wiersza;


    cout << "Witaj! Prosze podaj nazwe pliku ktory chcesz wczytac: ";
    cin.getline(nazwa_pliku, 30);
    cout << endl;
    odczyt.open(nazwa_pliku);
    if (!odczyt.is_open())
    {
        cout << "Otwarcie pliku " << nazwa_pliku << " nie powiodlo sie.\n";
        cout << "Program zostanie zakonczony.\n";
        exit (EXIT_FAILURE);
    }
    char znak_po_znaku;
    int liczba_znakow = 0;

    while( odczyt.get(znak_po_znaku))
    {
        ++liczba_znakow;
        cout <<znak_po_znaku;
    }
    if (odczyt.eof())
        cout << "\n\nKoniec pliku.\n";
    else if (odczyt.fail())
        cout << "Wczytywanie danych przerwana - blad.\n";
    else
        cout << "Wczytywanie danych przerwane, przyczyna nieznana.\n";
    if (liczba_znakow == 0)
        cout << "Nie przetworzono zadnych danych.\n";
    else
    {
        cout << "Ilosc wczytanych znakow to: " << liczba_znakow;
    }
    odczyt.close();
    cout << endl;

    return 0;
}

 

0 głosów
odpowiedź 23 maja 2018 przez Secrus Nałogowiec (31,040 p.)
Może spróbuj wczytywać do stringa i string.length()?
komentarz 23 maja 2018 przez Junior_plusplus Obywatel (1,050 p.)

Dziękuję za szybką odpowiedź.

Niestety zmiana na "stringa" nie rozwiązała problemu. W kodzie po zmianie zlicza mi tylko słowa z pierwszego zdania zapisanego w pliku tekstowym a chodzi o to, aby zliczał mi każdy znak (litery, cyfry, białe znaki itp.)

Kod po zmianie na string:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <cstring>

using namespace std;

int main()
{
    char nazwa_pliku[30];
    ifstream odczyt;

    cout << "Witaj! Prosze podaj nazwe pliku ktory chcesz wczytac: ";
    cin.getline(nazwa_pliku, 30);
    cout << endl;
    odczyt.open(nazwa_pliku);
    if (!odczyt.is_open())
    {
        cout << "Otwarcie pliku " << nazwa_pliku << " nie powiodlo sie.\n";
        cout << "Program zostanie zakonczony.\n";
        exit (EXIT_FAILURE);
    }
    string dane;

    while(odczyt.good())
    {
        while(odczyt>>dane)
        {
            cout <<dane<<" ";
        }
    }
    if (odczyt.eof())
        cout << "Koniec pliku.\n";
    else if (odczyt.fail())
        cout << "Wczytywanie danych przerwana - blad.\n";
    else
        cout << "Wczytywanie danych przerwane, przyczyna nieznana.\n";
    if (dane.length() == 0)
        cout << "Nie przetworzono zadnych danych.\n";
    else
    {
        cout << "Ilosc wczytanych znakow to: " << dane.length();
    }
    odczyt.close();
    cout << endl;

    return 0;
}

 

komentarz 24 maja 2018 przez Secrus Nałogowiec (31,040 p.)
Jeśli sczytujesz z pliku linia po linii, to spróbuj tak:

wczytaj linie do stringa, zapisz jego dlugosc do zmiennej np sumaZnakow, z kazda kolejna linia dodawaj jej dlugosc do sumaZnakow

Podobne pytania

0 głosów
2 odpowiedzi 133 wizyt
0 głosów
2 odpowiedzi 154 wizyt
pytanie zadane 2 września 2018 w C i C++ przez vog Początkujący (260 p.)
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.Przycisk code

63,402 zapytań

109,669 odpowiedzi

229,141 komentarzy

44,689 pasjonatów

Przeglądających: 313
Pasjonatów: 21 Gości: 292

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...