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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите информацию о записи в файлы 
:(
    Опции темы
Podarochek
Дата 25.3.2008, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Изучаю работу с файлами, но материала оч. мало. Везде сухие функции работы с файлами, а толкового объяснения записи структуры или массива структур, я не говорю про указатели и структуры основаны да динамическом связывании. Пожалуйста, поделитесь информацией или источниками...

Добавлено через 45 секунд
язык СИ, не с++
PM MAIL   Вверх
inside_pointer
Дата 26.3.2008, 02:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Podarochek)

Везде сухие функции работы с файлами


А что и куда ты не можешь вывести ?
PM MAIL   Вверх
xvr
Дата 26.3.2008, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Podarochek @ 25.3.2008,  23:49)
Изучаю работу с файлами, но материала оч. мало. Везде сухие функции работы с файлами, 

А тебе нужны мокрые?  smile 
Цитата

а толкового объяснения записи структуры или массива структур, 
Объяснение - НЕ ДЕЛАЙТЕ ЭТОГО! Внутри структур могут быть дырки из-за выравнивания, кроме того, их положение и размер могут зависить от компилятора и режима компиляции. Структуры и массивы рекомендуется писать поэлементно.
Цитата

я не говорю про указатели и структуры основаны да динамическом связывании. 
Объяснение - НЕ ДЕЛАЙТЕ ЭТОГО НИКОГДА!!! Значения указателей имеют смысл только в данном экземпляре работающей программы. Их можно сохранить в файл, и можно потом считать, вот только того, на что они указывали уже не будет (или будет, но в другом месте) .

PM MAIL   Вверх
Podarochek
Дата 26.3.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(xvr @  26.3.2008,  15:02 Найти цитируемый пост)
А тебе нужны мокрые?


нужны примеры алгоритмов, а не синтаксис функций...


Цитата(xvr @  26.3.2008,  15:02 Найти цитируемый пост)
Объяснение - НЕ ДЕЛАЙТЕ ЭТОГО! Внутри структур могут быть дырки из-за выравнивания, кроме того, их положение и размер могут зависить от компилятора и режима компиляции. Структуры и массивы рекомендуется писать поэлементно.



В том то и дело, что я знаю, что не стоит такого делать, но...каким образом записать структуры с изменяемыми по размеру данными, с указателями, динамическими структурами данных...даже мокрое описание синтаксиса об этом не расскажет...:(


но данные надо же хранить и не в оперативной памяти...я уверен, что для этого существует парочка алгоритмов решения такой проблемы...вот где smile 

PM MAIL   Вверх
korian
Дата 26.3.2008, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



пример из хелпа BCB, что конкретно не понятно?
Код

#include <stdio.h>

struct mystruct
{
  int i;
  char ch;
};

int main(void)
{
   FILE *stream;
   struct mystruct s;

   if ((stream = fopen("TEST.$$$", "wb")) == NULL) /* open file TEST.$$$ */
   {
      fprintf(stderr, "Cannot open output file.\n");
      return 1;
   }
   s.i = 0;
   s.ch = 'A';
   fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */
   fclose(stream); /* close file */
   return 0;
}

PM   Вверх
Podarochek
Дата 26.3.2008, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(korian @  26.3.2008,  17:14 Найти цитируемый пост)
пример из хелпа BCB, что конкретно не понятно?

код C++



да...тут ВСЕ понятно!...вот это я называю сухим изложением, демонстрацией синтаксиса функции открытия, записи...гже же пример записи например списка или дерева...вот в чем вопрос..
PM MAIL   Вверх
korian
Дата 26.3.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



дык... тут просто вопрос в принятии решения в какой последовательности сохранять... потом в такой же последовательности загружать.
например дерево можно сохронять в глубину, сохраняя данные и bool, который говорит что пора подняться на уровень выше.
Код

типа есть дерево
root
      item1
              item1.1
              item1.2
              item1.3
      item2
      item3

пишем в файл данные о root, и добавляем false
пишем item1, false
пишем item1.1, true
пишем false
пишем item1.2 true
пишем true
пишем false
пишем item2, true
пишем false
пишем item3,true
<конец файла>

чтение
из начально создаем узел root, потом начинаем читать

читаем root, читаем false - забиваем данные о руте и создаем чилда и переходим к нему
читаем item1, false - тоже самое забиваем данные о item1, создаем чилд для этого item1
читаем item1.1, true - забиваем данные item1.1, чилд не создаем, поднимаемся на уровень вверх (к итему item1)
читаем false - создаем чилд для item1
читаем item1.2, true - забиваем данные item1.2, чилд не создаем, поднимаемся к item1
читаем true - поднимаемся на уровень вверх к root
читаем false - создаем чилд для root
читаем item2, true - забиваем данные item2, чилд не создаем, поднимаемся к root
читаем false - создаем чиль для root
читаем item2, true - забиваем данные item2, чилд не создаем, поднимаемся к root
читаем false - создаем чилд для root
читаем item3, true - забиваем данные item3, чилд не создаем, поднимаемся к root
<конец файла> - дерево готово.


Добавлено через 6 минут и 40 секунд
можно вместо bool писать int и сразу записывать на сколько уровней надо подняться, тогда файлик будет меньше.

Это сообщение отредактировал(а) korian - 26.3.2008, 18:51
PM   Вверх
xvr
Дата 26.3.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Podarochek @ 26.3.2008,  17:01)
Цитата(xvr @  26.3.2008,  15:02 Найти цитируемый пост)
А тебе нужны мокрые?


нужны примеры алгоритмов, а не синтаксис функций...


Цитата(xvr @  26.3.2008,  15:02 Найти цитируемый пост)
Объяснение - НЕ ДЕЛАЙТЕ ЭТОГО! Внутри структур могут быть дырки из-за выравнивания, кроме того, их положение и размер могут зависить от компилятора и режима компиляции. Структуры и массивы рекомендуется писать поэлементно.



В том то и дело, что я знаю, что не стоит такого делать, но...каким образом записать структуры с изменяемыми по размеру данными, с указателями, динамическими структурами данных...даже мокрое описание синтаксиса об этом не расскажет...:(


но данные надо же хранить и не в оперативной памяти...я уверен, что для этого существует парочка алгоритмов решения такой проблемы...вот где smile

Если интересуют универсальные алгоритмы записи чего угодно в файл, то таких не существует (ни для C ни для C++) Такие алгоритмы можно реализовать на языках поддерживающих интроспекцию и динамическое создание типов - например на Java.
Если нужно сохранить КОНКРЕТНЫЕ структуры данных, то под них разрабатывают КОНКРЕТНОЕ представление их в файле и пишут КОНКРЕТНЫЕ процедуры сохранения и восстановления. Существуют библиотеки, облегчающие такое сохранение и восстановление, но они в основном все на С++ (искать по ключевому слову Streaming)
PM MAIL   Вверх
Podarochek
Дата 27.3.2008, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(xvr @  26.3.2008,  19:58 Найти цитируемый пост)
Если интересуют универсальные алгоритмы записи чего угодно в файл, то таких не существует (ни для C ни для C++) Такие алгоритмы можно реализовать на языках поддерживающих интроспекцию и динамическое создание типов - например на Java.
Если нужно сохранить КОНКРЕТНЫЕ структуры данных, то под них разрабатывают КОНКРЕТНОЕ представление их в файле и пишут КОНКРЕТНЫЕ процедуры сохранения и восстановления. Существуют библиотеки, облегчающие такое сохранение и восстановление, но они в основном все на С++ (искать по ключевому слову Streaming) 


Со всем согласен...но...увидеть бы хоть один пример записи динамической структуры (например списка) в файл. Согласитесь, увидев первый раз функции для работы с файлами, придумывать алгоритм записи динамической структуры как-то ...хотелось людей посмотреть, ну и потом можно и себя показать...smile.
Библиотеки С++ пока не трогаю как и в целом С++, до него еще руки дойдут...

PM MAIL   Вверх
inside_pointer
Дата 27.3.2008, 05:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А ты прочитать то вообще можешь список если он у тебя создан ?

a - b - c - d

прочитал а записал, перешёл к b прочитал записал
Если ты с ними работаешь то наверное умеешь уже всё это, а если не умеешь тут проблема не с файлами, файл это просто поток.

Можешь сделать строку abcd ?
PM MAIL   Вверх
korian
Дата 27.3.2008, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



вот пример сохранения дерева, по алгоритму описанному выше.

Код

struct NodeList;

struct Node
{
    Node() : childs(NULL) {}
    int data;
    NodeList* childs;
};

struct NodeList
{
   NodeList() : prev(NULL), next(NULL) {}
   Node node;
   NodeList* prev;
   NodeList* next;
};

void SaveTree(const Node& node, std::ostream& st)
{
    st << node.data << '\t';
    if (node.childs)
    {
         for (NodeList* tmp = node.childs; tmp != NULL; tmp = tmp->next)
         {
               st << false << std::endl;
               SaveTree(tmp->node, st);
         }
    }
    st << true << std::endl;
}

void LoadTree(Node& node, std::istream& st)
{
    st >> node.data;

    node.childs = new NodeList();
    NodeList* curchild = node.childs;
    while(true)
    {
        bool flag;
        st >> flag;
        if (flag)
           break;

        LoadTree(curchild->node, st);
        curchild->next = new NodeList();
        curchild->next->prev = curchild;
        curchild = curchild->next;
    }
    if (curchild->prev)
    {
       curchild = curchild->prev;
       delete curchild->next;
       curchild->next = NULL;
    }
    else
    {
       delete node.childs;
       node.childs = NULL;
    }
}

void main()
{
    Node root;
    LoadTree(root, std::cin);
    SaveTree(root, std::cout);
}


Это сообщение отредактировал(а) korian - 27.3.2008, 08:52
PM   Вверх
Podarochek
Дата 27.3.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(inside_pointer @  27.3.2008,  05:15 Найти цитируемый пост)
А ты прочитать то вообще можешь список если он у тебя создан ?

a - b - c - d

прочитал а записал, перешёл к b прочитал записал
Если ты с ними работаешь то наверное умеешь уже всё это, а если не умеешь тут проблема не с файлами, файл это просто поток.

Можешь сделать строку abcd ? 


void Get(list*pl,char *&vux)
{static int i=0;
   if(pl!=NULL) {
        vux[i++]=pl->kej;
        Get(pl->next,vux);}
else{vux[i]='\0';

}



Цитата(korian @  27.3.2008,  08:50 Найти цитируемый пост)
вот пример сохранения дерева, по алгоритму описанному выше.


Цитата(korian @  27.3.2008,  08:50 Найти цитируемый пост)
Node() : childs(NULL) {}


такой записи не встречал



Цитата(korian @  27.3.2008,  08:50 Найти цитируемый пост)
st << node.data << '\t';

и такой :(

PM MAIL   Вверх
inside_pointer
Дата 27.3.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

int Get(list * pl,char * vux)
{
    static int i=0;
    if(pl != NULL) {
        vux[i++]=pl->kej;
        Get(pl->next,vux);
    }
    else {
        vux[i]='\0';
        return 5;
    }
}

Если твоя штука работает, то попробуй вот такую, смысл в том, что когда самая первая функция в стеке возвращает 5 значит имеется строка, которую можно передать в поток(файл).
А что правда твоя i по всей строке проходит а не записывает детей друг на друга ?
PM MAIL   Вверх
korian
Дата 27.3.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



издеваетесь... ну вот почти на чистом C
new надо malloc'ом заменять?
Код

struct NodeList;

struct Node
{
    int data;
    NodeList* childs;
};

struct NodeList
{
   Node node;
   NodeList* prev;
   NodeList* next;
};

void SaveTree(const Node& node, FILE* file)
{
    fprintf(file, "%d\t", node.data);
    if (node.childs)
    {
         for (NodeList* tmp = node.childs; tmp != NULL; tmp = tmp->next)
         {
               fprintf(file, "0\n");
               SaveTree(tmp->node, st);
         }
    }
    fprintf(file, "1\n");
}

void LoadTree(Node& node, FILE* file)
{
    fscanf(file, "%d", &node.data)

    node.childs = new NodeList;
    NodeList* curchild = node.childs;
    while(true)
    {
        curchild->node.childs = NULL;
        curchild->prev = NULL;
        curchild->next = NULL;

        int flag;
        fscanf(file, "%d", &flag)
        if (flag)
           break;

        LoadTree(curchild->node, st);
        curchild->next = new NodeList();
        curchild->next->prev = curchild;
        curchild = curchild->next;
    }
    if (curchild->prev)
    {
       curchild = curchild->prev;
       delete curchild->next;
       curchild->next = NULL;
    }
    else
    {
       delete node.childs;
       node.childs = NULL;
    }
}

void main()
{
    Node root;
    root.childs = NULL;
    LoadTree(root, stdin);
    SaveTree(root, stdout);
}


Это сообщение отредактировал(а) korian - 27.3.2008, 13:01
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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