Newsgroup: it.comp.lang.c
Titolo: update di un record

Hi,
sono poco più di un newbie del C...
sto scrivendo un programma che scrive e legge dei record su un file. Ora
avrei necessità  di scrivere  una funzione di  "update" che  aggiorni un
record  già precedentemente  scritto. Pensavo  di realizzarlo  usando la
combinazione di fseek e fwrite.
Il problema è che non ottengo  quello che voglio: il record viene sempre
accodato alla fine del file. Il codice che ho scritto è il seguente:
int rub_update(int rec, struct sct_rubricag ssct_rubricag)
{
	FILE *frubrica;
 
	if ((frubrica=fopen(RUBRICA,"rw")) == NULL)
	{
		printf("\n errore apertura file %s", RUBRICA);
		return -1;
	}
 
	fseek(frubrica, (rec - 1) * sizeof(struct sct_rubricag), SEEK_SET);
	fwrite(&ssct_rubricag, sizeof(ssct_rubricag), 1, frubrica);
 
	fclose(frubrica);
	return 0;
}
Dove sbaglio?
-- 
Vanni Brutto
| email 
za...@nofesso.libero.it
      |
| irc nick VanniB   |   ICQ 18526701 |
--- rimuovi nofesso per rispondere ---
---PC powered by Linux kernel 2.4.3---
Gesu':   "y=ax2+bx+c".  I   discepoli:
"Uffa, un'altra parabola!". 

}
Il secondo parametro e' un long:
fseek(frubrica, ((long)rec - 1) * sizeof(struct sct_rubricag),
SEEK_SET);
Sei sicuro che <rec> sia sempre > 0 ?
Sarebbe meglio passare il puntatore alla struttura.
ciao, acc.   
a...@libero.it

accodato alla fine del file. Il codice che ho scritto è il seguente:
Non dipende dal C, sono i file che funzionano in questo modo: fseek()
sposta il cursore di lettura, non quello di scrittura, che e` sempre
alla fine del file.
Il problema si risolve usando un file temporaneo, in cui ricopi il file
originario fino al record da modificare; poi scrivi nel file il record
modificato, quindi procedi con la copia (saltando il record nel file di
origine).
Oppure, se il file non è troppo grande, puoi leggerlo tutto in memoria,
quindi riscriverlo senza usare file temporanei.
-- 
Saluti,
    Mardy
http://www.interlingua.com

alla fine del file.
????????
Che cavolo stai dicendo ? in C e' possibilissimo scrivere su un
file "in mezzo" ... ci mancherebbe pure.
Per farlo pero' e' imporante aprire il file in modalita' binaria.
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

Dove sbaglio?
E' imporante aprire il file in modalita' binaria se vuoi che
fseek funzioni correttamente. Inoltre il parametro di apertura
dovrebbe essere "r+b" e non "rw".
HTH


 Per farlo pero' e' imporante aprire il file in modalita' binaria.
   Bella questa! E perche` mai?
--
Alla prossima,
Marco

   Bella questa! E perche` mai?
Il file aperti in modalita' testo hanno delle conversioni implicite
nelle operazioni di input/output e queste conversioni cambiano
anche il numero di caratteri scritti.
Un caso classico e' un carattere '\n' che scritto su un file di
testo diventa su alcuni sistemi una sequenza di due caratteri
(su Windows 0x0D + 0x0A) ... oppure si trasforma in un gran
numero di spazi o di 0x00 sino al raggiungimento della
dimensione di record del file (per file system basati su
record tipo MVS o MPE).
Ho sentito che ci sono anche sistemi in cui qualunque operazione
di scrittura effettuata su un file testo tronca il file da
quel punto in poi.


 dovrebbe essere "r+b" e non "rw".
E hai  ragione! :) Aprendo  il file con  "r+b" ora tutto  funziona a
meraviglia...
Già che  ci sono vi  chiedo dove posso  trovare un sito  con diversi
esempi di semplici (e sopratutto didattici) programmini C?
byeZ!
-- 
Vanni Brutto
| email 
za...@nofesso.libero.it
      |
| irc nick VanniB   |   ICQ 18526701 |
--- rimuovi nofesso per rispondere ---
---PC powered by Linux kernel 2.4.5---
Il Pentium V non potra' essere venduto
sul   territorio   nazionale   perche'
l'Italia ha detto NO al nucleare 

file "in mezzo" ... ci mancherebbe pure.
Mmmm... dici che si nota che non l'ho mai usata? ;-)
Probabilmente il fatto che all'apertura dei file il cursore di scrittura
sia sempre posizionato alla fine (sbaglio anche qui?) mi ha fatto
pensare che questo derivasse dall'impossibilità di scrivere "a metà"
file.


sia sempre posizionato alla fine (sbaglio anche qui?)
Sbagli nel pensare che i cursori siano due... il file
possiede UN puntatore.
--
Andrea Laforgia - walkietalkie(at)
libero.it
#exclude <windows.h>


ma quanti nickname usi?
ciao
donCiccio

ma quanti nickname usi?
Perche' ? hai problemi ?
--
Andrea Laforgia - walkietalkie(at)
libero.it
#exclude <windows.h>

 Perche' ? hai problemi ?
mentali, quelli si li ho! :-)
trovo piu' onesto non cambiare nick, cosi' chi legge/risponde ad una persona
che gia' conosce, sa come regolarsi.
ciao
donCiccio

che gia' conosce, sa come regolarsi.
E perche' mai dovrebbe "regolarsi" ?
Le persone sono tutte uguali e si risponde a ciascuna allo
stesso modo.


 stesso modo.
Credo che Andrea abbia ragione. Credo che uno sia libero di scrivere con il
nick che vuole. Credo anche che, nella maggior parte dei casi non ci si
debba regolare a seconda della persona alla quale si risponde.
Sono tuttavia convinto che Andrea non lo faccia per la semplice voglia di
cambiare nick (uno si puo' stufare dello stesso nick), ma solo perche' gli
piaccia giocare...
Credo si diverta a buttare sul NG un nuovo personaggio LongVehicle, lasciare
che tutte le persone che lo credano un "pivello", lo attacchino, per poi
difendersi in calcio d'angolo, con la buona conoscenza di C che ha Andrea,
mettendo in mostra il suo vero nick Andrea Laforgia e concludendo cosi' il
suo "schrezo".
Insomma, al massimo puo' essere considerato un comportamento infantile, ma
credo sia perfettamente legittimo.
LongVehicle a parte, che e' comparso da poco, eri sparito per qualche
giorno... mare ?!?
(ovviamente hai la facolta' di non rispondere ;-)
Alex


sono daccordo (ma come si scrive?),
intendevo dire che se gia' conosco chi ha postato, evito di tirar fuori
argomenti gia' trattati con quella persona (tipo diatribe sui gusti
personali), o comunque baso la mia risposta anche su cio' che si era detto
in precedenza.
ciao
donCiccio

suo "schrezo".
Non ti sembra di esagerare ?
Se cosi' fosse perche' mai avrebbe usato la solita 'signature' ?
(dimenticato l'exclude ? >:-> )
ciao, acc.   
a...@libero.it

 Se cosi' fosse perche' mai avrebbe usato la solita 'signature' ?
Se guardi i vecchi post di LongVehicle (non questo post) vedrai che prima
non c'era alcuna signature !
LongVehicle ha scritto messaggi in data 2,3 e 4 Luglio.
I messaggi del 2 e del 3 luglio (9 in tutto) sono senza signature. Quelli
del 4 luglio (7 in tutto) sono con la signature. Ora capisci cosa intendo
...
Vai ad esempio a vedere il post "anno bisestile" e vedrai come LongVehicle
magicamente dopo vari post del 3/07 alla fine (4/07) diventi firmato
Laforgia !
Noterai che fino ad un certo momento postava senza signature, poi l'ha
aggiunta.
Ad ogni modo questo e' un mio parere personale (dello scherzo) e potrebbe
essere sbagliato...
Riguardo al fatto di esagerare ... beh non vedo perche' usare la parola
"esagerare" non ho mica detto che ha fatto un reato, ho detto che si diverte
a fare scherzi. Qualche cosa in contrario ?!? (io personalmente preferisco
quando scherza rispetto a quando insulta, ma questo e' ancora un parere
personale !)
Alex

personale !)
Non ritengo sbagliato il tuo ragionamento, un sospetto mi sembra
lecito, ma fossi in te, prima di porre la questione, avrei atteso una
prova concreta.
Ammesso che l'intenzione di Andrea fosse stata quella, prima o poi lo
avresti saputo.
Cosi' si alimentano solo inutili attriti che non giovano a nessuno,
ognuno di noi fa degli errori (io ho una media piuttosto elevata come
puoi constatare dai miei post :-P).
Per quanto mi riguarda trovo interessanti i tuoi post come pure quelli
di Andrea.
ciao, acc.   
a...@libero.it

 ma quanti nickname usi?
Io ricordo anche uno SkyScraper... che mi aveva dato una mano con i codici
di Huffman :-)
-- 
 Ciao, Bianco.
 Reply to luca.bianco (at) 
tiscalinet.it

 di Andrea.
Ti ringrazio.
Per cio' che riguarda Andrea, concordo, molti suoi post sono interessanti ed
ha una ottima conoscenza del linguaggio C.
Credimi non parlavo in tono polemico.
Alex

credo sia perfettamente legittimo.
La prima cosa che faccio, appena finito di scrivere il mio
personale newsreader in Delphi, e' quella di mettere a punto un
bel kill-file per il solo gusto di sbattertici dentro.
La tua coglionaggine mi ha davvero rotto le palle, sparisci dal
newsgroup se ne hai la possibilita'. 
--
CyberWalkie - walkietalkie(at)
libero.it

prova concreta.
Lascia stare, e' scemo, non puo' capire.
--
CyberWalkie - walkietalkie(at)
libero.it