Это не относится к проблеме C строки.
Определение функции:
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );
Извлекает символы из потока как неформатированный ввод, а сохраняет их в s
в виде c -строки , пока либо извлеченный символ не станет символом-разделителем, либо пока не будет написано n
символов. на s
(включая завершающий нулевой символ).
Символом-разделителем является символ новой строки ('\n'
) для первой формы и delim
для второй: при обнаружении во входной последовательности, он извлекается из входной последовательности, но отбрасывается и не записывается в s
.
Функция также прекратит извлекать символы, если достигнут конец файла. Если это достигнуто преждевременно (перед тем, как написать n
символов или найти delim
), функция устанавливает флаг eofbit
.
Флаг failbit
устанавливается , если функция не извлекает никаких символов или , если символ-разделитель не найден один раз (n-1
) символов, уже записанных в s
. Обратите внимание, что если символ, который следует за этими (n-1
) символами во входной последовательности, является именно символом-разделителем, он также извлекается, и флаг failbit
не устанавливается (извлеченная последовательность была точно длиной n
символов).
Нулевой символ ('\0'
) автоматически добавляется к записанной последовательности, если n
больше нуля, даже если извлекается пустая строка.
Проблема заключается в том, что что массив char answerKey[20]
недостаточно велик.
Используйте
char answerKey[21];
inFile.getline(answerKey, sizeof(answerKey))
и
//...
char id[9];
//...
inFile.getline(students[0].id, sizeof(id));
См. этот пример
При этом, однако, это не очень хороший метод, было бы предпочтительнее, если бы вы использовали std :: getline .
Вот это быстрый пример , который вы можете использовать и адаптировать к вашим потребностям.
Обратите внимание, что Я не использую пространство имен std .