Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 56 из 87<  1 ... 53  54  55  56  57  58  59 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 15.08.2007
manya
строки должны заканчиваться 0, у тебя этого нет, в конце циклов нужно persons[i].name[j] = 0. И по хорошему так как эти циклы одинаковы то нужно выделить функцию, а еще лучше заменить на scanf...

при выводе в файл, нужно добавить разделитель, иначе все сольется
fprintf(f_out,"%s\n",persons[j].name);
fprintf(f_out,"%s\n",persons[j].sirname);

и это все можно заменить вызовом одной функции:

Код:
   fprintf(f_out,"%s\n%s\n%d\n", persons[j].name,
                                 persons[j].sirname,
                                 persons[j].phone); //и т.д. остальные поля записать



fwrite используется для записи (как правило) в бинарном виде, т.е. нужно файл открыть "wb", и писать так:

fwrite(&persons[i], sizeof(phonebook), 1, f_out);

а еще лучше заменить одной функцией, без цикла:

fwrite(persons, sizeof(phonebook), count, f_out);

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

Код:
#pragma pack(push)
#pragma pack(1)
struct phonebook
   {
      long phone;
      char name[N];
      char sirname[N];
      int length_1;
      int length_2;
      int year_birth;
      int month_birth;
      int day_birth;
   };
#pragma pack(pop)


тут задано выравнивание в 1 байт (т.е. в памяти будет все плотно лежать)



Партнер
 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
progn, спасибо большое за просвещение :writer:
:-)

Добавлено спустя 1 час 9 минут 23 секунды:
и еще вопрос. Какая функция( или что-нибудь типа того), чтобы закрывать консольное окно?

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
manya
нахаляву не получится... Или Вы берете в свои руки ввод и вывод, либо полагаетесь на библиотеку компилятора, которая делает все: создание окон, убиение окон и пр. :-)
И, да, кстати, DOS-приложение и Win32-консольное приложение - две большие разницы (с)

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
manya писал(а):
и еще вопрос. Какая функция( или что-нибудь типа того), чтобы закрывать консольное окно?

Извини, manya, не твоя прога консоль открывала - не ей её закрывать. ;) Если присмотреться, то этот код скомпилится под любой осью, под любыми GUIями


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
всем спасибо за участие ;)

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
manya писал(а):
и еще вопрос. Какая функция( или что-нибудь типа того), чтобы закрывать консольное окно?


А зачем его закрывать?

Консольное окно в Windows, точно такое же окно как и все остальные, поэтому
CloseWindow() (нужно подключить windows.h и указать user32.lib)

хендл окна можно получить как например тут указано:
http://www.sources.ru/msdn/howto/q124103.shtml

Код конечно потеряет переносимость, в unix не пойдет :) там самого понятия консольное окно нет, хотя там можно закрыть терминал , если он тебе не нужен (так делаются "демоны" - программы работающие в фоновом режиме и не привязанные к пользователю).


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
о, спасибо :beer:

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
здравствуйте, товариСчи)
При написании архиватора по алгоритму Хаффмана возникла проблема... С кодированием все круто, а вот с раскодированием..... Есть двоичное дерево, необходимо записать его в файл, а потом восстановить.
Код:
struct sym
{
   sym *left;
   sym *right;
};

Про то, как это делать теоретически, я знаю :oops: Но практически......
Как бы сие реализовать?
ЗЫ гугл не помог

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
manya
скачайте исходники LHA.... или аналогичного архиватора.

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
manya

вариант 1.
нужно обойти дерево и сохранить полезные данные узлов, а при загрузке строить дерево заново, по тому же алгоритму по которому это дерево было постоено.

вариант 2.
у варианта 1 есть недостаток, алгоритм постоения дерева может быть тяжелым и загрузка файла будет медленная. Поэтому можно сделать по другому. Сохранять в файл не только данные, но и признаки к какому узлу подсоединять этот узел, и куда (в лево или в право). Но тут тоже может быть непросто, если дерево большое.

вариант 3.
можно хранить все узлы в массиве, и в узлах указатели на левый/правый листы заменить на индексы в этом массиве. Т.е. типа такого:

struct Node
{
Data data;//какие то полезные данные
unsigned index_left;
unsigned index_rigth;
};

Node pool[MAX_NUM_NODE]; // массив где будет храниться дерево
unsigned num_nodes = 0; //количество узлов реально сохраненных в пуле

тогда сохранение и загрузка, будет элементарной, просто сохраняешь/читаешь num_nodes и массив

но тут может усложниться сама работа с деревом.


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
о-о-о-о, спасибо большое :-)

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
Также можно сохранять дерево в форме списка при обходе дерева:
Код:
...save_tree(struct sym* el)
{

 if(!el) return; //вылазим из рекурсии

 сохраняем el->data; // данные элемента;
 пишем разделитель, к примеру "{"

 save_tree(sym* el->left); //сохраняем левое поддерево

 пишем разделитель, к примеру ","

 save_tree(sym* el->right); //сохраняем правое поддерево

 пишем разделитель, к примеру "}"
}


Функция чтения древа будет посложнее (необходимо парсить разделители)


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
спасиб :beer:

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 11.01.2009
Прошу помочь, я использую компилятор Borland C++ 3.1, и когда я ставлю курсор, чтобы писать код - то символы, которые стоят ПЕРЕД курсором меняются на те, что я набираю, а как сделать, чтобы не заменялись, а вставлялись.


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
tolikrog
INS нажмите на клавиатуре....

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 11.01.2009
Root писал(а):
tolikrog
INS нажмите на клавиатуре....

Благодарю, получилось.


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
всем добрый вечер. В общем есть проблема. Есть некоторый массив char из 0 и 1: 100110010010111011010100110001101111100.......Нужно упаковать биты в байты по 8 шт и записать в файл. Как это сделать?( я не про запись в файл :D )

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
manya
Для начала сделаем вид, что кол-во элементов массива кратно 8. Тогда:
Код:
// N - массив
for (i = 0; i < размер_массива/8; i+=8)
{
    BYTE x = (N[i]-'0')*0x80 + (N[i+1]-'0')*0x40 + (N[i+2]-'0')*0x20 + (N[i+3]-'0')*0x10 + (N[i+4]-'0')*0x8 + (N[i+5]-'0')*0x4 +  (N[i+6]-'0')*0x2 + (N[i+7]-'0')*0x1;
    // пишем x в файл
}

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


Последний раз редактировалось Root 20.11.2009 20:54, всего редактировалось 1 раз.

 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
спасибо=)

Добавлено спустя 14 минут 36 секунд:
А если не кратно восьми, то что делать?

Добавлено спустя 10 минут 45 секунд:
error C2109: для индекса требуется массив или указатель :weep: :weep: :weep:

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
через битовые операции лучше делать

Код:
   char arr[] = {1,0,1,1,1,1,1,1,0};

   for(int i = 0; i < sizeof(arr);)
   {
      unsigned char cur_byte = 0;

      for(int bit = 0; bit < 8 && i < sizeof(arr); ++bit, ++i)
      {
         cur_byte <<= 1;
         cur_byte |= arr[i];
      }

      // записать cur_byte в файл
   }


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 56 из 87<  1 ... 53  54  55  56  57  58  59 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan