Salve a tutti, io avrei un problema con un programma che stavo facendo.Ho risolto già un problema in lettura grazi e a voi(in un post precedente), ora ce l'ho con la scrittura su file.
In pratica il programma riceve tre file in ingresso, i primi due ,in cui sono memorizzate rispettivamente nel formato nativo dell'architettura interi int con le dimensioni della matrice e i suoi elementi.
nel terzo file (che viene creato qualora non dovesse esistere, viene scritta la somma delle prime due matrici.E' qui il mio problema , non me lo scrive nel formato equivalente alle prime due matrici.
esempio:
la matrice A 3x2
1 2
3 4
5 6
è memorizzata nel primo file come segue:
30002000100020003000400050006000
ecco il codice
#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
int open_file(const char *pathname)
{
int fd;
fd = open(pathname ,O_RDONLY);
if(fd == -1){
perror("in open");
exit(EXIT_FAILURE);
}
return fd;
}
int read_int(int fd)
{
int c ,v;
c = read(fd,&v,sizeof(v));
if(c == sizeof(v))
return v;
if(c == -1 && errno != EINTR){
perror("Read from input file\n");
exit(EXIT_FAILURE);
}
if(c == 0){
perror("Unexpected end of file\n");
exit(EXIT_FAILURE);
}
fprintf(stderr,"Read operation interrupted,aborting\n");
exit(EXIT_FAILURE);
}
void save_dimensions(int fd, int *r ,int *c)
{
*r = read_int(fd);
*c = read_int(fd);
}
void read_elements(int fd, int row, int col,int **mat)
{
int size = row * col;
int *m;
m = malloc(size * sizeof(int));
if(m == NULL){
perror("in malloc");
exit(EXIT_FAILURE);
}
*mat = m;
int r = 0;
ssize_t v;
while(size > r){
v = read(fd,m,size-r);
if(v == -1){
perror("in read");
exit(EXIT_FAILURE);
}
if(v == 0)
return ;
m += v;
r += v;
}
}
int create_output_file(const char *filename)
{
int fd;
fd = open(filename,O_WRONLY|O_CREAT,0644);
if(fd == -1){
perror("in open");
exit(EXIT_FAILURE);
}
return fd;
}
int * somma_matrici(int *mA, int *mB, int rA, int cA)
{
int *m;
ssize_t dim = rA * cA;
m = malloc(dim * sizeof(int));
if(m == NULL){
perror("in malloc");
exit(EXIT_FAILURE);
}
int i = 0;
while(i < dim){
*(m + i) = *(mA + i) + *(mB + i);
i++;
}
return m;
}
void write_on_output_file(int fd, int *matrix, int rA, int cA)
{
ssize_t dimension = rA * cA;
int contatore = 0;
ssize_t v ;
while(dimension > contatore){
v = write(fd,matrix,dimension);
if(v == -1){
perror("in write");
exit(EXIT_FAILURE);
}
if(v == 0)
return;
matrix += v;
contatore += v;
}
}
int main(int argc, char *argv[])
{
if(argc != 4){
fprintf(stderr,"Usage : %s <filename> <filename> <filename> \n",argv[0]);
return EXIT_FAILURE;
}
int fdA ,fdB;
int rA ,rB ,cA ,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_elements(fdA,rA,cA,&mA);
read_elements(fdB,rB,cB,&mB);
if(close(fdA) == -1){
perror("in close");
exit(EXIT_FAILURE);
}
if(close(fdB) == -1){
perror("in close");
exit(EXIT_FAILURE);
}
int fdC;
fdC = create_output_file(argv[3]);
if(rA == rB && cA == cB){
int *mC;
mC = somma_matrici(mA,mB,rA,cA);
write_on_output_file(fdC,mC,rA,cA);
}
else{
printf("The dimensions of two matrix are incompatible\n");
exit(EXIT_FAILURE);
}
if(close(fdC) == -1){
perror("in close");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}