Strona 1 z 1
[C++] program liczący liczbę danych liter w tekście
: 6 sie 2011, o 16:21
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źć.

[C++] program liczący liczbę danych liter w tekście
: 7 sie 2011, o 18:41
autor: abc666
Mi program odpalił się i zakończył poprawnie.
[C++] program liczący liczbę danych liter w tekście
: 7 sie 2011, o 20:11
autor: bartek118
Potwierdzam, u mnie także działa bez problemów
[C++] program liczący liczbę danych liter w tekście
: 8 sie 2011, o 00:05
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ęć ) .
[C++] program liczący liczbę danych liter w tekście
: 8 sie 2011, o 18:29
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:
5. 96 linijka jest nieprzenośna.
6. Wypadałoby, żeby main zwrócił EXIT_SUCCESS z cstdlib.