C - Последний записанный элемент данных не записан в файл

Моя программа должна собрать три элемента данных для студента и записать их в файл; ID, имя и курс.

Имя и курс содержат пробелы. Он работает, но когда я проверяю файл, пишутся только ID и Имя. Это из-за того, как я собираю данные?

Мой код:

#include <stdio.h>
#include <string.h>

struct StudentDetails{
    char ID[50];
    char Name[50];
    char Course[50];
}aStudent; 

void capture(){
    char ch;

    printf("Enter ID: ");
    scanf ("%s", &aStudent.ID);

    printf("Enter Name: ");
    scanf ("%s ", &aStudent.Name);

    printf("Enter Course: ");
    scanf ("%s ", &aStudent.Course);
    ch = getchar();

}
void saveToFile(){
    FILE *studentDetails;
    studentDetails =  fopen("students.txt", "a");

    fprintf(studentDetails,"%s\t%s\t%s\n",aStudent.ID, aStudent.Name,aStudent.Course);
    fclose(studentDetails);
}

void main(){
    capture();
    saveToFile();
}  

1 ответ

Прежде всего, короткое примечание о том, как работает scanf: всякий раз, когда вызывается scanf, он пропускает первые пробелы, считывает и сохраняет символы до тех пор, пока снова не встретит пробел (и "пробел" - это символ пробела). Как только он встречает символ пробела, он возвращается и учитывает оставшиеся символы при повторном вызове.

Теперь, глядя на вашу программу, я предполагаю, что ID не содержит пробелов, поэтому полностью используется scanf, но когда ваши программы готовы принять Имя и сказать, что вы вводите "Джеймс Бонд". Эта строка содержит пробел, поэтому scanf сохраняет "James" в &aStudent.Name и возвращает. Как уже упоминалось, "Bond" сохраняется при следующем вызове scanf, поэтому &aStudent.Course получает возможность сохранить Bond. Таким образом, ваша программа никогда не получит шанс сохранить курс. Отсюда и результат.

Другие вопросы по тегам