[C++] program liczący liczbę danych liter w tekście

diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++] program liczący liczbę danych liter w tekście

Post autor: diego_maradona »

Kod: Zaznacz cały

#include "stdafx.h" 
#include <iostream>
#include <fstream>
#include <cctype>

using namespace std;

void initialize (int& lc, int list[])
{
	int j;
	lc = 0;

	for(j=0; j < 26 ; j++)
		list[j] = 0;
}

void characterCount(char ch, int list[])
{
	int i;

	ch = toupper(ch);

	i = static_cast<int>(ch)- static_cast<int>('A');

	if (0 <= i && i < 26)
		list[i]++;
}



void copyText (ifstream& intext, ofstream& outtext, char& ch, int list[])
{
	while (ch != '\n')
	{
		outtext << ch;
		characterCount(ch, list);

		intext.get(ch);
	}
outtext<<ch;
}



void writeTotal(ofstream& outtext, int lc, int list[])
{
	int i;

	outtext << endl <<endl;
	outtext << "The number of lines = " << lc <<endl;

	for (i = 0; i < 26 ; i++)
		outtext << static_cast<char>(i+ static_cast<int>('A'))
		<<" count = " << list[i] <<endl;

}

int main()
{
	int lineCount;
	int letterCount[26];
	char ch;
	ifstream infile;
	ofstream outfile;

    cout<<"Program reads a given text, outputs the text as it is, \n"
		<<"and also prints the number of lines and the number \n of times each letter appears in the text. \n ";
    
	infile.open("textin.txt");

	outfile.open("textout.txt");


	initialize(lineCount, letterCount);

	infile.get(ch);

	while(infile)
	{
		copyText(infile, outfile, ch, letterCount);
		lineCount++;
		infile.get(ch);
	}

	writeTotal(outfile, lineCount, letterCount);



	
	infile.close();
	outfile.close();


	cout<<endl;
	system("PAUSE");
}
Działa niestety tak: program przepisuje tekst z textin.txt do textout.txt i się zacina , tzn produkuje nieskończoną ilość przejść do nowej linii ( po paru minutach pracy rozmiar pliku wyjściowego ma kilkadziesiąt Mb. ) . Wygląda na to że gdzieś jest nieskończona pętla, ale nie mogę jej znaleźć. :|
abc666

[C++] program liczący liczbę danych liter w tekście

Post autor: abc666 »

Mi program odpalił się i zakończył poprawnie.
bartek118
Użytkownik
Użytkownik
Posty: 5974
Rejestracja: 28 lut 2010, o 19:45
Płeć: Mężczyzna
Lokalizacja: Toruń
Podziękował: 15 razy
Pomógł: 1251 razy

[C++] program liczący liczbę danych liter w tekście

Post autor: bartek118 »

Potwierdzam, u mnie także działa bez problemów
diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++] program liczący liczbę danych liter w tekście

Post autor: diego_maradona »

Jak zarzuciłem pik tekstowy gdzie było zawijanie wierszy, to również było wszystko w porządku. Wygląda na to że rozmiar array'a letterCount[26] był za mały, przez co program wariował ( przypominam, że w Visual studio C++ nie ma "strażnika" pilnującego czy tablica nie ucieka poza zadeklarowaną pamięć ) .
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C++] program liczący liczbę danych liter w tekście

Post autor: soku11 »

Do takiego zadania zdecydowanie najlepiej jest użyć mapy, która mapuje znak na ilość jego wystąpień. Nie ma wtedy problemów z jakimiś magicznymi 26, itd. Dodatkowo nie jestem przekonany, że problem jest rozwiązany, gdyż w linijkach 25-26 sprawdzasz czy nie jedziesz po pamięci. Wystarczy, że plik wejściowy nie będzie się kończył znakiem nowej linii i już masz pętlę nieskończoną (linia 33).

Dodatkowo:
1. Po to jest stdafx żeby tam załączać popularne nagłówki.
2. W funkcjach lepiej operować na ostream i ostream. Łatwiej później zamiast plików podłączyć coś innego.
3. std::endl to nie to samo, co '\n'.
4. Do wczytywania pojedynczego znaku lepiej używać zwięźlejszej konstrukcji:

Kod: Zaznacz cały

while(infile.get(ch))
5. 96 linijka jest nieprzenośna.
6. Wypadałoby, żeby main zwrócił EXIT_SUCCESS z cstdlib.
ODPOWIEDZ