Programma C...memorizzazione file in un buffer

di il
1 risposte

Programma C...memorizzazione file in un buffer

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

1 Risposte

  • Re: Programma C...memorizzazione file in un buffer

    masaniello ha scritto:


    Ma il mio problema è legato alla funzione read_and_save_elements
    Mi sembra che il discorso si sia interrotto sul più bello ...

    Di quale problema parli in particolare ? Che succede nella funzione che non dovrebbe succedere ? Errori ? Malfunzionamenti ?

    Descrivi in particolare i problemi altrimenti come si risponde?
Devi accedere o registrarti per scrivere nel forum
1 risposte