Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись в файл Класов и Структур 
V
    Опции темы
TGrey
Дата 1.5.2008, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Здравствуйте, увидел непонятный для себя код, нашел его в нэте стало понятно для чего он.
Вот теперь пробую поэксперементировать с ним, но, что-то неочень выходит.

Суть такова: Запись в файл Класов и Структур.
Код

input_file.read(buffer, sizeof(buffer)) ;
output_file.write(buffer, sizeof(buffer));


Написал свой тестовый клас:
Код

#include <iostream.h>
#include <fstream.h>

class Man
{
public:
    char *name;
    char *sname;
    int age;
    Man()
    {
        name = "none";
        sname = "none";
        age = 0;
    }
};

void main()
{
    ofstream file("class.txt");
    ifstream read("class.txt");
    Man m;
    m.age = 18;
    m.name = "Stepa";
    m.sname = "Petrov";
    file.write((char*)&m,sizeof(Man));

//    read.read((char*)&m, sizeof(Man));
//    cout<<m.age<<endl<<m.name<<endl<<m.sname<<endl;

}

    

Таким образом производится запись в файл.

Дальше самом собой нужно получить єту инфу из файла:
Код

#include <iostream.h>
#include <fstream.h>

class Man
{
public:
    char *name;
    char *sname;
    int age;
    Man()
    {
        name = "none";
        sname = "none";
        age = 0;
    }
};

void main()
{
//    ofstream file("class.txt");
    ifstream read("class.txt");
    Man m;
    m.age = 1;
    m.name = "аааааа";
    m.sname = "ееееееее";
//    file.write((char*)&m,sizeof(Man));

    read.read((char*)&m, sizeof(Man));
    cout<<m.age<<endl<<m.name<<endl<<m.sname<<endl;

}    

Таким образом выводятся данные введеные в файл в предидущем коде вроде все нормально, но смущает несколько вещей:
Если закоментировать
Код

    m.age = 1;
    m.name = "аааааа";
    m.sname = "ееееееее";

тогда я получаю на экране
Цитата

18

class.txt

Что-то не то... Думал поможет конструктор в классе, но в итоге:
Цитата

18

none


Вот собственно и вопрос, почему так происходит... Зачем нужно обязательно заполнять дч класса и и менно в мэйне.
PM MAIL   Вверх
archimed7592
Дата 1.5.2008, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



TGrey, фишка в том, char* - это указатель, т.е это 4 байта(вне зависимости от длины самой строки)... Как думаешь, можно ли по 4-м байтам восстановить всю строку(длиною, к примеру, в 100 символов)?

То что  ты пытаешь сделать называет сериализацией(и последующей десериализацией) и эта проблема не решается одной строкой(к примеру, есть целая библиотека в Boost с соответствующим названием)...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
TGrey
Дата 1.5.2008, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Полазил в нэте толком ничего не нашел, но успел догадатся, что на данный момент это не для моего  ума дела. А жалко, походу полезная вещь.
PM MAIL   Вверх
MHz
Дата 1.5.2008, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 1.5.2008

Репутация: нет
Всего: нет



для структур можно сделать следующее: 
Код


#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>

typedef struct __X {    int a;
            int b;};    

typedef struct __X X;

int main(int atgc, char *argv[]){
    X st =    {    .a = 1024,
            .b = 666};
    char *buff = (char*)&st;
    int fd = open("serialized.dat", O_WRONLY, S_IRUSR | S_IWUSR | S_IXUSR);
    if (!fd) return 0;
    write(fd, buff, sizeof(X));
    close(fd);
    return 0;
}

структура будет записана на диск. но это варварский метод =)))
с классами все намного сложнеее - придется либо в класс включать код сериализации/десериализации, либо писать сериализатор, что намного сложнее.

Это сообщение отредактировал(а) MHz - 1.5.2008, 11:51
PM MAIL   Вверх
TGrey
Дата 1.5.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Говорю же, пока, это не для меня)))
PM MAIL   Вверх
TGrey
Дата 1.5.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Ммм ладно, а все же какой тогда другой есть метод для сохранения Класов и Структур которой я бы смог понять(я только начал изучать работу с файлами).
Ну и само собой удобном извлечении информации из файла.
PM MAIL   Вверх
archimed7592
Дата 1.5.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(TGrey @  1.5.2008,  16:03 Найти цитируемый пост)
Ммм ладно, а все же какой тогда другой есть метод для сохранения Класов и Структур которой я бы смог понять(я только начал изучать работу с файлами).
Ну и само собой удобном извлечении информации из файла. 

Ну, начни с того, что разберись с тем, что такое строка в С++. Попробуй их покопировать, динамически по создавать и т.д.
Потом попробуй записать просто строку в файл. Потом считать её и вывести на экран.
Короче говоря, программирование осваивается поэтапно. Этапы для данной проблемы я вроде очертил. Если есть желание действительно разобраться и научиться, то всегда рад буду подсказать. В данном разделе, в категории "статьи" есть статья о "строках, классах и чём-то ещё" - начни с прочтения этой статьи.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
TGrey
Дата 1.5.2008, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Уже начал)) Ну я в общем работал с строками, а именно char *. Но единственное, что не помешает - выучить функции для их обработки, сравнение, контактинация, копирование...
Просто сейчас уже пошлло обучение работы с файлами, а я его даже не начинал учить.
Вот и получилось так, что на лабараторной в программе я встретил участок кода из первого поста, но ни я сам ничего не понял ни преподователь несмог объяснить т.к. сама взяла его из книги по С++.
А тут теперь еще и узнаю, что им пока лучше не пользоватся)) Вот весело получается прийдется классы писать по отдельности каждый эллемент. smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0742 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.