Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] Fread e fwrite

    Ciao a tutti,

    secondo voi ce una ragione in particolare per cui la fwrite debba essere ignorata dopo una fread?

    mi spiego, codice:

    Codice PHP:
     fseek(fptr,(record)*sizeof(person),SEEK_SET);
    fread(&people,sizeof(person),1,fptr);
     if(
    strcmp(people.lastname,"")==0)
       
    printf("No info");
    printf("Inserire nome cognome ed eta da sostituire");
    scanf("%s %s %s",people.lastname,people.firstname,people.age);
    fwrite(&people,sizeof(person),1,fptr); 
    in questo maniera ignora la fwrite...se pero prima della fwrite ci metto un altro

    fseek(fptr,(record)*sizeof(person),SEEK_SET);

    allora funziona tutto benissimo....

    Ora va bene che la fseek porta il puntatore nel punto corretto al quale modificare il record nel file...ma perche dopo la fread la fwrite viene ignorata? Anche se la fread mi porta il puntatore al record sbagliato perche la fwrite non deve scrivere?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Cosi' come l'hai detto, non e' facile darti una risposta.

    Intanto, non dici come fai ad essere sicuro che non ha scritto.
    Dato che scrivi una struttura, devi controllare il contenuto binario del file dei dati ...

    Inoltre, recupera il valore restituito dalla fwrite ed esamina anche se esiste un errore con GetLastError.

  3. #3
    Originariamente inviato da oregon
    Cosi' come l'hai detto, non e' facile darti una risposta.

    Intanto, non dici come fai ad essere sicuro che non ha scritto.
    Dato che scrivi una struttura, devi controllare il contenuto binario del file dei dati ...

    Inoltre, recupera il valore restituito dalla fwrite ed esamina anche se esiste un errore con GetLastError.
    eh guarda alla fine faccio un semplice ciclo di stampa

    rewind(fptr);
    for(i=1;i<=10;i++)
    {
    fread(&people,sizeof(person),1,fptr);
    printf("%s %s %s\n",people.lastname,people.firstname,people.age) ;
    }

    e mi ritrovo solo i due record immessi(e un miniciclo da due iterazioni che precede il codice postato prima) e con gli altri record vuoti.
    Adesso vedo che dice la GetLastError....Cmq non ero in errore quando dicevo che almeno in TEORIA non ci sarebbe motivo per cui la fwrite non debba scrivere dopo la fread no?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non hai risposto alle mie domande ... come facciamo a continuare il discorso se non so come esamini il file in output ... ?

  5. #5
    Originariamente inviato da oregon
    Non hai risposto alle mie domande ... come facciamo a continuare il discorso se non so come esamini il file in output ... ?
    ops, lo guardo semplicemente con notepad, il file lo salvo come .txt...

    ah cmq ho usato getlasterror dopo la fwrite, ho messo l errore in una Dword e debuggando mi ha dato il numero 183...che andando a spulciare nel listone degli errori corrisponde a

    ERROR_ALREADY_EXISTS
    183 Cannot create a file when that file already exists.

    Pero...dico io.... chi gli dice che deve creare il file?

    e la cosa che mi lascia un po perplesso e il fatto che facendo precedere la fseek tutto funziona a meraviglia...cmq posto tutto il codice forse e meglio...

    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <windows.h>



    int main()
    {
      
    typedef struct person{
             
    char lastname[15];
             
    char firstname[15];
             
    char age[4];
             };
      
      
    char cogn[15];
      
    int i,record,items;
      
    FILE *fptr;
      
    DWORD pippo;
      
      
      
    person people={"","","0"}; //INIZIALIZZO STRUTTURA
      
      
      
    fptr=fopen("c:\\nameage.txt","wb+");
       
      
      for(
    i=1;i<=10;i++) //INIZIALIZZO FILE
       
    {
        
    items=fwrite(&people,sizeof(person),1,fptr);
       }
       
      
    printf("%d\n",items);
      
    rewind(fptr);
      for(
    i=1;i<=2;i++) //METTO DUE RECORD PER PROVA
      
    {
       
    printf("Inserire nome cognome ed eta");
       
    scanf("%s %s %s",people.lastname,people.firstname,people.age);
       
    items=fwrite(&people,sizeof(person),1,fptr); 
      }
      
    printf("%d\n",items); // QUESTE STAMPA MI DICONO SE EFFETTIVAMENTE LA FWRITE FUNZIONA
      
    rewind(fptr);
      
    printf("Inserire il record da cercare "); //ORA PROVO UNA RICERCA
      
    scanf("%d",&record);
      
      
    fseek(fptr,(record)*sizeof(person),SEEK_SET);
      
    fread(&people,sizeof(person),1,fptr);
      if(
    strcmp(people.lastname,"")==0)
       
    printf("No info");
      
      
      
    printf("Inserire nome cognome ed eta da sostituire");
      
    scanf("%s %s %s",people.lastname,people.firstname,people.age);
      
    items=fwrite(&people,sizeof(person),1,fptr); // SENZA LA FSEEK DAVANTI VIENE IGNORATA
      
    pippo=GetLastError(); // METTO IN PIPPO L EVENTUALE ERRORE
      
    printf("%d\n",items);
      
       
    rewind(fptr);
       for(
    i=1;i<=10;i++) // STAMPO IL CONTENUTO DEL FILE
       
    {
        
    fread(&people,sizeof(person),1,fptr);
        
    printf("%s %s %s\n",people.lastname,people.firstname,people.age);
       }
      
      
    rewind(fptr);
        
      
    fflush(fptr);
      
    fclose(fptr); // CHIUDO TUTTO
      
      
    system("pause");
      


  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non capisco come tu faccia ad eseguire questo programma dato che la open

    fptr=fopen("c:\nameage.txt","wb+");

    fallisce e fptr restituisce NULL ...

    Il nome del file, in questo caso deve essere

    fptr=fopen("c:\\nameage.txt","wb+");

    e comunque tu devi controllare il valore di fptr in uscita ...

    Inoltre, alcuni warning ...

    1) la typedef, scritta cosi'

    typedef struct person{
    char lastname[15];
    char firstname[15];
    char age[4];
    };

    non serve perche' non definisci nessun tipo di dati. Devi scrivere qualcosa del genere

    typedef struct _person{
    char lastname[15];
    char firstname[15];
    char age[4];
    } person;


    2) la variabile items e' bene che sia di tipo size_t e non int

    3) la variabile cogn[15] non e' mai usata

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.