Как мне прочитать каждую запись во входном файле как inputFile.read(reinterpret_cast (

#c #oop #struct #file-handling

#c #ооп #структура #обработка файлов

Вопрос:

В настоящее время я пишу программу, которая должна прочитать входной файл и заполнить набор объектов Student . Затем он отобразит объекты и выполнит некоторую базовую обработку на основе циклов и функций. Я все еще новичок в C , особенно в области обработки файлов и всего объектно-ориентированного. Любая пошаговая помощь, которую я получу, будет высоко оценена.

Данные входного файла:

Джон Дэниел Фуллер E23123456034Малик Стивен Браускент w03023142039 Ричард Э. Поллиденс E02782635021Франк Уильям Ломо E09912376022Колин Фрэнксон R23234556023 Джеймс Теодор Джексон d02323245059 Дейв Джеральд Мунгбин f12333221042 Джим Уэймо Гильберт w02785634055 Барб С Боуи w02833546030 Джим Д Карло S22876543033

Обработка входных данных:

  1. Откройте входной файл. Проверьте успешное открытие. Если открыть не удалось, отобразите сообщение об ошибке и верните значение 1.

  2. Используйте правильно структурированный цикл для чтения входного файла до EOF .

  3. Используйте функцию .read(reinterpret_cast) для чтения каждой записи в массив символов, достаточно большой, чтобы вместить всю запись.

  4. Для каждой записи входного файла динамически выделяйте и заполняйте переменную Student . Обратите внимание, что для заполнения некоторых полей Student вам потребуется выполнить некоторый тип преобразования. Используйте массив указателей для управления всеми созданными переменными student.

  5. Предположим, что входных записей будет не более 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 на a std::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; )