Почему изменяются значения полей объекта структуры?
Из getStudentData возвращается указатель на локальный объект student.
Студенчеству, конечно, многое простительно, но зачем использовать С++ как С?
MAX_SURNAME_SIZE - это сколько? У моей супруги двойная фамилия (24 символа). Влезет?
MAX_PASSWORD_SIZE - сколько? Один из моих паролей - легко запоминающаяся, не подбираемая фраза на 36 символов.
А всего-то - перегнать этот "FILE * accounts" в банальный XML и читать его чем-нибудь типа pugixml.
И никаких плясок с памятью и переполнением, и никаких ограничений на длину и язык поля, и никаких простыней одинаковых операторов, в любом из которых может крыться досадная опечатка.
И никоим образом не уменьшит секьюрность, если что. Потому что ваш бинарный файл читается глазами без всяких проблем... Пароли-то - открытым текстом, небось? Хэш и соль еще не проходили?
А если этот код действительно будет использоваться, то первое, что с ним можно будет сделать - это перевести в скрипт на сервере. Нет, я не про ваш говнокод - его проще заново переписать...