View Full Version : [c++]visualizzazione file
Salve a tutti.
Un po per sfizio sto cercando di sviluppare una semplice agenda in c++ che chieda i nomi e le date da tastiera e le scriva su un file.
Fino qua il programa funzione egregiamente...
Poi pero' voglio mostare a schermo anche il contenuto di quale file...e qui iniziano i problemi :D, non funziona la funzione visualizzazione();.
Vi posto il codice(metto php cosi nono perde l'indentazione):
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
void inserimento(); //prototipo delle
void visualizzazione(); //funzioni
FILE *save;
int main(void)
{
save=fopen("save.txt","w+"); //creo il file save.txt
fputs("~Nomi~ ~Date~",save);
char risp[4],risp2[4];
cout<<"Benvenuti in AGENDA V 0.1"<<endl;
cout<<"Si desidera proseguire? (yes or no)";
gets(risp);
if(!strcmp("yes",risp))
{
inserimento();
}
cout<<"Desideri vedere il contenuto del file?(yes or no)";
cin>>risp2;
if(!strcmp("yes",risp2))
{
visualizzazione();
}
getchar();
}
//Funzione per l'inserimento
void inserimento()
{
const int righe=5,lettere=20;
char nome[righe][lettere];
char date[righe][lettere];
int i;
for(i=0;i<righe;i++)
{
cout<<"Inserire il nome di posto "<<i<<endl;
gets(nome[i]);
cout<<"Inserire la data di nascita di "<<nome[i]<<endl;
gets(date[i]);
fputs("\n",save);
fputs(nome[i],save);
fputs(" ",save);
fputs(date[i],save);
}
return;
}
//Funzione per la visualizzazione
void visualizzazione()
{
char str[20];
fgets(str,255,save);
cout<<str;
return;
}
io da programmatore consiglierei di implementare una struttura composta da un campo Nome e da un campo Data
typedef struct DatiPersona
{
char Nome[20];
char _1; // Spazio
char Data[10]; // Rispettando la strutura __/__/____
char CR; // Legge il carattere CR
char LF; // Legge il carattere LF
} Record;
poi per l'acquisizione puoi fare così
fread (&Record,sizeof (DatiPersona),1,save);
per la stampa
puts (Record.Nome);
printf (" ");
puts (Record.Data);
printf ("\n");
PS ovviamente buttando giù 2 idee, prova a vedere se il codice funziona :D
decisamente non sono a quel livello...mi potresti dire perchè la funzione visualizzazione non funziona?
Intanto ho modificato il codice...:
/******************************
** Creare un'agenda in C++ **
** Version 0.2 **
*******************************/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
void inserimento(); //prototipo delle
void visualizzazione(); //funzioni
FILE *save;
int main(void)
{
system("/bin/sh -c clear");
save=fopen("save.txt","w+"); //creo il file save.txt
fputs("~Nomi~ | ~Date~",save);
int risp;
char risp2[4];
cout<<"Benvenuti in AGENDA V 0.2"<<endl;
do
{
cout<<"[1]-Inserire nomi e date nel file"<<endl;
cout<<"[2]-Visualizzare il contenuto del file"<<endl;
cin>>risp;
}while(risp<1 && risp>2);
switch(risp)
{
case 1:{inserimento();}break;
case 2:{visualizzazione();}break;
};
getchar();
}
//Funzione per l'inserimento
void inserimento()
{
const int righe=5,lettere=20;
char nome[righe][lettere];
char date[righe][lettere];
int nomi,i;
do
{
cout<<"Quanti nomi vuoi inserire? ";
cin>>nomi;
}while(nomi>4);
for(i=0;i<nomi;i++) //non mi fa inserire il nome di posto 0!! perchè??
{
cout<<"Inserire il nome di posto "<<i;
gets(nome[i]);
cout<<"Inserire la data di nascita di "<<nome[i]<<endl;
gets(date[i]);
fputs("\n",save);
fputs(nome[i],save);
fputs(" ",save);
fputs(date[i],save);
}
return;
}
//Funzione per la visualizzazione
void visualizzazione() //questa non va
{
char str[30];
fgets(str,255,save);
cout<<str;
return;
}
Cosa vuol dire non funziona? Si blocca? Non scrive niente?
Forse è perchè devi dichiarare più grande la stringa, del tipo char str[255]; In più, fgets ti mostrerà solo la prima riga del file, quindi dovresti porre così la funzione:
void Visualizzazione()
{
while(!feof(save))
{
char str[255];
fgets(str,255,save);
cout<<str;
}
}
Infine, non hai bisogno di un return alla fine della funzione void.
Ti ringrazio..pero' ho un altro problema nella funzione iserimento();
void inserimento()
{
const int righe=5,lettere=20;
char nome[righe][lettere];
char date[righe][lettere];
int nomi,i;
do
{
cout<<"Quanti nomi vuoi inserire? ";
cin>>nomi;
}while(nomi>4);
for(i=0;i<nomi;i++) //non mi fa inserire il nome di posto 0!! perchè??
{
cout<<"Inserire il nome di posto "<<i;
gets(nome[i]);
cout<<"Inserire la data di nascita di "<<nome[i]<<endl;
gets(date[i]);
fputs("\n",save);
fputs(nome[i],save);
fputs(" ",save);
fputs(date[i],save);
}
return;
}
Come da commento non mi fa inserire il nome di posto 0! Perchè :mad:
Niente da fare....neanche se parto da 1 e neanche da -1 funziona :(
Vorrei proprio capire perchè.....tra l'altro ho portato il programma su una macchina windows e funziona -__________________________-
prova a passarlo con gdb o un altro debugger e guarda che cosa fa.
ciao!
Originariamente inviato da NA01
prova a passarlo con gdb o un altro debugger e guarda che cosa fa.
ciao!
Ottima idea! nn ci avevo pensato...
Grazie ora provo
;)
EDIT: ma come si usa? Io da shell faccio $ gdb a.out
ed ecco l'output:
GNU gdb 6.1
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i586-suse-linux"...Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb)
fammi sapere cosa era!!!
l'ultima votla che ho passato la mia giornata davanti a un debugger mi sono accorto alla fine che in fooooooooooooooooooooooondo al programma più lungo che avessi mai scritto c'era una uguale in meno del previsto :sofico: :muro:
molto più divertente la volta che un banale i++ faceva passare il mio long int da 127 a -127 :eek: non ho mai capito il perchè :muro:
mmmmh se non lo hai mai usato usa ddd (è un front end).
imposti il break alla linea che vuoi con il pulsante e poi vai di step.
con il mouse vedi il valore delle variabili (ci passi sopra)
ciao
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.