PDA

View Full Version : Aiuto programmino c++ (Visual c++)


Prometheus ts
06-01-2007, 18:52
Salve a tutti , stavo facendo un piccolo programmino per imparare e mi sono bloccato a questo punto , cioè riesco a leggere e scrivere da file , tuttavia quando mi scrive il file , se sono presenti altre righe , le cancella e le sovrascrive con la nuova , in pratica non riesco a fargli capire di aggiungere nuove riche e non cancellare tutto ...consigli?



#include<iostream>//per cin , cout etc...
#include<fstream>//eof , fseek etc....
#include<iomanip>//per strcmp , confrontare stringhe
#include<conio.h>//per getch()
#include <stdlib.h>//per exit, atoi etc....
#include <string>//per usare getlineed il tipo stringa...
#include <vector>
// Our using statements.
using namespace std;

void inseriscicittà ();


// Our main() function.
int main()
{
//vettore di tipi string chiamato"listacittà"
vector<string> listacittà ;
string linea; // un oggetto può essere definito senza un valore di inizializzazione iniziale
// , nel qual caso il valore iniziale è una stringa vuota (lunghezza zero e nessun carattere):
ifstream città;//variabile di tipo ifstream chiamata "città"
int controllore=0; //valore che mi serve per il controllo del ciclo while successivo





// Next you will use the object's open function to open the text file.
città.open("Città.txt");//apre il file chiamato"Città"

// Validate that the file opened.
if(!città)
{
cout << "Errore , non è stato possibile aprire il file\a\n" << endl;
cout << "Premere un tasto per continuare..\a" << endl;
getch();
exit(1);
}




while(getline(città,linea))//fa anche un controllo , ossia se è vero che c'è
//una linea allora continua col while, getline prende il file e la riga.
{
listacittà.push_back(linea);// Aggiunge una linea alla fine del vettore col comando"pusch_back(oggettoaggiunto)"...
cout <<"["<<linea<< "]"<<endl;// Print out the string to the screen.
} ;


cout<<"numero città= "<< listacittà.size()<<endl;
città.close();
cout<<" vuoi aggiungere una nuova città?"<<endl;


while (controllore!=1)//il controllore mi serve per mantenere il loop sulla domanda.
{
switch ( getch() ) // con questo switch , confronto le risposte
//date con le lettere da inserire richieste.
{

case 'y' :
cout<<"\nDaccordo inserisci la nuova città\n "; // test numero uno.
inseriscicittà ( );
controllore=1;
break;

case 'n' :
cout<<"\nCome Desideri\n" ; // test numero due.
controllore=1;
break;

default :
cout<<"non ho capito puoi rispondere con un si = Y o un no = N?\n";// Process for all other cases.
controllore=0;

}
}


cout << "Premere un tasto per continuare...\a" << endl; // \a crea un suono.
getch();

return 0;
}





void inseriscicittà ( )
{
string nuovacittà;//variabile di tipo stringa che mi serve per inserire una nuova città.
ofstream Scrivicittà ("Città.txt");
if (Scrivicittà.is_open())
{
cout << "Inserisci una nuova città\n"<<endl;
cin>>nuovacittà ;
Scrivicittà.seekp (0, ios::end);
Scrivicittà<<(nuovacittà) ;

Scrivicittà.close();
}
else cout << "Unable to open file";

}


ovviamente per testarlo va creato un file texto con qualche città dentro....

vizzz
06-01-2007, 19:17
http://www.cplusplus.com/reference/iostream/ofstream/open.html

devi anche specificare la modalità di apertura, cioè append

Prometheus ts
06-01-2007, 19:36
Ho fatto questa modifica , ma non funziona sapreste dirmi perchè?

:/



void inseriscicittà ( )
{
string nuovacittà;//variabile di tipo stringa che mi serve per inserire una nuova città.
ofstream Scrivicittà;
Scrivicittà.open("Città.txt", ios_base::openmode mode = ios_base::app );
if (Scrivicittà.is_open())
{
cout << "Inserisci una nuova città\n"<<endl;
cin>>nuovacittà ;

Scrivicittà<<(nuovacittà) ;

Scrivicittà.close();
}
else cout << "Unable to open file";

}

vizzz
06-01-2007, 19:38
a memoria bisogna fare

Scrivicittà.open("Città.txt", ios::app );

Prometheus ts
06-01-2007, 19:53
Ok grazie , ora funziona , ma dimmi , perchè è diverso da come scrivono invece sul sito ?
Inoltre in questo modo mi scrive la nuova città consequenzialmente all'ultima , sulla stessa rica quindi poi mi legge sempre una città invece che due , come per esempio RomaLondra tutto attaccato , come faccio a far si che scriva su righe diverse?
Senza possibilmente usare /n....o endl ? :help:

AngeL)
07-01-2007, 08:51
Ok grazie , ora funziona , ma dimmi , perchè è diverso da come scrivono invece sul sito ?
Inoltre in questo modo mi scrive la nuova città consequenzialmente all'ultima , sulla stessa rica quindi poi mi legge sempre una città invece che due , come per esempio RomaLondra tutto attaccato , come faccio a far si che scriva su righe diverse?
Senza possibilmente usare /n....o endl ? :help:
se quando scrivi manualmente il file metti un newline alla fine, quando scrivi via programma devi scrivere "nomecitta\n", se invece alla fine del file il newline non c'è, da programma dovrai scriverci nella forma "\nnomecitta". :)