Multi Forum Altomesima - lettura file binari non formattati
Multi Forum Altomesima
Multi Forum Altomesima
Home | Profilo | Discussioni attive | Utenti | Cerca | FAQ
Nome Utente:
Password:
Salva Password
Dimenticato la tua Password?

 Tutti i forum
 Linguaggi di programmazione
 Linguaggio C
 lettura file binari non formattati
 Nuova Discussione  Rispondi
 Versione Stampabile
Autore Discussione Precedente Discussione Discussione Successiva  

frea
Junior Member

22 Messaggi

Inviato il il 07/11/2003 :  19:38:00  Guarda il profilo di  Rispondi Citando
Salve! Qualcuno sa come si fa a leggere file binari "non formattati" in linguaggio c?

Con tali istruzioni
....
FILE *fp;
int a;
if ((fp=fopen("prova.bin","rb"))==NULL){
printf("Impossibile aprire il file.\n");
exit(1);
}

fread (&a,sizeof(int),1,fp);
....

legge effettivamente un numero intero, ma il numero letto non ha senso (č o troppo grande o troppo piccolo rispetto a quanto dovrebbe leggere). Secondo me č perchč non riesco a dirgli che il file č non formattato. In fortran c'č l'opzione "unformatted" da inserire all'apertura del file. In c c'č qualcosa di simile?

mimc
Forum Admin

Italy
458 Messaggi

Inviato il 08/11/2003 :  00:44:23  Guarda il profilo di  Visita il Sito di mimc  Rispondi Citando
Ciao,

Questo č un mio esercizio fatto tempo fa, che dovrebbe andare bene:

/*Scrivete un programma in C, che salva su un un file binario N numeri interi acquisiti da input e memorizzati in un array ed apri il file binario per stamparli a video.


Suggerimento utilizzate 3 funzioni di nome: inserisci_in_array; crea_file; apri_file*/


#include

#define N 15
char nome_file[] ="file_int.dat";
int vector[N];

void inserisci_in_array();
void crea_file();
void apri_file();

int main()
{
char car;
inserisci_in_array();
crea_file();
apri_file();
scanf("\n%c",&car);
return 0;
}
void inserisci_in_array()
{
int i;

printf("\ninserite gli %d elementi interi dell'array\n",N);
for(i=0; i {printf("%d) ",i+1);
scanf("%d",&vector[i]);
}
}

void crea_file()
{
FILE *fp;
int i=0;


if((fp=fopen(nome_file,"wb"))!=NULL){
fwrite(vector,sizeof(int),N,fp);
fclose(fp);
}
else
printf("errore nell'apertura in scrittura del file %s ",nome_file);
}

void apri_file()
{
FILE *fp;
int i;
if((fp=fopen(nome_file,"rb"))!=NULL)
{
while(fread(vector,N*sizeof(int),1,fp)==1)
{for(i=0;iprintf(" %d) %d ",i+1,vector[i]);
}
fclose(fp);
}
else printf("errore nell'apertura del file %s in lettura",nome_file);
}

Torna all'inizio della Pagina

frea
Junior Member

22 Messaggi

Inviato il 08/11/2003 :  10:43:57  Guarda il profilo di  Rispondi Citando
Grazie della risposta.... ma il tuo programma non funziona...
Torna all'inizio della Pagina

mimc
Forum Admin

Italy
458 Messaggi

Inviato il 08/11/2003 :  15:47:14  Guarda il profilo di  Visita il Sito di mimc  Rispondi Citando
Scusa,
nel copia ed incolla, sono scomparse alcune cose tipo
stdio.h, per via delle parentesi angolari.

per cui la prima istruzione del programma č:

#include"stdio.h"
metto fra apici ' ' le parentesi angolari scomparse, naturalmente gli apici non fanno parte del codice.

........................


#include'<'stdio.h'>'

#define N 15
char nome_file[] ="file_int.dat";
int vector[N];

void inserisci_in_array();
void crea_file();
void apri_file();

int main()
{
char car;
inserisci_in_array();
crea_file();
apri_file();
scanf("\n%c",&car);
return 0;
}
void inserisci_in_array()
{
int i;

printf("\ninserite gli %d elementi interi dell'array\n",N);
for(i=0; i'<'N;i++)
{printf("%d) ",i+1);
scanf("%d",&vector[i]);
}
}

void crea_file()
{
FILE *fp;
int i=0;


if((fp=fopen(nome_file,"wb"))!=NULL){
fwrite(vector,sizeof(int),N,fp);
fclose(fp);
}
else
printf("errore nell'apertura in scrittura del file %s ",nome_file);
}

void apri_file()
{
FILE *fp;
int i;
if((fp=fopen(nome_file,"rb"))!=NULL)
{
while(fread(vector,N*sizeof(int),1,fp)==1)
{for(i=0;i'<'N;i++)
printf(" %d) %d ",i+1,vector[i]);
}
fclose(fp);
}
else printf("errore nell'apertura del file %s in lettura",nome_file);
}

Torna all'inizio della Pagina

frea
Junior Member

22 Messaggi

Inviato il 12/11/2003 :  22:33:46  Guarda il profilo di  Rispondi Citando
Grazie mille, ora ho il problema che devo passare da big endian a little endian, sai come potrei fare?
Torna all'inizio della Pagina

mimc
Forum Admin

Italy
458 Messaggi

Inviato il 13/11/2003 :  02:34:23  Guarda il profilo di  Visita il Sito di mimc  Rispondi Citando
Nel link sottostante vi č un programma C che converte una sequenza di interi (su 4 byte) dal formato Little Endian a quello Big Endian e viceversa.

http://www.dsi.unive.it/~arch/LAB/esercit7.html

spero possa servirti.
ciaoo
Torna all'inizio della Pagina

frea
Junior Member

22 Messaggi

Inviato il 13/11/2003 :  18:30:06  Guarda il profilo di  Rispondi Citando
Grazie, mi č stato molto utile.

Ora ho il seguente problema (e temo sia molto pių stupido del precedente);

il programma qui sotto legge correttamente (in linguaggio c) un file binario scritto da me in fortran

#include
#include

int main (void) { // legge in binario (in linguaggio c)
FILE *fp;
int buco; // il fortran inserisce sempre uno spazio vuoto di 4 byte prima di scrivere!!!!
int i,j,k;

if ((fp=fopen("prova.bin","rb"))==NULL){
printf("Impossibile aprire il file.\n");
exit(1);
}

fread (&buco,sizeof(int),1,fp);
fread (&i,sizeof(int),1,fp);
fread (&j,sizeof(int),1,fp);
fread (&k,sizeof(int),1,fp);
printf(" %d %d %d\n",i,j,k);

fclose (fp);

return 0;
}

Volendolo tradurre in c++ (e non essendo evidentemente pratico) ho scritto:

#include
#include

int main (void) { // dovrebbe leggere in binario (in linguaggio c++) ma non funziona!!!
fstream fin;
int a,b,c;

fin.open("prova.bin", ios::in | ios::binary);
if (!fin) cerr <<"Errore!"<fin.seekg(sizeof(int),ios::beg);
fin >>a>>b>>c;
cout <<" "<fin.close();

return 0;
}

...ma non funziona! Dove č che sbaglio?
Torna all'inizio della Pagina

frea
Junior Member

22 Messaggi

Inviato il 14/11/2003 :  18:46:46  Guarda il profilo di  Rispondi Citando
Risolto tutto!
Grazie lo stesso...
A presto...
Torna all'inizio della Pagina
  Discussione Precedente Discussione Discussione Successiva  
 Nuova Discussione  Rispondi
 Versione Stampabile
Vai a:
Vai all'inizio della pagina Multi Forum Altomesima - © 2002 -2008 Altomesima Online
Questa pagina e' stata aperta in 0,41 secondi. Superdeejay.net | Snitz Forums 2000