Salve ragazzi. Ho creato un programma che permette di leggere da file una lista di elementi (stringhe) terminata da $ e disporla in ordine alfabetico in un nuovo file di destinazione.
Ecco un esempio della lista:
Elemento1
Elemento2
...
ElementoN
$
Il programma legge il file e mette tutti gli elementi dentro un oggetto che rappresenta un insieme di stringhe.
Una volta effettuata questa operazione, da la possibilità di inserire un ulteriore elemento. Il problema è che una volta inserito l' elemento e scritto nel file di destinazione questo non va a capo, a differenza di tutti gli elementi del file. Esempio del problema:
Elemento1
Elemento2
ElementoInserito Elemento3
...
Sapete come potrei risolvere? Vi allego il main e la classe
Main
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include "classGestione.cpp"
using namespace std;
int main(){
char Carattere, NomeFile[36], CopiaFilm[64];
string NomeFilm = "", CopiaFile = "";
FilmVisti Lista;
cout << "Inserire nome del file di input (max 32 caratteri): ";
cin.getline(NomeFile, 32, '\n');
strcat(NomeFile, ".txt");
ifstream file;
file.open(NomeFile);
if(file.fail()){
cout << "ERRORE: nome del file errato." << endl;
return 420;
}
Carattere = file.get();
while(!file.eof()){
CopiaFile += Carattere;
Carattere = file.get();
}
file.close();
remove(NomeFile);
for(int IndiceCarattere = 0; IndiceCarattere < CopiaFile.size(); IndiceCarattere++){
if(CopiaFile[IndiceCarattere] == '$') break;
NomeFilm += CopiaFile[IndiceCarattere];
if(CopiaFile[IndiceCarattere] == '\n'){
Lista.aggiungi(NomeFilm);
NomeFilm = "";
}
}
ofstream Risultato;
Risultato.open(NomeFile);
int scelta;
cout << "Vuoi aggiungere un film alla lista? (1/0): ";
cin >> scelta;
while(scelta != 1 && scelta != 0){
cout << "ERRORE: ripetere l'inserimento (1/0): ";
cin >> scelta;
}
switch(scelta){
case 1:
NomeFilm="";
cin.clear();
cin.ignore(256, '\n');
cout << "Inserire il nome del film: ";
getline(cin, NomeFilm, '\n');
Lista.aggiungi(NomeFilm);
cout << "Operazione effettuata." << endl;
break;
case 0:
cout << "Proseguo alla terminazione del programma." << endl;
break;
}
Lista.ordina();
for(int i = 0; i <= Lista.dimensione(); i++){
NomeFilm = Lista.elemento(i);
Risultato << NomeFilm;
}
Risultato << "$ <= NON CANCELLARE QUESTO SIMBOLO\n\nLa lista contiene attualmente " << Lista.dimensione() << " film.";
Risultato.close();
cout << "Operazione di ordinamento del file " << NomeFile << " eseguita con successo!" << endl;
cout << "Premere il tasto invio per terminare il programma." << endl;
cin.clear();
cin.ignore(256, '\n');
Carattere = cin.get();
return 420;
}
Classe
#include <iostream>
#include <string>
using namespace std;
class FilmVisti{
private:
string ListaFilm[1000];
int NumeroElementi;
public:
FilmVisti(){
for(int i = 0; i < 1000; i++) ListaFilm[i] = "";
NumeroElementi = 0;
}
FilmVisti(string CopiaLista[], int CopiaNumero){
int c = CopiaNumero;
for(int i = 0; i < CopiaNumero; i++){
if(contiene(CopiaLista[i])) c--;
aggiungi(CopiaLista[i]);
}
NumeroElementi = c;
}
void aggiungi(string film){
if(NumeroElementi == 1000){
cout << "Spazio non sufficiente.";
return;
}
if(contiene(film)){
cout << film << " già presente nella lista.";
return;
}
NumeroElementi++;
ListaFilm[NumeroElementi] = film;
return;
}
bool contiene(string film) const{
for(int i = 0; i < NumeroElementi; i++)
if(ListaFilm[i] == film) return true;
return false;
}
int dimensione() const{
return NumeroElementi;
}
string elemento(int i) const{
return ListaFilm[i];
}
void ordina(){
string CopiaFilm;
for(int i = 0; i <= NumeroElementi; i++)
for(int j = i; j <= NumeroElementi; j++)
if(ListaFilm[i] > ListaFilm[j]){
CopiaFilm = ListaFilm[j];
ListaFilm[j] = ListaFilm[i];
ListaFilm[i] = CopiaFilm;
}
}
};