Scusate ma avrei bisogno del vostro aiuto per risolvere un problemino di un programma.
Il codice qui allegato non è completo, ma fndamentalmente la mia intenzione era quella di fare un programma che ricevesse tre percorsi di file in ingresso, nei primi due sono memorizzate le matrici A e B in formato binario. All'inizio del file sono memorizzate le dimensioni N e M della matrice come sequenza di byte corrispondenti al formato nativo dell'archittettura. Esempio:
la matrice;
1 2
3 4
5 6
è memorizzata come segue
30002000100020003000400050006000
Ora io voglio poter fare la somma delle prime due matrici e salvarla in un terzo file.
Ma il mio problema è legato alla funzione read_and_save_elements che in pratica non deve far altro che leggere dal file gli interi e salvarli nella matrice di appoggio.
Ecco il codice:
/*Il programma riceve tre file in input. I primi
due contengono due matrici e il terzo se non esiste
deve essere creato e vi deve essere scritta con la
configurazione analoga agli altri due, la somma
delle due matrici(in formato binario).*/
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
int open_file(const char *filename)
{
int fd;
fd = open(filename, O_RDONLY);
if(fd == -1){
perror("in open");
exit(EXIT_FAILURE);
}
return fd;
}
int read_int(int fd)
{
int v ,c;
c = read(fd,&v,sizeof(v));
if(c == sizeof(v))
return v;
if(c == -1 && errno != EINTR){
perror("REad from input file");
exit(EXIT_FAILURE);
}
if(c == 0){
fprintf(stderr, "Unexpected end of file\n");
exit(EXIT_FAILURE);
}
fprintf(stderr,"Read operation interrupted, aborting\n");
exit(EXIT_FAILURE);
}
void write_int(int fd, int v)
{
int c;
c = write(fd,&v,sizeof(v));
if(c == sizeof(v))
return;
if(c == -1 && errno != EINTR){
perror("Write to output file");
exit(EXIT_FAILURE);
}
fprintf(stderr,"Write operation interrupted,aborting\n");
exit(EXIT_FAILURE);
}
void save_dimensions(int fd, int *r ,int *c)
{
int riga, colonna;
riga = read_int(fd);
colonna = read_int(fd);
*r = riga;
*c = colonna;
}
void read_and_save_elements(int fd ,int row ,int col ,int **matrix)
{
int *m;
int size = row*col;
m = malloc(size*sizeof(int));
if(m == NULL){
perror("in malloc");
exit(EXIT_FAILURE);
}
int contatore = 0;
int k;
while(contatore < size){
k = read(fd,m,size);
if(k == -1){
perror("in read");
exit(EXIT_FAILURE);
}
contatore += k;
}
*matrix = m;
}
int main(int argc, char *argv[])
{
if(argc != 4){
fprintf(stderr,"Usage : %s <filename> <filename> <filename>",argv[0]);
return EXIT_FAILURE;
}
int fdA ,fdB;
int rA ,cA ,rB ,cB;
int *mA ,*mB;
fdA = open_file(argv[1]);
fdB = open_file(argv[2]);
save_dimensions(fdA,&rA,&cA);
save_dimensions(fdB,&rB,&cB);
read_and_save_elements(fdA,rA,cA,&mA);
if(close(fdA) == -1)
perror("in close");
read_and_save_elements(fdB,rB,cB,&mB);
if(close(fdB) == -1)
perror("in close");
int fdC;
fdC = open(argv[3],O_RDWR|O_CREAT,0644);
if(fdC == -1){
perror("in open");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}