Ответ 1
Вы читаете только 5 символов за раз. Хотя это будет работать (потому что fgets остановится в конце строки), это очень неэффективно и означает, что вы сравниваете входные данные пользователей с каждыми 6 символами файла, даже если это содержимое файла не является идентификатором студента.
Если вы хотите продолжить подход к вашей программе, когда вы получите совпадение с пользовательским вводом, вам нужно прочитать (и отбросить) остальную часть строки, прежде чем продолжить изучение дальнейших строк.
Для строк, которые не совпадают, вы должны прочитать (и скопировать в новый файл) оставшуюся часть строки, не сравнивая ее с пользовательским вводом (поскольку вы знаете, что это не идентификатор студента).
Я подозреваю, что человек, который написал задание, ожидал, что вы прочитаете всю строку, разделите ее (путем поиска запятых) в различные поля и поместите информацию в свои студийные структуры. Затем обработайте studentinfo любым способом, на который запрошено задание, и, наконец, напишите новый файл с измененными данными.
Хотя вы можете заставить свой подход работать для удаления записи указанного идентификатора студента, он очень негибкий. Поиск записи или добавление записи потребует полной перезаписи вашей программы. Если бы у вас был код, который мог бы считывать информацию в массив структур studentinfo и снова записывать эту информацию, любая обработка, которую вам нужно было сделать, просто работала бы над этими структурами, и изменения были бы намного меньше.
Итак, в псевдокоде вам нужно что-то вроде этого
allocate space for one line of the file
allocate space for an array of struct studentinfos
readinfo function:
open the student info file for reading
set the count of student records to 0
while not at eof
read in a line
split the line on commas
copy the bit before the first comma to the 'id' field of the newly allocated studentinfo record
copy the bit between first and second commas to the name field
copy the bit from the second comma to the course field
add one to the count of student records
go back to read another line
close the file
writeinfo function:
open the studentinfo file for writing
loop over the studentinfo structs in order
writeout the id, name and course strings of the current record, separated by comma and followed by new line
close the file
deletestudent function:
read a course id from the user (or read it in your main program and pass it here as a parameter)
loop over the studentinfo array
compare the id to the one of the current record
if a match
shift all records after this down one by copying them over the top of the record before
subtract one from the number of student records (since we've deleted one)
return from the function indicating found and delete
repeat for next record
if you complete looking at all records,
return from the function indicating no match found