Ho scritto questo codice

codice:
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;

struct studente {
  char nome[50];
  int  voto;
};

int main(int argc, char *argv[])
{
    char filename[] = "studenti.dat";
    studente stud;
    
    fstream fs;
    
    // Fase 1. Dati precedenti
    fs.open (filename,ios::binary | ios::in);
    if (!fs || fs.eof())
    {
      // Non sono ancora presenti record
      cout << "Nessun dato già presente\n";
    }
    else
    {
      // Stampiamo i record già presenti
      while (fs.read((char*)&stud,sizeof stud))
        cout << stud.nome << "\t" << stud.voto << endl;
    }
    fs.close();
    
    system ("pause");
    
    // Fase 2. Inserimento nuovi dati
    fs.open (filename,ios::app | ios::binary);
    
    if (!fs)
      cout << "Errore nell'apertura del file";
    
    int n;
    cout << "Studenti da aggiungere: ";
    cin >> n;
    
    for (int i = 0; i < n; i++)
    {
      cout << "STUDENTE " << i+1 << endl;
      cout << "Nome: ";
      cin >>  stud.nome;
      cout << "Voto: ";
      cin >>  stud.voto;
      fs.write((char*)&stud, sizeof stud);
    }
    
    fs.close();
    
    system ("pause");
    return 0;
}
ma ha un problema. Quando apre il file la seconda volta e verifica il successo dell'operazione

// Fase 2. Inserimento nuovi dati
fs.open (filename,ios::app | ios::binary);

if (!fs)
cout << "Errore nell'apertura del file";

stampa sempre il messaggio di errore, ed in effetti non scrive nulla sul file. Quale può essere il problema??