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. Таким образом, ваша программа никогда не получит шанс сохранить курс. Отсюда и результат.