C - Последний записанный элемент данных не записан в файл - PullRequest
0 голосов
/ 14 октября 2018

Моя программа должна собирать три элемента данных для учащегося и записывать их в файл;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 Ответ

0 голосов
/ 14 октября 2018

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

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

...