Здравствуйте, такая проблема: есть class: class CChar { public: unsigned char Name; unsigned short Index; }; sizeof(Name) == 1; sizeof(Index) == 2; Почему bc 3.0 (под ДОС) мне упрямо говорит что sizeof(CChar) == 4? и в файл тоже пишет 4 байта, откуда он его вообще берет? И как от этого избавиться? Еще вопрос: Что значит третий параметр в функции fwrite/fread? и до кучи: метод: int CChar::SaveToFile(FILE *fp) { int n = fwrite(&Name, sizeof(Name), 1, fp); n += fwrite(&Index, sizeof(Index), 1, fp); return n; } IMHO: должно быть == 3 т.к. fwrite возвращяет число записанных байт так и есть в файле 3 байта а на самом деле n == 2 Почему так? Что значит третий параметр как я уже писАл - незнаю
Приветствую Вас, Serzhant! Если включено выравнивание (по умолчанию включено почти везде, т.к. ускоряет многие операции), то может теоретически и 10 вернуть ;). Поэтому во всех умных книжках пишется, что сравнивать(писать в файл также) структуры как массив байт крайне не рекомендуется, т.к. в данном массиве могут быть дырки, значение которых не определено. Сохраняй в файл почленно. Избавляться от этого не рекомендуется, - нужно просто правильно писать. Третий параметр в fread/fwrite - это количество блоков чтения/записи размер которого(блока) равен второму параметру. Функция возвращает не число записанных байт, а число блоков, поэтому возвращается все правильно Советую дернуть в инете русский мануал по glibc, - в нем все эти функции расписаны прекрасно. Если нужно, могу на ящик сбросить. Удачи
Ответ отправлен: 26.11.2002, 10:19 Отправитель: Yuri Gordienko Отвечает Avl2k
Приветствую Вас, Serzhant! 1. Размер структуры в общем случае не равен сумме размеров ее членов, поскольку компиляторы для оптимизации (быстрее доступ к данным) применяют выравнивание данных по определенной границе. В данном случае стоит выравнивание по границе 2 или 4. Не знаю как в bc 3.0, а в VC++ для управления выравниванием есть опция компилятора и #pragma pack. 2. В функции fwrite второй параметр - это размер элемента, а третий - количество элементов указанного размера, которые необходимо записать. И возвращает она не количество записанных байт, а количество записанных элементов. Поэтому и возвращается 2, так как в обоих вызовах было записано по одному элементу. С уважением, Avl2k. Ответ отправлен: 26.11.2002, 10:32 Отправитель: Avl2k Отвечает Dzik
Здравствуйте, Serzhant! 1)4 потому, что идет округление до long, т.е. пишется в любом случае число кратное 4 2)3 парметр это кол-во записываемых элементов.
Ответ отправлен: 26.11.2002, 05:35 Отправитель: Dzik Отвечает vitya
Доброе время суток, Serzhant! Есть такое понятие, как alignment. Он все структуры делает кратными 4 байтам. Второй параметер из себя представляет размер элемента, который будет записываться в файл, а третий параметр - их количество.
Ответ отправлен: 26.11.2002, 14:27 Отправитель: vitya Отвечает Jadd
Приветствую Вас, Serzhant! 1) А сколько, по-твоему, должно быть? Давай считать: unsigned char - 1 байт, unsigned short - 2 байта. Далее, идет выравнивание памяти до 4-х байт. Причем, скорее выравнивание будет таким: 1 байт под char, 1 байт под выравнивание и 2 байта под short. Все просто. Избавиться от этого можно используя директиву препроцессора #pragma с опцией pack 2)третий параметр fread/fwrite - size_t count. Согласно MSDN - Maximum number of items to be read/written. Т.е. fread считывает count элементов размером size каждый в буффер Buffer из потока stream. 3)А как инициализируется Index? Чаще всего Index первого элемента равен 0. Ответ отправлен: 26.11.2002, 15:07 Отправитель: Jadd
Форма отправки вопроса
Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook"
и "Microsoft Outlook Express". В программе The Bat!
подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте,
что в некоторых браузерах могут стоять запреты на открытие других
окон, а также "чрезмерное" кэширование данных,
при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet
Explorer 5.0+ или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.