Newsgroup: it.comp.lang.c
Titolo: strano dovrebbe funzionare... qualcosa a basso livello?

Ciao ragazzi, e' la prima volta che posto sul NG e lo faccio perchè non
riesco a capire cosa non va nel seguente algoritmo.
Esso serve a correggere una specie di agenda
memorizzata in un file binario.
Premesso che i programmi di lettura e scrittura sono esatti e funzionano,
io vorrei capire perche' il seguente prog. non ha alcun effetto sul file ma
me lo lascia come era prima.
N.B:io non voglio sapere come farlo funzionare ma bensi' il perchè non
funziona.
NOTE:  dalla esecuzione step by step si nota che tutto avviene
    come prestabilito , nel caso venga trovato il nome cercato
    vengono richiesti i nuovi dati , l'fwrite viene eseguita,
    trovato e' posto a 1, il programma rifà il controllo del
    ciclo while, eseguendo un'altra volta anche l'fread.
    successivamente avviene l'fclose che pero' non ha effetto
    (come si nota esaminando il file con un programma di lettura).
Io penso che il bug stia nell'istruzione di lettura presente nelle
condizioni del while:
se infatti al posto di /* ISTRUZ. SOTTO ACCUSA*/   mettiamo prima la condiz.
(trovato==0)
e poi l'fread in modo che essa quando viene trovato il nome non venga
eseguita, il file viene correttamente modificato.
(lo stesso avviene con un break alla fine del ciclo o con un fflush
nell'if).
Quello che non capisco è che dato che l'fread ha solo il compito di leggere
un record e spostare il cursore del file, essa non dovrebbe incidere
per niente sul buffer del file che dovrebbe quindi
essere salvato tale e quale era prima della lettura all'esecuzione di
fclose.
Perche' mai cio non avviene?  Ovverosia: cosa mi combina l'fread
che mi scombussola tutto il prg???
#include <math.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
FILE *fptr;
 struct pippo
        {
         char nome[20];
         char indirizzo[30];
         char nro_tel[15];
         int var;
        }agenda;
main()
 {
  long int lung;
   int trovato=0;
   char pers[20];
      if((fptr=fopen("AGENDA","rb+"))==NULL)
       {
        printf("NON RIESCO AD APRIRE IL FILE\n");
        exit(0);
       }
      printf("NOMINATIVO DA CORREGGERE:");
      gets(pers);
      while((fread(&agenda,sizeof(struct pippo),1,fptr)!=0)&&(trovato==0))
/*ISTRUZ. SOTTO ACCUSA*/
      {
            if(strcmp(pers,agenda.nome)==0)
                {
                printf("NOMINATIVO:");
                gets(agenda.nome);
                printf("INDIRIZZO:");
                gets(agenda.indirizzo);
                printf("NUMERO TELEFONICO:");
                gets(agenda.nro_tel);
                agenda.var=1;
                lung=sizeof(struct pippo);
                fseek(fptr,-lung,SEEK_CUR);
                fwrite(&agenda,sizeof(struct pippo),1,fptr);
                trovato=1;
            }
        }
      if(trovato==0)
         {
           printf("\n   -NOMINATIVO NON TROVATO\n");
           getch();
         }
      fclose(fptr);
   }
/*---------------------------------------*/
Sartirana Massimiliano
sar...@hotmail.com
(togliere .antispam nel reply-to)

     (come si nota esaminando il file con un programma di lettura).
Il controllo dei parametri in un test avviene da sinistra a destra, se tieni
fread
all'interno del test questa ti viene eseguita. Trucco se metti prima
(trovato == 0)
dovrebbe funzionare: la valutazione si ferma generalmente alla prima
clausola negativa,
in ogni caso non e' un modo pulito di lavorare.

 wrote in message
864qa8$97k$1...@fe1.cs.interbusiness.it...


 funziona.
Il programma scritto cosi' com'e funziona benissimo,senza fread prima o dopo e
via dicendo.
Il problemi che ti fa scemunire credo che sia che tu stai usando un debbugger
tipo borland c++,che quando va ad eseguire operazioni sui file li esegue per
default nella direcory bin del compilatore,quindi il file che hai nella tua
directory non viene modificato e  a te sembra che il programma non abbia fatto
nulla.Prova ad eseguirlo cosi' com'e sotto prompt del dos nella sua directory
corrente con un file agenda nella stessa directory,vedrai che le modifiche al
file vengono eseguite.
Ivan Molella

 wrote in message
38865A22...@tin.it...


 e la soluzione sembra non esserci..
Io il programma l'ho provato cosi' com'e' e funziona bene,tranne quando e' fatto
partire dall'ambiente borland c++ 2.0 per le ragioni che ti ho detto.
Tu che compilatore usi?
La soluzione che ti ho postato puo' anche non fare al tuo caso,pero' la
proverei  prima di dire che non e'.
Ivan Molella

 wrote in message
388764AA...@tin.it...


 e come si puo risolvere?
Potresti dare ai files da aprire un path completo(la cosa sempre piu' giusta da
fare),
e se anche cosi' ti da probelmi potresti postare il codice dei tuoi
sorgenti(tutti quelli coinvolti con il file agenda) e gli si da' un occhiata.
Ivan Molella

 primario ossia bcc che sta in bin.
ho capito cosa intendi ma il problema e' che compilando il programma con
borland,
CHIUDENDO il BORLAND, ed eseguendo il  file correz.exe dal dos prompt
nella sua directory di lavoro, il prog NON FUNZIONA lo stesso
Probabilmente l'errore e' comunque legato al compilatore perche compilando
con lccwin
il prog funziona.
MA C'E' DI PIU!!
prova a leggere il seguente listato !!!!
e' uguale a quello dell'altra volta, ho solo aggiunto una
INUTILISSIMA fseek che lascia il cursore del file dove lo trova e.....
indovina un po....   IL PROG FUNZIONA PERFETTAMENTE
anche in ambiente borland.....  INSPIEGABILE!!!
boh non ci capisco piu niente.
qualche spiegazione plausibile????
#include <math.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
FILE *fptr;
 struct pippo
        {
         char nome[20];
         char indirizzo[30];
         char nro_tel[15];
         int var;
        }agenda;
main()
 {
  long int lung;
   int trovato=0;
   char pers[20];
      if((fptr=fopen("AGENDA","rb+"))==NULL)
       {
        printf("NON RIESCO AD APRIRE IL FILE\n");
        exit(0);
       }
      printf("NOMINATIVO DA CORREGGERE:");
      gets(pers);
      while((fread(&agenda,sizeof(struct pippo),1,fptr)!=0)&&(trovato==0))
      {
            if(strcmp(pers,agenda.nome)==0)
                {
                printf("NOMINATIVO:");
                gets(agenda.nome);
                printf("INDIRIZZO:");
                gets(agenda.indirizzo);
                printf("NUMERO TELEFONICO:");
                gets(agenda.nro_tel);
                agenda.var=1;
                lung=sizeof(struct pippo);
                fseek(fptr,-lung,SEEK_CUR);
                fwrite(&agenda,sizeof(struct pippo),1,fptr);
                fseek(fptr,0L,SEEK_CUR);                         //
AAAAAAARRRGHHH...   FUNZIONE INUTILE AGGIUNTA.....
