Problema scrittura su file

di il
2 risposte

Problema scrittura su file

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;
}

2 Risposte

  • Re: Problema scrittura su file

    Non si capisce come siano memorizzati i dati nel primo file.

    Tu indichi

    30002000100020003000400050006000

    ma non è chiaro.

    Magari inserisci un link per farci scaricare questo file di dati.
  • Re: Problema scrittura su file

    Sono memorizzati esattamente come te li ho scritti
    nel formato nativo dell'architettura, essendo numeri interi int
Devi accedere o registrarti per scrivere nel forum
2 risposte