codice:
#include <iostream> 
#include <stdio.h>
#include <string.h>

using namespace std; 

struct lazio { 
  char nome [30]; 
                }; 

const size_t lazio_size = sizeof(char) * 30;
const size_t lazio_nome_size = sizeof(char) * 30;

void write_struct(lazio *x, FILE *fp);
size_t read_struct(lazio *x, FILE *fp);
void back_one_struct(FILE *fp);

int menu (); 

void inserimento (); 
void modifica (); 
void stampa (); 
//------------------------------- main ---------------------------------------- 
int main() 
{ 
  int s; 
  do { 
    s=menu(); 
    switch (s) { 
      case 1: inserimento (); break; 
      case 2: modifica (); break; 
      case 3: stampa (); break; 
      case 4: cout<<" "<<endl; 
                   } 
      } while (s!=4); return 0; 
} 
int menu () 
{ 
  int scelta; 
  cout<<"1 Inserimento "<<endl; 
  cout<<"2 Modifica "<<endl; 
  cout<<"3 Stampa "<<endl; 
  cout<<"4 Exit "<<endl; 
  cout<<" Scelta -> "; 
  
  cin>>scelta; 
  
  return scelta; 
} 

void inserimento () 
{ 
  FILE *fp; 
  lazio x; 
  
  fp=fopen("Lazio.dat","a+b"); //Apertura file 
  
  cout<<"Nome: "; 
  cin>>x.nome; 

  write_struct(&x, fp); //Scrittura nel file 
  
  fclose (fp);//Chiusura File 
} 
void modifica () 
{ 
  FILE *fp; 
  lazio x; 
  char y[30]; 
  int k=0; 
  int z=-1; 
  
  cout<<"Inserire un nome: "; 
  cin>>y; //Variabile che si confronterà con quella del file 

  fp=fopen("Lazio.dat", "r+b"); //Apertura File 
  while ( read_struct(&x, fp) ) //Ciclo che legge tutto il file 
  { 
    if ( strcmp (y,x.nome)==0 ) 
    { 
      cout<<"Nuovo nome: "; 
      cin>>x.nome; 
      
      back_one_struct(fp);
      write_struct(&x, fp);

      k++; //Dopo aver trovato il nome, incrementiamo questa variabile per il controllo se qualcosa è stato modificato o meno 
    }   
  } 
  if (k==0) cout<<"Nome non trovato."<<endl; 

  fclose (fp); 
} 

void stampa () 
{ 
  FILE *fp; 
  lazio x; 

  fp=fopen("Lazio.dat", "rb"); //Apertura File 

  while ( read_struct(&x, fp) ) 
  { 
    cout<<"Nome: "<<x.nome<<endl; 
  } 
  fclose (fp); 
}


void write_struct(lazio *x, FILE *fp) {
	fwrite(x->nome, lazio_nome_size, 1, fp);
}
size_t read_struct(lazio *x, FILE *fp){
	return fread(x->nome, lazio_nome_size, 1, fp);
}
void back_one_struct(FILE *fp){
	fseek(fp, -lazio_size, SEEK_CUR);
}
Così dovrebbe funzionare, anche se non ne ho la certezza in quanto non ho un compilatore C++...