Info programma

di il
1 risposte

Info programma

Salve a tutti, avrei un problema con questo programma, non capisco dov'è l'errore.Concettualmente è semplice, deve leggere da un file e copiare il contenuto nell'altro file. I file sono aperti in binario.
Esempio : nel primo file è memorizzata la seguente sequenza di byte
30002000100020003000400050006000
i primi due interi 3 e 2 indicano che ci sono esattamente 3 x 2 = 6 elementi da copiare
e scrive nel secondo file con il medesimo formato
100020003000400050006000

/*Proviamo a leggere da un file in binario e a 
scrivere lo stesso contenuto in un altro file.
I due file vengono passati come parametri in ingresso
da linea di comando.*/
#include<stdio.h>
#include<stdlib.h>

FILE * open_read_file(const char *pathname)
{
  FILE *fp;
  fp = fopen(pathname,"rb");
  if(fp == NULL){
    perror("in fopen");
    exit(EXIT_FAILURE);
  }
  return fp;
}
int read_size(FILE *f, int *row, int *col)
{
  int righe, colonne;
  if(fscanf(f,"%d",&righe) == 0){
    perror("in fscanf");
    exit(EXIT_FAILURE);
  }
  if(fscanf(f,"%d",&colonne) == 0){
    perror("in fscanf");
    exit(EXIT_FAILURE);
  }
  int dimension = righe * colonne;
  *row = righe;
  *col = colonne;
  
  return dimension;
}
void save_elements(int * buffer, int size, FILE *f)
{
  ssize_t c;
  int r = 0;
  while(r < size){
    c = fread(buffer,sizeof(int),size,f);
    if(c == 0){
      fprintf(stderr,"End of file\n");
      return;
    }
    buffer += c;
    r += c;
  }
}
FILE * open_write_file(const char *pathname)
{
  FILE *f;
  f = fopen(pathname,"wb");
  if(f == NULL){
    perror("in fopen");
    exit(EXIT_FAILURE);
  }
  return f;
}
void print_on_file(FILE *f ,int *buf, int size)
{
  ssize_t c;
  int r = 0;
  while(r < size){
    c = fwrite(buf,sizeof(int),size,f);
    if(c == 0){
      perror("in fwrite");
      return;
    }
    buf += c;
    r += c;
  }
}
int main(int argc, char *argv[])
{
  if(argc != 3){
    fprintf(stderr,"Usage : %s <filename> <filename> \n",argv[0]);
    return EXIT_FAILURE;
  }
  FILE *f1, *f2;
  f1 = open_read_file(argv[1]);
  int r, c, size;
  size = read_size(f1,&r,&c);
  int buf[size];
  /*buf = malloc(size * sizeof(int));
  if(buf == NULL){
    perror("in malloc");
    exit(EXIT_FAILURE);
  }
  */
  save_elements(buf,size,f1);
  
  f2 = open_write_file(argv[2]);
  print_on_file(f2,buf,size);
  
  return EXIT_SUCCESS;
}

1 Risposte

  • Re: Info programma

    Un file binario si legge con la fread non con la fscanf
Devi accedere o registrarti per scrivere nel forum
1 risposte