Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: читаем из файла в структуру  (Прочитано 8822 раз)
0 Пользователей и 1 Гость смотрят эту тему.
genchik
Гость
« : 12-04-2005 04:37 » 

Почему когда читаем из файла в структуру, которая передается в виде указателя на нее, то она возвращает чушь вместо нормальных значений, а если в теле этой же функции создать такой же объект (не указатель) и затем указателю присвоить его адрес, то все нормально?
 :?
не работает так как надо:
void getStruct(char *name, item *it) {
FILE *f;
f = fopen(name, "rb+");
fread(it, sizeof(item), 1);
}
различные проверки я опустил для простоты примера

работает:
void getStruct(char *name, item *it) {
FILE *f;
item st;
f = fopen(name, "rb+");
fread(&st, sizeof(item), 1);
*it = st;
}

Записан
Alf
Гость
« Ответ #1 : 12-04-2005 06:31 » 

На какой платформе компилируется программа? Например, для VC++ функция fread имеет 4 аргумента.
Записан
Pu
Большой босс

ru
Offline Offline
78


« Ответ #2 : 12-04-2005 08:08 » 

Код:
#pragma pack(1)

struct s
{
.....................
};
#pragma pack()
хотя не уверен что в этом дело
« Последнее редактирование: 12-04-2005 08:13 от Pu » Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Migmile
Помогающий

ru
Offline Offline

« Ответ #3 : 12-04-2005 11:55 » 

На какой платформе компилируется программа? Например, для VC++ функция fread имеет 4 аргумента.
- если бы еще указать откуда читать (нет ссылки на открытый файл)Улыбаюсь
Если же она есть, то возможна путаница с указателем *it; Случайно в программе нет глобальной переменной с темже именем?
Записан
genchik
Гость
« Ответ #4 : 12-04-2005 22:13 » 

Упс Улыбаюсь. Ссылку на файл из которого читаем пропустил. но читаем именно из f, это все есть. и глобальной переменной с именем таким нет. компилирую на билдере шестом.
Записан
michaelprog
Гость
« Ответ #5 : 13-04-2005 04:53 » 

у моего друга на Builder6 такая же проблемма, как поборол еще не знаю. Жаль
попробуй ссылку на указатель:
void getStruct(char *name, item*& it)

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

ru
Offline Offline
78


« Ответ #6 : 13-04-2005 06:13 » 

вообще-то по жизни использую и уже давно STL-ные потоки, как бы и жизн облегчается
Код:

#pragma pack(1)  // эти прагмы указывают под виндами компилятору что данные в структуре  item надо подравнять по одному байту, если их нет по умолчанию это будет двойное слово
struct item
{
  char c;
........
};
#pragma pack()

#include <fstream>
void getStruct(char *name, item *it)
{
    std::fstream fs( name, std::ios::binary | std::ios::in);
    if( !fs.is_open())
       return;
    fs.read((char *)it, sizeof(item));
    // ну и все, можно конечно закрыть и проверить состояние потока  обработать исключения но это уже совсем другая песня :)
}
« Последнее редактирование: 13-04-2005 06:15 от Pu » Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
genchik
Гость
« Ответ #7 : 14-04-2005 00:21 » 

НУ что же, спасибо за ответы и рекомендации. Буду пробовать!  Улыбаюсь
Записан
Migmile
Помогающий

ru
Offline Offline

« Ответ #8 : 14-04-2005 07:00 » 

Ищи ошибку в указателях в другом месте! Этот код правильный. Где-то портишь память.
Записан
genchik
Гость
« Ответ #9 : 14-04-2005 22:32 » new

Оно может конечно и в другом месте где нить портится память, но дебагер показывает неверные значения уже в этой процедуре сразу после чтения из файла Жаль . я тоже поначалу думал что где то подпортил пямять
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines