View Full Version : scrivere un vettore...
ciottano
16-02-2004, 22:48
di 3011 componenti in un file con 60 celle per riga. come si fa la formattazione? Il linguaggio è C. grazie mille
Cioè come è composta ogni riga ? Che tipo di dati ci vuoi mettere in ogni posizione ? Questi numeri li devi poi rileggere ?
ciottano
17-02-2004, 08:45
Ho un vettore di 3011 celle di numeri interi (le cifre del risultato di 2^10000) e devo riportare tale numero in un file di testo con formattazione di 60 cifre per riga. Ho risolto per ora cosi
for (n=0; n<=3010; n++)
{
fprintf(dat,"%i",a[n]);
fprintf(bin,"%i",a[n]);
i=i++;
if (i==60)
{
fprintf(dat,"\n");
i=0;
}
ma volevo sapere se c'era un metodo migliore per farlo. In fortran 90 c'è proprio una formattazione adeguata (60I1), ma il C lo conosco poco poco e nn so dove mettere le mani.
Inoltre per scrivere un file in formato binario, basta aggiungere il suffisso b nella linea dell'fopen all'operazione che si vuole eseguire su quel file e niente altro? Per esempio scrivendo bin=fopen("ciao.bin","wb") e lasciando tutto il resto per la gestione dei files invariato? grazie mille.
ciottano
17-02-2004, 09:05
Il file dovrebbe venire come questo fatto in Fortran 90
Devi usare un file ASCII:
dat=fopen("ciao.dat","wb");
Inoltre, definendo
int a [3011];
short i;
short n;
ed essendo il vettore 'a' già valorizzato precedentemente (ogni elemento è di una cifra?), si fara:
for (n=0; n<3011; ) {
i=0;
while (i<60) {
fprintf (dat, "%d", a[n++]);
i++;
}
fprintf (dat, "\n");
}
Ciao :)
ciottano
17-02-2004, 12:00
Il file binario nn mi funziona ancora, lo scrive come un file ascii.
Originariamente inviato da ciottano
Il file binario nn mi funziona ancora, lo scrive come un file ascii.
Infatti come te l'ho spiegato io viene creato SOLO come file ascii.
Perché (a che ti serve?) vuoi il file binario?
ciottano
17-02-2004, 17:51
si miserve il file binario perche devo scrivere, per un esame, un programma che mi calcoli 2 alla 10000 e mi scriva il risultato in un file asci con su ogni riga 60 cifre del numerone che viene fuori ed anche in un file binario.
In fortran sono riuscito a fare tutto, ed anche per il C leggendo nel manuale in linea ho trovato che bisogna solo aggiungere come suffisso all'operazione da compiere (in questo caso scrivere su file) la b ("wb").
Per avere il file binario basta aggiungere la fprintf() relativa:
bin=fopen("ciao.bin","wb"); /* File binario */
dat=fopen("ciao.dat","w"); /* File ASCII */
for (n=0; n<3011; ) {
i=0;
while (i<60) {
fprintf (bin, "%d", a[n]);
fprintf (dat, "%d", a[n]);
n++;
i++;
}
fprintf (dat, "\n");
}
ciottano
18-02-2004, 11:01
Proverò, grazie. ;)
ciottano
18-02-2004, 17:56
Ciao, senti la scrittura su file in modalità binaria nn mi funziona, sembra che nn serva solo aggiungere la b nell'apertura del file.
Originariamente inviato da ciottano
Ciao, senti la scrittura su file in modalità binaria nn mi funziona, sembra che nn serva solo aggiungere la b nell'apertura del file.
Che vuol dire che non funziona? Cosa ottieni? Cosa ti aspetti?
ciottano
19-02-2004, 09:30
Allora mi aspetto che venga fuori un file come nel caso del fortran 90 che allego. Cmq adesso come adesso mi viene, utilizzando il suffisso b alla modalità di scrittura, solo un file con dentro il vettore ma in formato ascii, cioè come nel caso del file puntato da dat. Cmq allego anche il listato che funziona egregiamente tranne che per la scrittura del file binario.
Ecco il listato
ciottano
19-02-2004, 09:32
il file binario dovrebbe venire come questo che ho fatto col fortran
Per la scrittura del file binario, puoi procedere anche nel seguente modo:
aggiungi:in cima al programma:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
e poi sostituisci
FILE * bin;
...
bin=fopen("2_10000.bin","wb");
...
fprintf(bin,"%d",a[n]);
...
fclose (bin)
con
int bin;
bin = open ("2_10000.bin", O_WRONLY | O_CREAT)
...
write (bin, a, sizeof (a)); /* FUORI DA OGNI LOOP */
...
close (bin)
ed esegui. ATTENZIONE: l'istruzione write() deve essere fuori da ogni loop! (magari prima della relativa close())
Ti allego il file binario che ho ottenuto
ciottano
19-02-2004, 14:47
Ok, il file sembra essere lui, nelle dimensioni è identico a quello ottenuto con fortran. potresti spiegarmi cosa hai fatto? sai dovrei ripeterlo al prof e nn posso dire nn lo so. cmq strano che ci voglia tutto questo casino per scrivere un file binario, molto meglio il fortran :D
Originariamente inviato da ciottano
Ok, il file sembra essere lui, nelle dimensioni è identico a quello ottenuto con fortran. potresti spiegarmi cosa hai fatto? sai dovrei ripeterlo al prof e nn posso dire nn lo so. cmq strano che ci voglia tutto questo casino per scrivere un file binario, molto meglio il fortran :D
Te l'ho spiegato nell'ultimo msg.
Prendi il tuo sorgente e lo modifiche come te l'ho detto io.
Ti assicuro che il C non è assolutamente più incasinato del fortran... basta prenderci la mano!
ciottano
19-02-2004, 14:57
L'ho provato ora. Nn riesce ad includere unistd.h, ho provato a toglierlo e mi dice coll to funcion "Xxxxx" whit no prototype.
L'ho fatto girare lo stesso e mi funziona, cioè salva i due file binario ed ascii. Grazie mille cmq.
ciottano
19-02-2004, 14:59
Si ho capito come fare manualmente ma tutte qelle chiamate ai file *.h....insomma cosa è cambiato da prima? garzie
Originariamente inviato da ciottano
Si ho capito come fare manualmente ma tutte qelle chiamate ai file *.h....insomma cosa è cambiato da prima? garzie
Ho un'idea migliore: nel tuo codice sorgente utilizza la fwrite() in luogo della fprintf() relativa al file binario e lascia tutto il resto invariato. Ecco la riga di istruzione che devi sostituire (non ricordo se l'indice dell'array è 'n' oppure 'i')
fwrite (&a[i], sizeof(int), 1, bin);
ossia: "scrivi 1 elemento del verrore 'a' (il contenuto di a[i]), la cui dimensione è quella di un intero"
Adesso purtropo non ho tempo. Se posso, ti mando il file corretto, ma non so se faccio in tempo
Ciao
ciottano
19-02-2004, 16:25
Grazie veramente gentile
ciottano
19-02-2004, 16:30
Ho provato ora e funziona alla perfezione. Poi sul manuale do uno sguardo a fwrite da cosa differisce da fprintf (forse nn prevede formattazione?). Grazie mille ancora, ciao.
la fprintf non consente scritture su file binari, la fwrite si
ciottano, C e C++ buttali nel Cesso ! :D
ciottano
21-02-2004, 15:53
Perche mi dici cosi? Proprio ora che volevo imparare il lingauggio, che secondo me è importante. Dico seriamente, perchè questa affermazione?
Originariamente inviato da a2000
ciottano, C e C++ buttali nel Cesso ! :D
Intanto con il linguaggio C ci si scnvono i sistemi operativi (Unix, linux...).
Non esiste IL Linguaggio migliore per antonomasia. Sicuramente il C richiede molta più attenzione (a causa del fatto che è possibile interagire direttamente con l'HW) nella programmazione che non altri come il VB.
Vai tranquillo, imparatelo perché è un must!
xybercom
21-02-2004, 19:34
Originariamente inviato da ciottano
Perche mi dici cosi? Proprio ora che volevo imparare il lingauggio, che secondo me è importante. Dico seriamente, perchè questa affermazione?
Non prendere a2000 troppo seriamente, lui è abituato a usare le schede perforate per programmare i computer...
No...a2000 è abituato ad usare le formule matematiche per prorammare il computer ;)
ciottano
22-02-2004, 13:49
Quindi questo utente è noto per dire corbellerie? Io cmq procedo nell'apprendimento. Ciao a tutti!!!
Originariamente inviato da ciottano
Quindi questo utente è noto per dire corbellerie?
No...non dice corbellerie... E' noto per avere un approccio un po' particolare alla programmazione...ma soprattutto per odiare C e C++...
ciottano
22-02-2004, 14:08
Su di un libro ho trovato scritto che alcuni programmatori definiscono il C un Assembler vestito a festa :D
Secondo me non è così...sicuramente sis crive a basso livello, ma non a livello così basso ;)
Originariamente inviato da ciottano
Su di un libro ho trovato scritto che alcuni programmatori definiscono il C un Assembler vestito a festa :D
In un certo senso è vero.. basti pensare che in un programma C puoi scrivere anche codice direttamente in assembler mischiandolo con quello in C (utilizzando la keyword "_asm", mi pare). Non so quanti altri linguaggi ti danno questà libertà di pensiero..., sicuramente molto pochi (almeno tra quelli commerciali).
ciottano
22-02-2004, 17:05
Carina la sign, The Prisoner vero? ciao :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.