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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятки со структурой 
:(
    Опции темы
tenebris
  Дата 10.9.2008, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет!!! Значит дело такое. Есть большая структура порядка 20 записей.
Все записи разного размера, т.е. надо считывать из файла определенное количество байт. Может здесь ошибка, но я использую тип char. Нужно считать в структуру файл. И вот здесь получается вот что. Допустим у меня есть последняя запись. Я её вывожу -всё нормально. Но как только я вывожу на экран предпоследнюю запись, он кроме неё выводит и последнюю, т.к. не видит конца строки. Что тогда говорить о первой - выводится вся структура. Как с этой проблемой справиться. Помню в паскале было всё легко. А здесь этот символ конца строки мешает. Может другой тип использовать. Дописывать символ конца строки очень напряжно если структура вырастит до 40 записей. Просьба пример привести на с, а не на с++. Спасибо.
PM MAIL   Вверх
andrew_121
Дата 10.9.2008, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



tenebris, Это все классно! smile  Но не понятно smile 
Код выкладывай.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Mayk
Дата 10.9.2008, 09:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



ничего не понял, если честно, начиная отсюда.
Цитата(tenebris @  10.9.2008,  13:30 Найти цитируемый пост)
Есть большая структура порядка 20 записей.

В структуре не бывает записей. Никогда не было, никогда не будет. Нет такого понятия в си отродясь
Цитата(tenebris @  10.9.2008,  13:30 Найти цитируемый пост)
. Может здесь ошибка, но я использую тип char.

очевидно что в char можно считать ровно один байт.

Добавлено через 20 секунд
Цитата(andrew_121 @  10.9.2008,  13:33 Найти цитируемый пост)
Код выкладывай. 

+1


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
tenebris
Дата 10.9.2008, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну поле, поле. Запись это в паскале. Никак не могу перейти от него к си.

Добавлено через 5 минут и 32 секунды
Вот

Код

struct header
{
 char stack[4];
 char pc[4];
 char inter[9];
 char flag[2];
.
..
....
};

Вот, при выводу на экран h.flag - всё норма, показывается 2 байта в хексе. А вот когда я прошу вывести на экран h.inter ,мне показывается не только 9 байт но и ещё +2 байта след. пункта и т.д. А мне нужно точно, не вылезая на след. запись. Но здесь всё дело в конце строки. Но поля разного размра. Там инфа об образе. Как с этим бороться. Какой тип использовать?

PM MAIL   Вверх
xvr
Дата 10.9.2008, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(tenebris @ 10.9.2008,  10:00)
Ну поле, поле. Запись это в паскале. Никак не могу перейти от него к си.

Добавлено @ 10:05
Вот

Код

struct header
{
 char stack[4];
 char pc[4];
 char inter[9];
 char flag[2];
.
..
....
};

Вот, при выводу на экран h.flag - всё норма, показывается 2 байта в хексе. А вот когда я прошу вывести на экран h.inter ,мне показывается не только 9 байт но и ещё +2 байта след. пункта и т.д. А мне нужно точно, не вылезая на след. запись. Но здесь всё дело в конце строки. Но поля разного размра. Там инфа об образе. Как с этим бороться. Какой тип использовать?

В C строки (а у тебя все поля твоей структуры именно они и есть) завершаются нулем. Так что в inter например влезет только 8 символов (и 9й ноль). Если у тебя там будет 9 символов (или не будет нуля в конце) то любая функция C, работающая со строками, будет перебирать память за границами твоего inter, пока не найдет 0

PM MAIL   Вверх
andrew_121
Дата 10.9.2008, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(tenebris @  10.9.2008,  10:00 Найти цитируемый пост)
показывается не только 9 байт но и ещё +2 байта след. пункта и т.д.

Про выравнивание не забудь!

tenebris, Выложи еще код заполнения структуры + чтение из файла + запись в файл.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 10.9.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(tenebris @  10.9.2008,  10:00 Найти цитируемый пост)
Ну поле, поле. Запись это в паскале. Никак не могу перейти от него к си.

в паскале запись это Record, a переменные класса также называются полями.


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


трололомен
****


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

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



Цитата(mes @  10.9.2008,  13:39 Найти цитируемый пост)
переменные класса также называются полями.

как они только не называются  smile 

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


Новичок



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

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



Блин что никто не поможет чтоль. Ща выложу код и ещё раз подробно расскажу
PM MAIL   Вверх
Lazin
Дата 10.9.2008, 15:08 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



 smile 
впервые встречаю настолько понятное описание проблемы smile 
PM MAIL Skype GTalk   Вверх
tenebris
Дата 10.9.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 smile 

Есть бинарный файл, к примеру avi.  У меня есть структура зоголовка файла. В свою структуры я пытаюсь прочесть этот заголовок.  В этом заголовке нету никаких концов строк- спец. символов. Потому что там указателе к примеру  данные о выделении памяти. Короче это всё условность. Делаю это так
Приведу два поля структура для простоты и наглядности.

Код

#include <stdio.h>
#include <conio.h>
#include <iostream.h>

struct header
{
 unsigned char stack[4];
 unsigned char pc[5];
};

int main()
{
 header h;
 clrscr();
 FILE *avi;
 avi = fopen("c:\\1.avi","r");
 fseek(avi,0,SEEK_SET);
 fread(&h,1,sizeof(h),avi);
 return 1;
}

Вот.
При выводе последнего поля pc - он выводиться нормально.  Но когда я вывожу  stack, выводиться оно само плюс поле pc, т.к. нету конца строки. Как это побороть?

Это сообщение отредактировал(а) tenebris - 10.9.2008, 15:39
PM MAIL   Вверх
Fazil6
Дата 10.9.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



tenebris,  ну ты оригинал.... А что у нас с выравниванием при таком способе считывания? Ну вообще для вывода каждого поля в твоем случае нужно писать отдельную функцию, которая знает длину этого поля и выводит только его. А вообще лучше завести отдельную структуру с константами длин полей и считывать каждое поле по отдельности в цикле лепя каждому '\0' в конец.

PM MAIL   Вверх
tenebris
Дата 10.9.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

 А что у нас с выравниванием при таком способе считывания


Не знаю про что ты.
Блин, ну а как пишут все проги для проигрывания файлов к примеру. Они же заголовок рассматривают. Это важная вешь, как они эту проблему решают. 
Длину каждого поля я знаю. Это определенные смещения, и каждое поле имеет свою длину 
т. е. константу. Нельзя там как-нить через указатели это реализовать.
PM MAIL   Вверх
Fazil6
Дата 10.9.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Цитата(tenebris @  10.9.2008,  16:07 Найти цитируемый пост)
Не знаю про что ты.

в зависимости от длин полей и настроек компилятора между полями могут быть "дырки", а ты пишешь, так будто они всегда одно за другим идут
Цитата(tenebris @  10.9.2008,  16:07 Найти цитируемый пост)
Длину каждого поля я знаю. Это определенные смещения, и каждое поле имеет свою длину 

ну вот и пользуйся этим знанием при считывании
PM MAIL   Вверх
tenebris
Дата 10.9.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

ну вот и пользуйся этим знанием при считывании 


А что я разве этим не пользуюсь, когда в структуре обявляю переменную в 6 байт к примеру.

2) Второй вопрос появился. Допустим у меня в типе char записано значение 0XFFFF. Как мне его привести к типу int или другому целочисленному чтобы там тоже было ffff, но интерпретировался не как символ, а как число т.е. в десятичной системе 65535. Т.е. чтоб эти числа вывелись на экран

Добавлено через 9 минут и 27 секунд
2)

Код

 char slovo[2]={'a','c'};
 unsigned int i =(char)slovo;
 cout << i;

Почему при изменении букв, значение переменой i не меняется хотя оно формируется из внутреннего кода букв? 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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