Salve a tutti! Sto lavorando su un programma che dovrebbe:
1) Leggere un file di testo
2) Contare tutti i caratteri in esso contenuto
3) creare 2 file di testo, uno contenente il testo originale, il secondo contenente il conteggio di tutti i caratteri presenti nel testo
Tutto sembra funzionare, tranne per un difetto: l'ultimo carattere del testo originale viene ripetuto una singola volta. Qualcuno riesce a svelarmi l'arcano?
#include <iostream>
#include <fstream>
#include <cctype>
using namespace std;
void inizialize (int list[]); //funzione per inizializzazione array
void letterCount(char ch, int list[], int& space); //funzione per conteggio lettere del file di testo
void copytxt(int list[], char& ch, ifstream& inText, ofstream& outText, int& space); //funzione per copiatura del file di testo
void lettersList(int list[], ofstream& outText, int space); //funzione per stampa di file di testo contenente il conteggio lettere
const int ARRAY_SIZE=26; //costante che definisce la dimensione dell'array contenente il conteggio lettere
int main() //funzione principale
{
ifstream inFile; //inizializzazione variabili per gestione dei file di ingresso ed uscita
ofstream outFile;
ofstream outLetters;
int numberLetter[ARRAY_SIZE]; //inizializzazione array che conterrà il conteggio delle lettere
int space=0; //contatore del carattere ' '
char ch; //inizializzazione del carattere che verrà utilizzato per manipolare i caratteri dei file di entrata e uscita
inFile.open("textin.txt"); //apertura file di ingresso
if(!inFile) //sistema di controllo file
{
cout << "Wrong file, aborting program." <<endl;
return 1;
}
outFile.open("textout.txt", ios::app); //apertura file di uscita
outLetters.open("textletters.txt", ios::app);
inizialize(numberLetter); //inizializzazione array
inFile.get(ch); //il programma ottiene il primo carattere del file di ingresso
while(inFile) //ciclo che copia il file di testo in ingresso in uno di uscita tramite la funzione copytxt
{
copytxt(numberLetter, ch, inFile, outFile, space);
}
lettersList(numberLetter, outLetters, space); //uso della funzione letterList per creare il file di testo contenente il conteggio lettere
inFile.close(); //chiusura di tutti i file
outFile.close();
outLetters.close();
return 0; //fine programma
}
void inizialize (int list[]) //funzione di inizializzazione array
{
for(int a=0; a<ARRAY_SIZE; a++)
{
list[a]=0;
}
}
void letterCount(char ch, int list[], int& space) //funzione di conteggio lettere
{
int index=0;
ch=toupper(ch);
index=static_cast<int>(ch)-static_cast<int>('A');
if(index>=0 && index<ARRAY_SIZE)
list[index]++;
if(index==-33)
space++;
}
void copytxt(int list[], char& ch, ifstream& inText, ofstream& outText, int& space) //funzione di copiatura del testo
{
while(ch!='\n' && inText)
{
outText << ch;
letterCount(ch, list, space); //all'interno della funzione viene richiamata la funzione letterCount all'interno di un ciclo while
inText.get(ch);
}
outText << ch;
inText.get(ch);
}
void lettersList(int list[], ofstream& outText, int space) //funzione che crea il file di testo contenente il conteggio lettere
{
for(int index=0; index<26; index++)
outText << static_cast<char>(index+65) << " is present " << list[index] << " times." << endl;
outText << "' ' is present " << space << " times." << endl;
}