mariaclara Ответов: 1

Почему я не могу вставить значения в массив объектов структуры?


У меня есть этот блок кода, - collection - это мой объект fstream, а-students-это структура, которую я создал. Я сделал-file[ctr] - который представляет собой массив объектов студентов, когда я строю и запускаю его, IDE, которую я использую, которая является Code:: Blocks, не дает мне ошибок. Сообщение об ошибке [fileprocessing.exe перестал работать. Проблема, из-за которой программа перестала работать правильно...и т. д.] появляется после того, как я заполняю firstname. Есть идеи, что может быть не так с моим кодом?

if(choice2=='A'||choice2=='a'){
    students file[ctr];
    cout<<"Student ID: ";
    cin>>file[ctr].studentID;
    cout<<"Surname: ";
    cin>>file[ctr].surname;
    cout<<"Firstname: ";
    cin>>file[ctr].firstname;
    cout<<"Birthdate: ";
    cin>>file[ctr].birthdate;
    cout<<"Sex: ";
    cin>>file[ctr].sex;
    fstream collection(filename, std::fstream::in | std::fstream::out | std::fstream::app);
    collection<<ctr
    <<"\t"<<file[ctr].studentID
    <<"\t"<<file[ctr].surname
    <<"\t"<<file[ctr].firstname
    <<"\t"<<file[ctr].birthdate
    <<"\t"<<file[ctr].sex
    <<endl;
    collection.close();
    ctr++;
    system("cls");
}


Что я уже пробовал:

int ctr=1;
if(choice2=='A'||choice2=='a'){
    students file;
    cout<<"Student ID: ";
    cin>>file.studentID;
    cout<<"Surname: ";
    cin>>file.surname;
    cout<<"Firstname: ";
    cin>>file.firstname;
    cout<<"Birthdate: ";
    cin>>file.birthdate;
    cout<<"Sex: ";
    cin>>file.sex;
    fstream collection(filename, std::fstream::in | std::fstream::out | std::fstream::app);
    collection<<ctr<<"\t"<<file.studentID
                        <<"\t"<<file.surname
                        <<"\t"<<file.firstname
                        <<"\t"<<file.birthdate
                        <<"\t"<<file.sex
                        <<endl;
    collection.close();
    ctr++;
    system("cls");
}


Просто я только что удалил [ctr]s, и он работает хорошо, но я знаю, что это вызовет у меня проблемы, когда я буду работать над другими частями моей системы. Я должен сделать массив объектов, потому что у меня есть коллекция данных студентов в коллекции текстовых файлов, и они не должны быть объектом студентов... Пожалуйста, помогите!

1 Ответов

Рейтинг:
10

Richard MacCutchan

students file[ctr];
cout<<"Student ID: ";
cin>>file[ctr].studentID;

Это неправильно; вы объявляете массив students объекты, и сразу же используя count в качестве индекса в массив (допустимые индексы массива идут от 0 до count-1). Таким образом, в данном случае это означает, что созданная вами структура будет перезаписывать вашу память и в конечном итоге вызовет какое-то случайное событие, например сбой приложения. Вы должны сделать это так:
int count; // the number of elements in the array
// initialise count somehow

// declare the array of 'count' elements
students file[count];

// now use a loop to fill the array
int ctr;
for (ctr = 0; ctr < count; ++ctr)
{
    cout<<"Student ID: ";
    cin>>file[ctr].studentID;
// ... etc
} // end of for loop


mariaclara

Большое вам спасибо!