• 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.

Object Storage Arubacloud
0 głosów
767 wizyt
pytanie zadane 23 maja 2018 w C i C++ przez Junior_plusplus Obywatel (1,130 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,580 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,130 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,580 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,130 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,580 p.)

Bo powinna być ta wersja pętli while:

while(odczyt.get(znak_po_znaku))
komentarz 24 maja 2018 przez Junior_plusplus Obywatel (1,130 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 (32,880 p.)
Może spróbuj wczytywać do stringa i string.length()?
komentarz 23 maja 2018 przez Junior_plusplus Obywatel (1,130 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 (32,880 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 654 wizyt
0 głosów
4 odpowiedzi 840 wizyt

92,550 zapytań

141,394 odpowiedzi

319,522 komentarzy

61,935 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!

...