• 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
1,577 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 1,013 wizyt
0 głosów
4 odpowiedzi 1,539 wizyt

93,742 zapytań

142,678 odpowiedzi

323,297 komentarzy

63,327 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...