PDA

View Full Version : [C]Aiuto per un rogramma


-Yara-
28-01-2005, 17:34
Salve a tutti ho un problema con il seguente programma.
Dovrebbe ricevere in input una serie di nomi e date e salvarle su un file..e lo fa..ma i nomi (che sono una matrice di caratteri) non funziona..o meglio funziona ma il nome di posto 0 non vuole farmelo inserire
Qualcuno mi aiuti perchè sto impazzendo e non riesco a capire che cavolo sia


/******************************
** Creare un'agenda in C **
*******************************/

#include <stdio.h>
#include <string.h>

void inserimento(); //prototipo delle
void visualizzazione(); //funzioni

FILE *save;

int main(void)
{
int risp;
char risp2;
system("/bin/sh -c clear");
save=fopen("save.txt","w+"); //creo il file save.txt
printf("Benvenuti in AGENDA V 0.1");
do
{
printf("\n[1]-Per inserire i nomi nel file");
printf("\n[2]-Per visualizzare il contenuto del file");
scanf("%d",&risp);
switch(risp)
{
case 1:{inserimento();}break;
case 2:{visualizzazione();}break;
}
//getchar();
printf("\nAncora? ");
scanf("%s",&risp2);
}while(risp2=='s');
}

//Funzione per l'inserimento
void inserimento()
{
const int righe=5,lettere=20;
char nome[righe][lettere];
char date[righe][lettere];
int nomi,i;
do
{
printf("\nQuanti nomi vuoi inserire?");
scanf("%d",&nomi);
}while(nomi>4);
for(i=0;i<nomi;i++)
{
printf("\nInserire il nome di posto %d",i); //il nome di posto 0 non me lo fa inserire
fgets(nome[i],lettere,stdin);
fputs(" ",save);
fputs(nome[i],save);
}
for(i=0;i<nomi;i++)
{
printf("\nInserire la data di nascita di %s",nome[i]);
fgets(date[i],lettere,stdin);
fputs(date[i],save);
fputs("\n",save);
}
}

//Funzione per la visualizzazione
void visualizzazione()
{
fclose(save);
while(!feof(save))
{
char str[255];
fgets(str,255,save);
printf("%s",str);
}
}

HElp :cry:

Fenomeno85
28-01-2005, 18:05
scusa ma se mi chiudi il puntatore al file nella visualizzazione :wtf:
come fai a vedere se sei arrivato alla fine.
Allora lo devi riaprire in modalità lettura.
Non l'ho testato ma è solo una prima occhiata.

~§~ Sempre E Solo Lei ~§~

-Yara-
28-01-2005, 19:29
In effetti..grazie per la segnalazione ma cmq non funziona lo stesso..non riesco a capire cosa sia! Se lo compilo col borland funziona!

Ubi-Wan
28-01-2005, 19:43
al posto di fclose(save) in visualizzazione forse dovresti mettere un rewind(save).

Inoltre passando a fopen "w+" distruggi il contenuto ogni volta, se vuoi preservare i nomi gia' salvati dovresti usare "a+".

Per quanto riguarda il motivo per cui avevi postato, invece, non so aiutarti....con il gcc zompa lo 0 e fa inserire il nome di posto 1 direttamente...bo
con scanf funziona pero'

-Yara-
28-01-2005, 19:45
Originariamente inviato da Ubi-Wan
al posto di fclose(save) in visualizzazione forse dovresti mettere un rewind(save).

Inoltre passando a fopen "w+" distruggi il contenuto ogni volta, se vuoi preservare i nomi gia' salvati dovresti usare "a+".

Per quanto riguarda il motivo per cui avevi postato, invece, non so aiutarti....con il gcc zompa lo 0 e fa inserire il nome di posto 1 direttamente...bo
con scanf funziona pero'

Ti ringrazio per i consigli...proprio quell'errore non so spiegarmelo :S
:(

Fenomeno85
28-01-2005, 20:06
cmq se chiude e riapre il flusso in r come deve fare rewind è inutile.

~§~ Sempre E Solo Lei ~§~

Ubi-Wan
28-01-2005, 20:24
perche' chiudere e riaprire il flusso? puo' tranquillamente riposizionarsi all'inizio con rewind e leggere i nomi.....chiudere e aprire in lettura sarebbe un esercizio per applicare la buona usanza del "minimo privilegio" pero' ;)

Fenomeno85
28-01-2005, 20:36
Originariamente inviato da Ubi-Wan
perche' chiudere e riaprire il flusso? puo' tranquillamente riposizionarsi all'inizio con rewind e leggere i nomi.....chiudere e aprire in lettura sarebbe un esercizio per applicare la buona usanza del "minimo privilegio" pero' ;)

perchè non è il massimo usare secondo me un flusso aperto come w per leggere e poi non costa una mazza chiudere e riaprire il flusso. Anzi dato che appunto si devono usare le funzioni e quindi migliorare la leggibilità di un programma, usare un flusso dichiarato in modo globale non mi sembra il massimo.

~§~ Sempre E Solo Lei ~§~

Fenomeno85
28-01-2005, 20:39
Originariamente inviato da Ubi-Wan
chiudere e aprire in lettura sarebbe un esercizio per applicare la buona usanza del "minimo privilegio" pero' ;)

va be questo perchè usate linux che cmq mi sembra una bestialità avere impostare i permessi di scrittura e non quelli di lettura. Poi o fate vobis.
Cmq non so vediamo che dicono anche gli altri.

~§~ Sempre E Solo Lei ~§~

Ubi-Wan
28-01-2005, 21:48
cosa centra linux? con principio del minimo privilegio intendo la buona abitudine di dare a ogni parte di un programma, a ogni funzione, i privilegi essenziali per fare quello per cui è stata scritta, per esempio dichiarare prototipi di funzioni che devono esclusivamete usare in lettura puntatori o vettori cosi':

funzione(const int *) in modo tale da non permettere per sbaglio a "funzione" di modificare i valori passatogni

percio' alla funzione visualizza() e' "inutile" passare uno stream aperto anche in scrittura...

sono daccordo con te sul fatto che si migliora la leggibilità del programma (e si evitano anche molti errori aggiungo), ma non e' strettamente necessario ai fini della funzionalità, mentre tu in un tuo precedente post avevi scritto "cmq se chiude e riapre il flusso in r come deve fare rewind è inutile"

Fenomeno85
29-01-2005, 09:30
ok per la prima parte ok avevo capito male ... dichiarare le funzioni come hai detto sono perfettamente d'accordo.

Secondo me è meglio una volta finito di scrivere chiudere sempre il file e poi quando c'è bisogno riaprirlo.

~§~ Sempre E Solo Lei ~§~

Ubi-Wan
29-01-2005, 10:10
Secondo me è meglio una volta finito di scrivere chiudere sempre il file e poi quando c'è bisogno riaprirlo.

~§~ Sempre E Solo Lei ~§~

Perfettamente daccordo.