Newsgroup: it.comp.lang.c
Titolo: Una questione estetica (E DI LOGICA!!)

Legge tutti i record di un flie del tipo
cod_autore
titolo
anno
visibile //serve per una cancellazione logica 
cod_...ecc
void leggi_testi(char nomefile[])//OK
{
	int i=0;
	struct libro LIB[VETT];
	FILE *f;
	if((f=fopen(nomefile,"rt"))==NULL){
		printf("impossibile leggere il file!\n");
		exit(1);}
	while ((fscanf(f, "%d\n", &LIB[i].codice_aut))>0 ){
		/*Attenzione! Fgets() legge anche il '\n'*/
		fgets(LIB[i].titolo, VETT, f);
		fscanf(f, "%d", &LIB[i].anno);
		fscanf(f, "%d", &LIB[i].visibile);
		printf("%d ", LIB[i].codice_aut);
		printf("%s", LIB[i].titolo);
		printf("\t\t\t%d\n", LIB[i].anno);}
	fclose(f);
}
Cosa fa direte voi! Legge tutti i record, OK, ma legge anche il '\n'
del titolo quando viene eseguita la fgets. I record vengono perciň
visualizzati come segue:
2 Linguaggio C sec. edi.
1989
1 Il ritratto di Dorian Gray
1878
12 Esco a fare due passi
2001
.....
Mi piacerebbe molto (e piacerebbe molto anche al proff che ha
commissionato il progetto, ahi!) che quell'anno fosse consecutivo al
titolo!!

 titolo!!
quale e' il problema?
Vai in fondo alla stringa e togli il carattere o i 2 caratteri
(a seconda del tuo sistema operativo) incriminati.
la funzione strlen ti da la lunghezza di una stringa e lo
0 indica la fine di una stringa.
ciao,
g.

sei il migliorissimo!

Mi rimangio quello che ho detto. Premesso che mi è costato molta
fatica studiare questa soluzione!
void leggi_testi(char nomefile[])
{
        int i=0,ch;
        char *p;
        struct libro LIB[VETT];
        FILE *f, *stream;
        if((f=fopen(nomefile,"rt"))==NULL){
                printf("impossibile leggere il file!\n");
                exit(1);}
        while ((fscanf(f, "%d\n", &LIB[i].codice_aut))>0 ){
                fgets(LIB[i].titolo, VETT, f);
                fscanf(f, "%d", &LIB[i].anno);
                fscanf(f, "%d", &LIB[i].visibile);
                printf("%d ", LIB[i].codice_aut);
                stream = stdout;
                for(p=LIB[i].titolo; (ch!=EOF)&&(*p!='\n');p++)
                        ch = putc(*p,stream);
                printf(" %d\n", LIB[i].anno);}
        fclose(f);
} 
E non mi aspetto che tutti la capiate!

 E non mi aspetto che tutti la capiate!
in effetti non capisco bene perche' testi ch !=EOF.
Inoltre non fai un test sul fatto che *p possa essere 0 e
questo e' potenzialmente pericoloso.
Infatti la fgets non aggiunge sempre il newline: se il titolo
e' lungo esattamente VETT-1 caratteri, allora la stringa
letta non conterra' il new-line.
E quindi il tuo ciclo in teoria puo' sforare.
Inoltre, da un punto di vista logico (considerando che uno potrebbe
voler usare  i titoli anche in un altro contesto) io preferirei
modificare LIB[i].titolo in modo che sia giusto, per non doverlo
stampare in modo non standard (andando a caccia di un potenziale
newline)  ogni volta che mi serve.
Per esempio:
(sotto linux, non ricordo il finelinea come viene gestito sotto win):
int s; ....
s = strlen(LIB[i].titolo);
if (s && LIB[i].titolo[s-1]=='\n') LIB[i].titolo[s-1]=0;
e cosi' dopo puoi usare la printf normale invece del ciclo.
ciao,
g,

Se devo essere sincero basta che il programma giri!
Però mi hai dato davvero dele ottime dritte per ottimizarlo!!!!! E te
ne chiedo un'altra!!!
Per modificare il record in un file ho provato a fare questa cosa qui:
Apro il file in lett e scritt "r+"
Leggo il file
Cerco l'elemento da modificare
se (l'elemento è quello che cerco)
   scrivo il record modificato
altrimenti 
   riscrivo il record senza modifiche!
Ma non funziona......
E ho dovuto fare una cosa del tipo:
Spostare gli elementi all'interno di un vettore,
fare un confronto tra elementi
riscrivere l'intero vettore con l'elemento modificato 
sul file....
E questa alternativa mi sembra davvero dubbia.....