Форум программистов, компьютерный форум CyberForum.ru

Не могу прочитать из файла в класс - C++

Восстановить пароль Регистрация
 
ElenaBilyk
 Аватар для ElenaBilyk
4 / 4 / 1
Регистрация: 22.10.2013
Сообщений: 34
11.12.2013, 17:59     Не могу прочитать из файла в класс #1
Доброго времени суток! Есть проблемка. У меня имеется класс Студент, в котором есть функция записи в файл(здесь все получилось отлично) и функция извлечения из файла в объект Студент.
А именно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Students
{
    struct student
    {
        char Name [20];
        char Surname [30];
        int Age;
        int Marks [5];
        double GPA;
        char * Experience;
    };
    student * St;
    int m_SizeAr;
public:
    Students(int Size = 0);                 //если есть знач. Size, вызыв. функцию CreateStuden
    ~Students(void);
    void CreateStudent(int Size);           //создаем массив студентов
    void InitRand();                        //инициализируем случайным способом
    void InitUser();                        //инициализирует пользователь
    void HighestAverageScore();             //ищем студента с наибольшим средним баллом
    void SortSurname();             //сорт. по фам.
    void SortName();                //сорт. по имени
    void SortAVG();                 //сорт. по ср. баллу
    void SortAge();             //сорт. по возрасту
    void Print();                   //вывод на экран
    void WriteToFile(char * NameFile);              //запись в файл
    void ReadFromAFile(char * NameFile);    //прочесть из файла
};
Записываются в файл структуры последовательно друг за другом, а их experience записывается после всех структур(так как у каждого опыт работы разный), что бы легче было их извлекать.
к каждому experience должен быть свой указатель, где он ложиться в файл. Но я его не создала, так как не знаю, каким образом его инициализировать и теперь не могу нормально извлечь из файла данные.
Я опыт просто отдельным циклом записала после того, как записала всех студентов.
Подскажите, как правильно организовать это?

Добавлено через 3 минуты
На сколько я понимаю, указатель на свой опыт должен хранить количество байт от начала файла до своего студента? Так?

Добавлено через 10 минут
Наверное, не так. Может от своего студента до своего опыта, только как это расстояние вычислить?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 18:01     Не могу прочитать из файла в класс #2
Цитата Сообщение от ElenaBilyk Посмотреть сообщение
а их experience записывается после всех структур(так как у каждого опыт работы разный), что бы легче было их извлекать.
Это непонятно зачем... Запись в каком режиме?
ElenaBilyk
 Аватар для ElenaBilyk
4 / 4 / 1
Регистрация: 22.10.2013
Сообщений: 34
11.12.2013, 18:08  [ТС]     Не могу прочитать из файла в класс #3
Запись в файл txt, просто как текст. Это задание преподавателя. Для того, что бы мы научились использовать указатели различными способами. У меня в структуре должен быть указатель, который указывает на свой опыт, и потом при чтении из файла, я должна его использовать.

Добавлено через 33 секунды
Память под опыт выделяется динамически. Может быть 0, а может быть 100 символов.
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
11.12.2013, 18:08     Не могу прочитать из файла в класс #4
а почему после всех структур, опыт разве нельзя заполнить после GPA? Тем более
C++
1
student * St;
; это указатель на student, т.е. в классе будет содержаться только один студент.
Наверно лучше сделать массив указателей, типа
C++
1
student * St[];
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 18:13     Не могу прочитать из файла в класс #5
Цитата Сообщение от ElenaBilyk Посмотреть сообщение
Запись в файл txt, просто как текст.
Отдельные поля структур записываете?

Добавлено через 49 секунд
Больше кода покажите (лучше один раз увидеть...).
ElenaBilyk
 Аватар для ElenaBilyk
4 / 4 / 1
Регистрация: 22.10.2013
Сообщений: 34
11.12.2013, 18:36  [ТС]     Не могу прочитать из файла в класс #6
Я в функции CreateStudent() создаю динамический массив студентов. Затем инициализирую одной из двух функций. И, получается, что массив студентов ложится один за одним 96 байт, а после них, по порядку их опыт, ну наверное, что бы было легче считывать обратно в массив.

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
Students::Students(int Size)
{
    if (Size != 0)
    {
        CreateStudent(Size);
        m_SizeAr = Size;
    }
    else 
    {
        m_SizeAr = 0;
        St = 0;
    }
    //std::cout<<"Create an object with parameters "<<Size<<' '<<this<<'\n';    
}
 
void Students::CreateStudent(int Size)
{
    static int Count = 0;
    if(Count >= 1)      //на тот случай, если вызывали ее из конструктора
    {
        std::cout<<"You already create students array\n";
        return;
    }
    St = new student [Size];
    for(int i = 0; i < Size; ++i)
    {
        St[i].Age = 0;
        St[i].Experience = 0;
        St[i].GPA = 0;
        for(int j = 0; j < 5; ++j)
            St[i].Marks[j] = 0;
        St[i].Name[0] = 0;
        St[i].Surname[0] = 0;   
    }
    m_SizeAr = Size;
    Count++;
}
 
void Students::InitUser()
{
    using std::cout;
    for(int i = 0; i < m_SizeAr; ++i)
    {
        cout<<"Enter data for the "<<i + 1<<" student:\n";
        cout<<"Enter the name:\n";
        std::cin.getline(St[i].Name, 19);
        St[i].Name[strlen(St[i].Name) + 1] = '\0';
        cout<<"Enter the surname:\n";
        std::cin.getline(St[i].Surname, 19);
        St[i].Surname[strlen(St[i].Surname) + 1] = '\0';
        cout<<"Enter age: ";
        std::cin>>St[i].Age;
        cout<<"Enter 5 marks separated by spaces:\n";
        for(int j = 0; j < 5; ++j)
            std::cin>>St[i].Marks[j];
        St[i].GPA = 0;
        for(int j = 0; j < 4; ++j)
            St[i].GPA += St[i].Marks[j];
        St[i].GPA /= 5;
        while(std::cin.get() != '\n')
            continue;
        cout<<"Enter the "<<St[i].Name<<" experience(100 characters): \n";
        int Size = 1, Step = 2;
        St[i].Experience = new char [Size];
        int Count = 0, j = 0;   
        std::cin.get(St[i].Experience[j]);
        while(St[i].Experience[j] != '\n')
        {
            j++;
            if(j >= Size)
            {
                char * Temp = new char [Size + Step];
                memcpy(Temp, St[i].Experience, sizeof(char) * Size);
                Size += Step;
                delete [] St[i].Experience;
                St[i].Experience = Temp;
            }
            Count++;
            std::cin.get(St[i].Experience[j]);      
        }       
        St[i].Experience[Count] = '\0';     
    }
    
}
 
 
void Students::WriteToFile(char * NameFile)             //запись в файл
{
    std::ofstream fout;
    fout.open(NameFile);
    if(!fout.is_open()) 
    {
        std::cout<<"\nFile not open! Sorry...Bay...\n";
        exit(EXIT_FAILURE);
    }   
    for(int i = 0; i < m_SizeAr; ++i)
    {
        fout<<St[i].Name<<' '<<St[i].Surname<<'\n';
        fout<<"Age: "<<St[i].Age<<'\n';
        fout<<"Marks: ";
        for(int j = 0; j < 5; ++j)
            fout<<St[i].Marks[j]<<' ';
        fout<<'\n';
        fout<<"GPA: "<<St[i].GPA<<'\n';
        fout<<"-----------------------------------------------------\n";
    }
    for(int i = 0; i < m_SizeAr; ++i)
        fout<<"Experience: "<<St[i].Experience<<'\n';
 
    std::cout<<"File written.\n";
    fout.close();
}
Добавлено через 16 минут
Ладно, допустим, при записи в файл, я в какую-то переменную записываю расстояние от начала файла до своего опыта, вычислив его по такой формуле - первый студент получает 96 байт * на кол-во студентов(m_SizeAr) + strlen(свой опыт), второй студент - те же 96 байт * на кол-во студентов(m_SizeAr) + strlen(опыт предыдущего) + strlen(свой опыт).
Теперь вопрос, как при чтении из файла в структуры этим воспользоваться.?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 18:51     Не могу прочитать из файла в класс #7
Зачем эти выдумки? Что мешает записать в файл Experience, отдельной строкой, после записи GPA?
ElenaBilyk
 Аватар для ElenaBilyk
4 / 4 / 1
Регистрация: 22.10.2013
Сообщений: 34
11.12.2013, 19:01  [ТС]     Не могу прочитать из файла в класс #8
Такое задание дал препод)))))
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 19:09     Не могу прочитать из файла в класс #9
Цитата Сообщение от ElenaBilyk Посмотреть сообщение
Такое задание дал препод)))))
При чём здесь задание? Где там написано, что это поле нужно отдельно где-то в файле записывать?
ElenaBilyk
 Аватар для ElenaBilyk
4 / 4 / 1
Регистрация: 22.10.2013
Сообщений: 34
11.12.2013, 19:22  [ТС]     Не могу прочитать из файла в класс #10
Условие д\з:
Записать в файл студентов, а их experience записать отдельно, после всего массива студентов.
Подсказка: для того чтобы прочесть обратно в массив, необходимо, в самом начале файла записать кол-во студентов(в первых ,наверное, 4-х байтах), и для каждого опыта должен быть указатель, на место, где он лежит в файле(от начала файла).
Я вроде как додумалась, как сохранить местоположение каждого опыта в файле, но теперь надо при извлечении данных переместится в то место в файле, где они лежат.

Добавлено через 7 минут
может есть какая-то константа ios_base
вроде этих
ios_base::in открыть файл для чтения
ios_base::out открыть файл для записи
ios_base::ate при открытии переместить указатель в конец файла
ios_base::app открыть файл для записи в конец файла
ios_base::trunc удалить содержимое файла, если он существует
ios_base::binary открытие файла в двоичном режиме




которая будет перемещать указатель на указанное место?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 19:54     Не могу прочитать из файла в класс #11
Цитата Сообщение от ElenaBilyk Посмотреть сообщение
Условие д\з:
Записать в файл студентов, а их experience записать отдельно, после всего массива студентов.
Это меняет дело.
Цитата Сообщение от ElenaBilyk Посмотреть сообщение
может есть какая-то константа ios_base
Цитата Сообщение от ElenaBilyk Посмотреть сообщение
которая будет перемещать указатель на указанное место?
Есть метод seekg().
ElenaBilyk
 Аватар для ElenaBilyk
4 / 4 / 1
Регистрация: 22.10.2013
Сообщений: 34
11.12.2013, 19:59  [ТС]     Не могу прочитать из файла в класс #12
Всё, всем спасибо!!!!

Добавлено через 53 секунды
Цитата Сообщение от alsav22 Посмотреть сообщение
Это меняет дело.


Есть метод seekg().
Да, я нашла, сейчас пробую!!! Спасибо Вам)))))

Добавлено через 3 минуты
Когда задала вопрос еще сама не знала что нужно сделать))) Пока пыталась объяснить что я хочу сделать, в голове сформулировался правильный вопрос, который натолкнул на мысль как это сделать))))). Воистину говорят, что правильно поставленный вопрос это уже половина ответа))))))
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 20:04     Не могу прочитать из файла в класс #13
Там будет ещё вопрос: как считаь строку неизвестной длины в динамическую память. Ведь вы, experience, в динамическую память собираетесь читать?
ElenaBilyk
 Аватар для ElenaBilyk
4 / 4 / 1
Регистрация: 22.10.2013
Сообщений: 34
11.12.2013, 20:08  [ТС]     Не могу прочитать из файла в класс #14
Да, я об этом не подумала...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 20:24     Не могу прочитать из файла в класс #15
Можно в структуре хранить длину строки. Можно, перед записью experience, сначала записывать длину строки, а потом саму строку. Можно, перед чтением строки, запоминать позцию курсора (tellg()), читать строку во что-то временное, вычислять длину строки, выделять память, возвращать курсор (seekg()) на позицию чтения строки, читать строку в выделенную память. Можно без чтения во что-то временное, а читать посимвольно и считать, пока строка не закончится ('\n'), и так узнать длину строки.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2013, 20:29     Не могу прочитать из файла в класс
Еще ссылки по теме:

Не могу понять как прочитать файл C++
C++ Не могу прочитать структуру с файла
Не могу прочитать код C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ElenaBilyk
 Аватар для ElenaBilyk
4 / 4 / 1
Регистрация: 22.10.2013
Сообщений: 34
11.12.2013, 20:29  [ТС]     Не могу прочитать из файла в класс #16
Я думаю, что меньше всего хлопот - хранить в структуре длину строки)))) Спасибо за помощь))))
Yandex
Объявления
11.12.2013, 20:29     Не могу прочитать из файла в класс
Ответ Создать тему
Опции темы

Текущее время: 05:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru