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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ElenaBilyk
4 / 4 / 1
Регистрация: 22.10.2013
Сообщений: 34
#1

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

11.12.2013, 17:59. Просмотров 365. Ответов 15
Метки нет (Все метки)

Доброго времени суток! Есть проблемка. У меня имеется класс Студент, в котором есть функция записи в файл(здесь все получилось отлично) и функция извлечения из файла в объект Студент.
А именно:
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 минут
Наверное, не так. Может от своего студента до своего опыта, только как это расстояние вычислить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2013, 17:59     Не могу прочитать из файла в класс
Посмотрите здесь:

Не могу прочитать структуру с файла - C++
Доброго времени суток. Записываю структуру так template<typename T> bool SaveStruct(T mys,char *path) { ofstream fout; ...

Не могу прочитать с бинарного файла компонент - C++
Здравствуйте! Помогите, пожалуйста, совсем начинающему энтузиасту. Программа динамически создает определенный набор компонентов с...

Не могу прочитать данные - C++
Здравствуйте. Не могу прочитать данные после второго ввода (после enter a phrase). Объясните пожалуйста что не так, а то недавно начал...

Не могу прочитать код - C++
добрый день имеется вот такой предзаголовочный файл #ifndef COLLISION_H #define COLLISION_H #include "Shape.h" ...

Не могу прочитать строку - C++
Добрый день, никак не получается прочитать строку. В том месте, где закомментировано, нужно считать строку. Подскажите, как это правильно...

не могу прочитать из файлов - C++
Нужно открыть файл, считать из него имена других файлов и затем из этих файлов взять нужные данные. Из первого файла читает названия...

Не могу корректно прочитать код - C++
vector<string> numbers; // representation of numbers as strings // numbers is the string representation for i // for...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 18:01     Не могу прочитать из файла в класс #2
Цитата Сообщение от ElenaBilyk Посмотреть сообщение
а их experience записывается после всех структур(так как у каждого опыт работы разный), что бы легче было их извлекать.
Это непонятно зачем... Запись в каком режиме?
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
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 18:13     Не могу прочитать из файла в класс #5
Цитата Сообщение от ElenaBilyk Посмотреть сообщение
Запись в файл txt, просто как текст.
Отдельные поля структур записываете?

Добавлено через 49 секунд
Больше кода покажите (лучше один раз увидеть...).
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
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 18:51     Не могу прочитать из файла в класс #7
Зачем эти выдумки? Что мешает записать в файл Experience, отдельной строкой, после записи GPA?
ElenaBilyk
4 / 4 / 1
Регистрация: 22.10.2013
Сообщений: 34
11.12.2013, 19:01  [ТС]     Не могу прочитать из файла в класс #8
Такое задание дал препод)))))
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 19:09     Не могу прочитать из файла в класс #9
Цитата Сообщение от 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
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 19:54     Не могу прочитать из файла в класс #11
Цитата Сообщение от ElenaBilyk Посмотреть сообщение
Условие д\з:
Записать в файл студентов, а их experience записать отдельно, после всего массива студентов.
Это меняет дело.
Цитата Сообщение от ElenaBilyk Посмотреть сообщение
может есть какая-то константа ios_base
Цитата Сообщение от ElenaBilyk Посмотреть сообщение
которая будет перемещать указатель на указанное место?
Есть метод seekg().
ElenaBilyk
4 / 4 / 1
Регистрация: 22.10.2013
Сообщений: 34
11.12.2013, 19:59  [ТС]     Не могу прочитать из файла в класс #12
Всё, всем спасибо!!!!

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


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

Добавлено через 3 минуты
Когда задала вопрос еще сама не знала что нужно сделать))) Пока пыталась объяснить что я хочу сделать, в голове сформулировался правильный вопрос, который натолкнул на мысль как это сделать))))). Воистину говорят, что правильно поставленный вопрос это уже половина ответа))))))
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 20:04     Не могу прочитать из файла в класс #13
Там будет ещё вопрос: как считаь строку неизвестной длины в динамическую память. Ведь вы, experience, в динамическую память собираетесь читать?
ElenaBilyk
4 / 4 / 1
Регистрация: 22.10.2013
Сообщений: 34
11.12.2013, 20:08  [ТС]     Не могу прочитать из файла в класс #14
Да, я об этом не подумала...
alsav22
5416 / 4812 / 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++
Добрый день, подскажите пожалуйста что значат следующие выражения: double **a; // &lt;- что это? (а* - это указатель, а что две...

Не могу прочитать данные ячейки памяти - C++
Подскажите пожалуйста что не так. Адресс ячейки вычислил через артмани. Код процесса выводит верно, а значение памяти нет. Для примера взял...

Не могу понять как прочитать файл - C++
Вродь как двоичный файл, но прочитать не могу его.. ...

Не могу прочитать файл произвольного доступа с конца - C++
Странное происходит в функции read_file, а именно не работает seekg. Почему-то читается всё время последнее значение. Почему так и что с...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru