PDA

Visualizza la versione completa : [c++] errore funzione


Salvatore_91
02-03-2009, 17:27
Mi sapreste dire perche mi da errore questo programma?


# include <iostream>
# include <windows.h>
# include <string.h>
# include <fstream>
using namespace std;

string nome, cogn, numero, mail;
long pos;

void inizia();
void acquis_scritt(ofstream write);
void scrittura();

int main()
{
int scelta;
cout << "RUBRICA telefonica\n"<<endl;
//ifstream is;
//is.open ("Rubrica", ios::binary );
while (scelta!=5)
{
cout << "1) Inizia Rubrica "<<endl;
cout << "2) Aggiungi Contatti "<<endl;
cout << "3) Visualizza contatti "<<endl;
cout << "4) Elimina tutta la Rubrica "<<endl;
cout << "5) Esci"<<endl;
cin >> scelta;

if (scelta==1)
{
ofstream write("Rubrica.txt",ios::out);
write << "NOME";
write.seekp (20, ios_base::beg);
write <<"COGNOME";
write.seekp (40, ios_base::beg);
write <<"NUMERO";
write.seekp (54, ios_base::beg);
write <<"E-MAIL"<<endl;
acquis_scritt(&write); // qui l'errore
write.close();
}
if (scelta==2)
{
ofstream write("Rubrica.txt",ios::app);

}
if (scelta==3)
{

}

}
system("PAUSE");
}
//------------------------------------------------------------------------------
void acquis_scritt(ofstream write)
{
cout << "Inserisci nome:"<<endl;
cin >> nome;
write.seekp (0, ios_base::cur);
write << nome;
cout << "Inserisci cognome:"<<endl;
cin >> cogn;
pos=nome.length();
write.seekp (20-pos, ios_base::cur);
write << cogn;
cout << "Inserisci numero:"<<endl;
cin >> numero;
pos=cogn.length();
write.seekp (20-pos, ios_base::cur);
write << numero;
cout << "Inserisci e-mail:"<<endl;
cin >> mail;
pos=numero.length();
write.seekp (14-pos, ios_base::cur);
write << mail << endl;
}
//------------------------------------------------------------------------------
void scrittura()
{

}

errore:
conversion from `std::ofstream*' to non-scalar type `std::ofstream' requested

MItaly
02-03-2009, 17:38
Perché stai passando un puntatore ad ofstream ad una funzione che si aspetta un oggetto ofstream. Personalmente credo che la cosa più saggia sia cambiare la funzione in modo che accetti un reference ad un oggetto ofstream e rimuovere l'& dalla chiamata alla funzione.


void acquis_scritt(ofstream & write);
//...
acquis_scritt(write);
//...
void acquis_scritt(ofstream & write)
//...

MacApp
02-03-2009, 17:39
La riga dobbiamo indovinarla?
;-)

Salvatore_91
02-03-2009, 17:42
MacApp, se vedi bene nel codice che ho postato, ho scritto un commento:
// qui l'errore

:quote:

YuYevon
02-03-2009, 17:43
(se vabbè... avevo scritto il messaggio e l'ho inviato 10 minuti dopo :zizi: )

Controlla queste tre righe che hai scritto (i commenti li ho aggiunti io)




//prototipo
void acquis_scritt(ofstream write);



//chiamata in main()
acquis_scritt(&write);



//intestazione della funzione
void acquis_scritt(ofstream write)
{
...


Il prototipo della funzione si aspetta un oggetto di classe ofstream, e l'intestazione della funzione lo stesso. Ma tu invece cosa passi alla funzione, in main(), dove appunto hai l'errore?

MacApp
02-03-2009, 17:45
Originariamente inviato da Salvatore_91
MacApp, se vedi bene nel codice che ho postato, ho scritto un commento:
// qui l'errore

:quote:

ah ecco :-p

Salvatore_91
02-03-2009, 17:53
ok raga, adesso il programma non da nessun errore di compilazione.
Se inizio la rubrica, inserendi '1', va tutto bene.
Invece se vorrei aggiungere un contatto, inserendo '2', il programma mi scrive su FILE, ma non rispetta il tracciato record.
ad esempio:


NOME(+16 byte vuoti)COGNOME(+13 byte vuoti) ecc ecc
Salvatore(+11 byte vuoti) BLABLA(+14 byte vuoti) ecc ecc
MariaBLABLAeccecc

Iniziando la rubrica, quindi inserendo '1' va bene.
Dopo inserendo '2' il risultato e' come nell'esempio (Maria...eccecc) tutto attaccato

MItaly
02-03-2009, 17:54
(commento non più attuale :) )

YuYevon
02-03-2009, 18:02
Originariamente inviato da Salvatore_91
ok raga, adesso il programma non da nessun errore di compilazione.
Se inizio la rubrica, inserendi '1', va tutto bene.
Invece se vorrei aggiungere un contatto, inserendo '2', il programma mi scrive su FILE, ma non rispetta il tracciato record.
ad esempio:


NOME(+16 byte vuoti)COGNOME(+13 byte vuoti) ecc ecc
Salvatore(+11 byte vuoti) BLABLA(+14 byte vuoti) ecc ecc
MariaBLABLAeccecc

Iniziando la rubrica, quindi inserendo '1' va bene.
Dopo inserendo '2' il risultato e' come nell'esempio (Maria...eccecc) tutto attaccato

Stando al codice che hai postato sopra (non so se intanto hai aggiunto altro), se scegli "2" in realtà non dovrebbe fare proprio niente se non aprire in append il file in questione senza scriverci nulla, visto che l'unica istruzione del blocco "if (scelta == 2)" è

ofstream write("Rubrica.txt",ios::app);

Salvatore_91
02-03-2009, 18:04
hai ragione ecco il codice:


# include <iostream>
# include <windows.h>
# include <string.h>
# include <fstream>
using namespace std;

string nome, cogn, numero, mail;
long pos;

void inizia();
void acquis_scritt(ofstream &write);
void scrittura();

int main()
{
int scelta;
cout << "RUBRICA telefonica\n"<<endl;
//ifstream is;
//is.open ("Rubrica", ios::binary );
while (scelta!=5)
{
cout << "1) Inizia Rubrica "<<endl;
cout << "2) Aggiungi Contatti "<<endl;
cout << "3) Visualizza contatti "<<endl;
cout << "4) Elimina tutta la Rubrica "<<endl;
cout << "5) Esci"<<endl;
cin >> scelta;

if (scelta==1)
{
ofstream write("Rubrica.txt",ios::out);
write << "NOME";
write.seekp (20, ios_base::beg);
write <<"COGNOME";
write.seekp (40, ios_base::beg);
write <<"NUMERO";
write.seekp (54, ios_base::beg);
write <<"E-MAIL"<<endl;
acquis_scritt(write);
write.close();
}
if (scelta==2)
{
ofstream write("Rubrica.txt",ios::app);
acquis_scritt(write);
write.close();
}
if (scelta==3)
{

}
}
system("PAUSE");
}
//------------------------------------------------------------------------------
void acquis_scritt(ofstream &write)
{
cout << "Inserisci nome:"<<endl;
cin >> nome;
write.seekp (0, ios_base::cur);
write << nome;
cout << "Inserisci cognome:"<<endl;
cin >> cogn;
pos=nome.length();
write.seekp (20-pos, ios_base::cur);
write << cogn;
cout << "Inserisci numero:"<<endl;
cin >> numero;
pos=cogn.length();
write.seekp (20-pos, ios_base::cur);
write << numero;
cout << "Inserisci e-mail:"<<endl;
cin >> mail;
pos=numero.length();
write.seekp (14-pos, ios_base::cur);
write << mail << endl;
}
//------------------------------------------------------------------------------

Loading