Scrivi la metà di un numero su file

Questo esercizio consiste nella scrittura della metè di un numero su file. La cosa nuova rispetto ai programmi visti nella parte sui file è che qui il nome del file su cui scrivere e il numero da dimezzare vengono passati al programma da linea di comando (anzichè essere codificati nel programma, oppure letti da tastiera).

In particolare, vogliamo che usare come nome del file il primo argomento passato, e come numero il secondo. Per quello che riguarda l'uso del primo argomento non ci sono problemi: infatti, per specificare quale file si vuole aprire per scrivere, bisogna passarlo alla funzione fopen come primo parametro. Dal momento che questa funzione prende una stringa come nome del file, e il primo argomento del programma è argv[1], che è già una stringa, tutto quello che serve è aprire il file usando una istruzione del tipo:

  fd=fopen(argv[1], "w");

Questa istruzione apre in scrittura il file che ha il nome specificato come primo argomento del programma (argv[1]).

Per poter dimezzare e scrivere il numero abbiamo appunto bisogno di avere in memoria il numero stesso. Si noti che argv[2] è una stringa che rappresenta il numero, e non il numero stesso. Infatti, è di tipo char * e non di tipo int come serve a noi. Per essere più chiari su questo punto: argv[2] è un vettore di caratteri, in cui il primo elemento argv[2][0] è la prima cifra del numero, il secondo carattere argv[2][1] è la seconda cifra del numero, ecc.

Se per esempio passiamo il numero 29102 al programma, allora il vettore argv[2] contiene il carattere 2 in prima posizione, il carattere 9 in seconda posizione, 1 in terza, ecc. Si noti che gli interi non si rappresentano in memoria in questo modo: per esempio, il numero di byte usati per rappresentare un intero è costante, indipendente dal numero di cifre del numero.

Per poter convertire una stringa in numero, usiamo la funzione atoi, che converte la stringa in intero nel modo che ci si aspetta, per cui per esempio la stringa "29102" viene convertita nel numero 29102. Siamo ora in grado di scrivere il programma completo meta.c il cui codice è riportato qui sotto.

/*
  Dimezza un intero e lo scrive su file: il nome
del file e il valore del numero sono passati al
programma come argomenti.
*/

#include<stdlib.h>
#include<stdio.h>

int main(int argn, char *argv[]) {
  int x;
  FILE *fd;


		/* verifica se gli argomenti sono in numero giusto */
  if(argn-1!=2) {
    printf("Numero inesatto di argomenti\n");
    exit(1);
  }


		/* converte il secondo argomento in un intero */
  x=atoi(argv[2]);


		/* apre il file in scrittura */
  fd=fopen(argv[1], "w");
  if( fd==NULL ) {
    perror("Errore in apertura del file");
    exit(1);
  }


		/* scrive il numero */
  fprintf(fd, "%d\n", x/2);


		/* chiude il file */
  fclose(fd);

  return 0;
}

Dal momento che il programma, per poter dimezzare il numero e scriverlo su file, deve ricevere sia il nome del file che il numero, è opportuno controllare se effettivamente sono stati passati due argomenti e non un numero inferiore.