#c #oop #struct #file-handling
#c #ооп #структура #обработка файлов
Вопрос:
В настоящее время я пишу программу, которая должна прочитать входной файл и заполнить набор объектов Student . Затем он отобразит объекты и выполнит некоторую базовую обработку на основе циклов и функций. Я все еще новичок в C , особенно в области обработки файлов и всего объектно-ориентированного. Любая пошаговая помощь, которую я получу, будет высоко оценена.
Данные входного файла:
Джон Дэниел Фуллер E23123456034Малик Стивен Браускент w03023142039 Ричард Э. Поллиденс E02782635021Франк Уильям Ломо E09912376022Колин Фрэнксон R23234556023 Джеймс Теодор Джексон d02323245059 Дейв Джеральд Мунгбин f12333221042 Джим Уэймо Гильберт w02785634055 Барб С Боуи w02833546030 Джим Д Карло S22876543033
Обработка входных данных:
-
Откройте входной файл. Проверьте успешное открытие. Если открыть не удалось, отобразите сообщение об ошибке и верните значение 1.
-
Используйте правильно структурированный цикл для чтения входного файла до EOF .
-
Используйте функцию .read(reinterpret_cast) для чтения каждой записи в массив символов, достаточно большой, чтобы вместить всю запись.
-
Для каждой записи входного файла динамически выделяйте и заполняйте переменную Student . Обратите внимание, что для заполнения некоторых полей Student вам потребуется выполнить некоторый тип преобразования. Используйте массив указателей для управления всеми созданными переменными student.
-
Предположим, что входных записей будет не более 99, поэтому размер массива указателей переменной student будет равен 100. Используйте «глобальную» переменную для определения размера массива указателей.
Отобразить объекты Student:
Когда вы нажмете EOF на входной файл, закройте его и отобразите весь список учащихся. Просмотрите объекты student — не создавайте отчет во время чтения входных записей. Пример вывода приведен ниже. Обратите внимание, что у 5-го ученика (Колин Фрэнксон) нет среднего инициала / имени. Оставьте это поле пустым в выходных данных.
Мой код до сих пор:
#include <iostream>
#include <fstream>
using namespace std;
const int SIZE = 100;
#ifndef Student_h
#define Student_h
struct Student
{
char first_name[10];
char middle_int[10];
char last_name[20];
char campus_code;
char student_ID[8];
char age[3];
};
#endif
int main()
{
ifstream inputFile;
inputFile.open("Students.txt", ios::binary);
if(!inFile.is_open())
{
cout << "Unable to open file!";
return 1;
}
else
{
cout << "File successfully open!nn";
}
Student *arr[SIZE];
Student *st = nullptr;
int total = 0;
Student s;
inFile.read(reinterpret_cast<char *> (amp;s), sizeof(s));
// pseudocode:
while(!inputFile.eof())
{
// dynamically allocate space for new student variables
st = new Student();
// populate the student variables from the input
st = amp;s;
// read the input record
}
inFile.close();
// Display the student variables with appropriate column headers and
// formatting to make it readable
/*
for(int i = 0; i < total; i )
{
cout << "First Name" << "t" << "MI" << "t" << "Last Name" << "t" << "Campus Code" << "t" << "Student ID" << "t" << "Age" << endl;
cout << "===================================================================================================================" << endl;
}
*/
return 0;
}
Комментарии:
1. «Используйте функцию .read(reinterpret_cast)» Зачем эти инструкции? 🙁 (При этом вы не можете использовать напрямую
std::string
илиshort int
)2. Я предполагаю, что у профессора есть веские причины преподавать его таким образом. Это не то, как я бы реализовал программу (с этими ограничениями).
3. Я предполагаю, что он тоже. Я бы тоже не стал использовать эту функцию. Это так запутанно, вот почему мне нужна помощь в этом
4. @Orion98 В требованиях четко указано
read each record into a character array
иto populate some of the Student fields, you'll need to perform some type of conversion.
. Вы не следуете инструкциям, которые вам были даны, поэтому у вас возникли проблемы. Сначала прочитайте данные в массив символов, затем заполните запись ученика из массива символов. Если вы не понимаете, как это сделать, задайте вопрос об этом, а не просто игнорируйте его и делайте что-то другое.5. Также для использования
read
на astd::ifstream
вы должны открыть файл в двоичном режиме.inputFile.open("Students.txt", std::ios_base::binary);
Ответ №1:
struct Student
{
std::string firstName; // 10 characters
char middleInitial; // 1 character
std::string lastName; // 20 characters
char campusCode; // 1 character
std::string studentID; // 8 characters
short int age; // 3 characters
};
Была бы прекрасная рабочая структура, но с требованием использовать reinterpret_cast
вы не можете использовать std::string
, и из комментария по возрасту, short int
также не может быть использована.
struct RawStudent
{
char firstName[10];
char middleInitial;
char lastName[20];
char campusCode;
char studentID[8];
char age[3];
};
С чем-то похожим на:
RawStudent s1; // defines as an object from Student
inputFile.read(reinterpret_cast<char *> (amp;s1), sizeof (s1));
Комментарии:
1. «Предположим, что входных записей будет не более 99» , поэтому
RawStudent s[100]; while inputFile.read(reinterpret_cast<char *> (amp;s[nbStudent ]), sizeof (RawStudent));
2. что такое
nbStudent
?3. И использую ли я
RawStudent s[100];
иinputFile.read(reinterpret_cast<char *> (amp;s[nbStudent ]), sizeof (RawStudent));
для замены того, что у меня есть в коде?4. Чтобы заменить все ваши переменные s1, s2, .., s6 . (Вы также должны добавить (global :/ )
int nbStudent = 0;
)