Newsgroup: it.comp.lang.c
Titolo: fseek e rewind

Ciao a tutti,
sono nuovo nel mondo della programmazione e del C.
Volevo sapere se le due funzioni:
1) fseek(Fp1, 0, SEEK_SET);
2) void rewind(FILE *Fp1);
avrebbero svolto la stessa procedura.
Ho un programma che gestisce una rubrica, ma se uso la prima, mi riporta la
testina all'inizio del file, mentre la seconda non fa assolutamente nulla.
In caso di bisogno vi posto tutto il codice.
Grazie mille a tutti delle risposte
Ciao Morpheus

 2) void rewind(FILE *Fp1);
Sono equivalenti.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
Beh devi specificare però che lo sono SOLO se usi fseek con
quei parametri...;-)

 quei parametri...;-)
Un'invocazione di rewind sul file Fp1 equivale alla chiamata fseek()
riportata.  Non capisco proprio che cosa dovrei specificare.
E' ovvio, poi, che fseek() e rewind() siano due funzioni _diverse_, in
assoluto.


 Sono equivalenti.
Volendo proprio fare una "laforgiata" potremmo aggiungere
che per la precisa precisione sono equivalenti a parte
il fatto che rewind in piu' resetta l'indicatore di
errore dello stream (tipo EOF).
(Non e' che lo sapevo. Ho guadato man rewind...)
ciao,
g.

 
Intendevo proprio questo!
Sai...il newsgroup è frequentato da persone che non vanno al di là di
quello che leggono; quindi, onde evitare casini, meglio essere più
dettagliati. :-)

 ha scritto nel messaggio
news:d8s74l$qtj$1...@newsfeed.cineca.it...
Il codice sorgente lo trovate 
http://nopaste.info/index.php?id=afe97f5890
Come ripeto se uso fseek funziona se uso rewind no...
Grazie dell' aiuto.
Ciao Morpheus

 Come ripeto se uso fseek funziona se uso rewind no...
Come già detto, quelle due chiamate sono equivalenti, quindi NON funziona
neanche con fseek().  Il problema è la modalità di accesso al file "a+". 
Fa sì che i dati scritti siano scritti sempre in coda al file e NON dalla
posizione del puntatore.  Se tu cambiassi la modalità da "a+" a "w+"
noteresti la differenza.
Se nel tuo caso i comportamenti sono distinti, è per colpa del compilatore
che non è conforme allo standard.  Ricordati anche che fflush() su degli
stream di input ha un comportamento indefinito, quindi sulla tua macchina
potrebbe funzionare e su un'altra far uscire i demoni dal naso.


 avrebbero svolto la stessa procedura.
Si.
-- 
Horst

 potrebbe funzionare e su un'altra far uscire i demoni dal naso.
Io (dietro consiglio del prof.) uso Dev c++ 4.9.9.2, ma ho provato anche con
ming studio e lcc-win32, ma stessa cosa con fseek funziona e con rewind no,
e ti posso assicurare che sul mio pc con fseek funziona.
Che le due chiamate sono equivalenti sono daccordo con te, infatti è per
questo che ho postato siccome sono ancora all'inizio con la programmazione
con il C.
Provo a compilarlo su un' altro pc e vedere come si comporta.
Grazie a tutti per le risposte, siete stati gentili :)
Ciao
Morpheus

Morpheus ha scritto:
[...]
[...]ti posso assicurare che sul mio pc con fseek funziona.
E' semplicemente impossibile.  
Dimmi che risultati hai con questo test:
#include <stdio.h>
#define FSEEK_FILE_NAME "fseek_test"
#define REWIND_FILE_NAME "rewind_test"
#define STRING1 "pippo"
#define STRING2 "pluto"
int main()
{
    FILE *fseek_file;
    FILE *rewind_file;
 
    printf("test fseek():\n");
    fseek_file=fopen("fseek_test", "a+");
    if (fseek_file)
    {
       int i;
       printf("ftell() iniziale: %d\n", ftell(fseek_file));            
       fputs(STRING1, fseek_file);
       printf("ftell() dopo scrittura di \"%s\": %d\n", STRING1,
ftell(fseek_file));       
       fseek(fseek_file, 0, SEEK_SET);       
       printf("ftell() dopo fseek(): %d\n", ftell(fseek_file));
       fputs(STRING2, fseek_file);
       printf("ftell() dopo scrittura di \"%s\": %d\n", STRING2,
ftell(fseek_file));
       fseek(fseek_file, 0, SEEK_SET);       
       printf("ftell() dopo fseek(): %d\n", ftell(fseek_file));
       printf("byte letti: ");
       for (i=0; i<5; i++)
         putchar(fgetc(fseek_file));
       printf("\n\n");              
       fclose(fseek_file);            
    }
 
    printf("test rewind():\n");
    rewind_file=fopen("rewind_test", "a+");
    if (rewind_file)
    {
       int i;
       printf("ftell() iniziale: %d\n", ftell(rewind_file));            
       fputs(STRING1, rewind_file);
       printf("ftell() dopo scrittura di \"%s\": %d\n", STRING1,
ftell(rewind_file));       
       rewind(rewind_file);       
       printf("ftell() dopo rewind(): %d\n", ftell(rewind_file));
       fputs(STRING2, rewind_file);
       printf("ftell() dopo scrittura di \"%s\": %d\n", STRING2,
ftell(rewind_file));
       rewind(rewind_file);       
       printf("ftell() dopo rewind(): %d\n", ftell(rewind_file));
       printf("byte letti: ");
       for (i=0; i<5; i++)
         putchar(fgetc(rewind_file));
       printf("\n\n");              
       fclose(rewind_file);            
    }
 
    getchar();
 
  return 0;
}
Io, compilando con Dev C++, ottengo il seguente output:
test fseek():
ftell() iniziale: 0
ftell() dopo scrittura di "pippo": 5
ftell() dopo fseek(): 0
ftell() dopo scrittura di "pluto": 10
ftell() dopo fseek(): 0
byte letti: pippo
test rewind():
ftell() iniziale: 0
ftell() dopo scrittura di "pippo": 5
ftell() dopo rewind(): 0
ftell() dopo scrittura di "pluto": 10
ftell() dopo rewind(): 0
byte letti: pippo



Stesso identico output.
Ciao
Morpheus

 Stesso identico output.
Quindi, come volevasi dimostrare, fseek() e rewind() funzionano allo
stesso modo anche da te.



Allora perchè se lancio il codice che ti ho postato con la funzione fseek il
programma funziona e dopo aver inserito i nomi me li rilegge in modo
corretto.
Esempio di output con fseek:
Il puntatore (*Fp1) al file rubrica.txt e' 2009246944
Inserire Nome: Paperino
Inserire Cognome: Topolino
Inserire TEL: 23423423423
Finito? S(i) oppure N(o) --> s
Rubrica:
Emanuel Siccardi, 
339/6241209
pinco pallino, 32453762
Pinco Pallo, 234567890
Pinco Pallino, 3456789
Paperino Topolino, 23423423423
Mentr invece con rewind:
Il puntatore (*Fp1) al file rubrica.txt e' 2009246944
Inserire Nome: Paperino
Inserire Cognome: Topolino
Inserire TEL: 23423423423
Finito? S(i) oppure N(o) --> s
Rubrica:
la parte sottostante a rubrica è vuota e la console dopo 1 secondo si chiude
da sola.
Ancora grazie per il tempo che mi hai concesso, sei molto gentile.
Ciao Morpheus

 Allora perchè se lancio il codice che ti ho postato[...]
A parte il fatto che hai sollevato un polverone su fseek() e rewind()
quando ti saresti potuto accorgere da solo che il problema non è lì: le
due funzioni si riposizionano correttamente all'inizio del file, tant'è
vero che leggi le stesse informazioni.  Butta via quel fflush(stdin) e usa
lo svuotamento del buffer di input dopo ogni lettura con scanf(). 
Qualcosa del tipo:
void flush_input_buffer()
{
  while (getchar()!='\n') 
     ;
}
Vedrai che funziona.


 Vedrai che funziona.
Non era assolutamente mia intenzione sollevare alcun polverone, ma solo
cercare di capire il mio errore.
Purtroppo come ho già scritto sono appena entrato nel mondo della
programmazione e se avessi saputo dov' era l' errore, senz' altro non avrei
postato.
Non mi sarei mai accorto dell' errore dello svutamento del buffer se non me
lo dicevi tu, forse perchè ho ancora molto da imparare.
Cmq ti ringrazio delle delucidazioni, sei stato molto disponibile.
Ciao e buon lavoro
Morpheus

[...]forse perchè ho ancora molto da imparare.
E' solo perché hai un professore coglione... ;-)



E' probabile ;-P
Ciao
Morpheus

 "In una scala da uno a dieci, puoi pensare a me come a un undici."
Ah sì ?...in realtà ritenevo già che nella scala da 1 a dieci dei coglioni
tu fossi l'undicesimo.  Grazie per avermelo ricordato.  In realtà, credo
che il valore sia di molto sottostimato.


 
Capisce cosa sto dicendo, capitano?  Siamo tornati.
                 -- Il comandante T'Bok, "The Neutral Zone",
                    data astrale 41986.0


 ha scritto nel messaggio
news:mPAse.18001$TR5....@news.edisontel.com...

Rettifico il cogl...e non è lui, SONO IO !!!
Ciao
Morpheus

>  "laforgiata" 
ROTFL
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG