Scambio elementi a coppie

Risolviamo il seguente esercizio: dato un file binario che contiene una sequenza di numeri interi, scambiare il primo intero con il secondo, il terzo con il quarto, ecc.

L'esercizio si risolve semplicemente leggendo una coppia di numeri interi per volta, riportandosi indietro nel file fino alla posizione in cui si trovava il primo intero, e stampando i due interi a partire da questa posizione in ordine inverso. Facciamo quindi un ciclo in cui, dopo aver letto due interi x e y, ci riportiamo indietro fino alla posizione iniziale del primo intero:

    fseek(fd, -2*sizeof(int), SEEK_CUR);

A questo punto possiamo scrivere i due interi su file. Dato che vanno invertiti, scriviamo primo il numero che è stato letto per secondo, cioè y. Il primo numero che è stato letto, lo scriviamo di seguito.

    fwrite(&y, sizeof(int), 1, fd);
    fwrite(&x, sizeof(int), 1, fd);

Il programma completo scambia.c è riportato qui sotto.

/*
  Scambia gli elementi di un file
a coppie (il primo con il secondo,
il terzo con il quarto, ecc.)
*/

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

int main() {
  FILE *fd;
  int x, y;
  int res;


			/* apre il file */
  fd=fopen("test.dat", "r+");
  if( fd==NULL ) {
    perror("Errore in apertura del file");
    exit(1);
  }


			/* ciclo di lettura */
  while(1) {
			/* legge il primo */
    res=fread(&x, sizeof(int), 1, fd);
    if( res!=1 )
      break;

			/* legge il secondo */
    res=fread(&y, sizeof(int), 1, fd);
    if( res!=1 )
      break;

			/* riposiziona indietro */
    fseek(fd, -2*sizeof(int), SEEK_CUR);

			/* scrive il secondo e poi il primo */
    fwrite(&y, sizeof(int), 1, fd);
    fwrite(&x, sizeof(int), 1, fd);
  }


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

  return 0;
}