Ciao a tutti! sono bloccato da un pò di tempo con la realizzazione di un esercizio, che chiede di elaborare un file di testo.
(Sto studiando da autodidatta , perciò non so a chi chiedere, non posto il nome del libro ma se mi dite che posso lo farò, scusate ma sono nuovo su questo Forum).
L'esercizio dice:
Scrivere un programma che elabora file di testo. Il programma deve leggere un file di testo e visualizzare i dati in esso contenuti, cosi come sono, oltre al numero di parole, di righe e di paragrafi ( nel file di ingresso sono separati da una riga vuota ), Scrivere ed utilizzare le seguenti funzioni:
Initialize: Inizializza tutte le variabile della funzione main.
processBlank: Questa funzione legge e scrive caratteri di spaziatura. Ogni volta che incontra un carattere che non sia di spaziatura, incrementa il numero di parole presenti nella riga, la funzione termina dopo aver elaborato tutti i caratteri di spaziatura.
copyText: Questa funzione legge e scrive i caratteri che non sono di spaziatura, appena trova un carattere di spaziatura termina.
updateCount: questa funzione viene eseguita al termine di ogni riga: aggiorna il conteggio totale delle parole, incrementa il numero di righe e riporta a zero il numero di parole presenti nella riga che si sta leggendo. Se la riga letta non aveva parole, incrementa il numero di paragrafi: per separare un paragrafo dall'altro si usa una righa vuota, che non deve modificare il conteggio delle righe.
printTotal: questa funzione visualizza il numero di parole, il numero di righe e il numero di paragrafi.
Il programma deve leggere dati da un file e scrivere i risultati in un file, non usare variabili globali.
Collaudare il programma usando la seguente funzione main:
int main()
{
dichiarazione di variabili
apertura dei file
lettura di un carattere
while(il file non è finito)
{
while(la righa non è finita)
{
processBlank(parametri);
copyText(parametri);
}
updateCount(parametri);
lettura di un carattere
…
}
printTotal(parametri);
chiusura dei file;
return 0;
}
Ecco, da questo capisco che non devo usare stringhe e devo passare tutti i valori per riferimento, il mio dubbio iniziale era nei “…” inseriti dopo la lettura del carattere all'interno del ciclo while.
Il mio codice è questo, rimango bloccato alla lettura dell'ultimo carattere, ( fermando il programma ed analizzando vedo che rimane in un ciclo infinito di lettura, nel ciclo while (carattere != ‘\n’) c'è il ( in.get(carattere); ), rimane li, continua a leggere il carattere ed a stamparlo, se termino il programma ed apro il file “Risultato”, mi copia perfettamente tutto il testo, ma scrive all'infinito l'ultimo carattere.
#include <iostream>
#include <fstream>
#include <cmath>
#include <string>
#include <cstring>
#include <Windows.h>
#include <iomanip>
#include <cstdlib>
// Ho tutte queste inclusioni perchè nello stesso progetto ho più esercizi.
void initialize(int& numparole, int& TOTparole, int& righe, int& paragrafi, char& carattere);
void processBalnk(ifstream& in, ofstream& out, int& numparole, char& carattere);
void copyText(ifstream& in, ofstream& out, char& carattere);
void updateCount(int& numparole, int& TOTparole, int& righe, int& paragrafi, char& carattere);
void printTotal(int& TOTparole, int& righe, int& paragrafi);
int main()
{
int numparole, TOTparole, righe, paragrafi;
char carattere;
initialize(numparole, TOTparole, righe, paragrafi, carattere);
ifstream in;
ofstream out;
in.open("Testo.txt");
out.open("Risultato.txt");
while (!in.eof())
{
while (carattere != '\n')
{
in.get(carattere);
processBalnk(in, out, numparole, carattere);
copyText(in, out, carattere);
}
updateCount(numparole, TOTparole, righe, paragrafi, carattere);
// qua ripeto la lettura del carattere per determinare il paragrafo
in.get(carattere);
updateCount(numparole, TOTparole, righe, paragrafi, carattere);
out << "\n";
// qua inserisco di nuovo le funzioni per non perdere il carattere letto al di fuori del ciclo
in.get(carattere);
processBalnk(in, out, numparole, carattere);
copyText(in, out, carattere);
}
printTotal(TOTparole, righe, paragrafi);
in.close();
out.close();
return 0;
}
void initialize(int& numparole, int& TOTparole, int& righe, int& paragrafi, char& carattere)
{
numparole = 0;
TOTparole = 0;
righe = 0;
paragrafi = 0;
carattere = 0;
}
void processBalnk(ifstream& in, ofstream& out, int& numparole, char& carattere)
{
if (carattere == ' ' || carattere == '\t')
{
out << carattere;
numparole++;
}
}
void copyText(ifstream& in, ofstream& out, char& carattere)
{
if (carattere != ' ' && carattere != '\t')
{
out << carattere;
}
}
void updateCount(int& numparole, int& TOTparole, int& righe, int& paragrafi, char& carattere)
{
if (carattere == '\n' && numparole > 0)
{
righe++;
numparole++;
TOTparole += numparole;
}
else if (carattere == '\n' && numparole == 0)
{
paragrafi++;
}
}
void printTotal(int& TOTparole, int& righe, int& paragrafi)
{
cout << "Parole totali: " << TOTparole << endl;
cout << "Righe totali: " << righe << endl;
cout << "Paragrafi: " << paragrafi << endl;
}