Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2010, 16:36   #1
necroant
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 10
По умолчанию Как размножаются байты?

Возникли проблемы с записью в файл. Предистория вопроса.

Поделенные "половинки" пишу в файл, вот так:

Код:
fseek(fIn , 0 , SEEK_END);
lSize = ftell(fIn);
rewind(fIn);

byte upper;
byte lower;
                                                            
 for(i=0;i<lSize;i++){
  fread(&buf,1,sizeof(buf),fIn);
  upper = (buf >> 4) & 0xf;
  lower = buf & 0xf;
  fwrite(&upper, 1, sizeof(upper), fOut);
  fwrite(&lower, 1, sizeof(lower), fOut);
 };
В результате записи имеем "половинки" байтов, и, ВНЕЗАПНО, артефакты непонятного происхождения в количестве где-то 1 байт на 32 байта записи. Проблемы с билдером, или с моей головой?

Последний раз редактировалось Stilet; 18.06.2010 в 16:56.
necroant вне форума Ответить с цитированием
Старый 18.06.2010, 16:50   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

начнем с того что вы пишете по одному байту, на каждый fwrite(итого 32 байта файла это 16 ваших целых байт)
что значит артефакты то?
лишние байты чтоли?(не 32 а 33?)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.06.2010, 17:00   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
1, sizeof(upper)
А ты ниче не перепутал?
Вот из хелпа:
Цитата:
fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.06.2010, 17:32   #4
necroant
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 10
По умолчанию

Цитата:
что значит артефакты то?
лишние байты чтоли?(не 32 а 33?)
Именно так. Причем не каждый раз. Я пробовал с различными исходными текстами, такое впечатление что появятся лишние байты или нет - зависит от этого.
Цитата:
А ты ниче не перепутал?
Вот из хелпа:
Да, вы безнадежно правы, напутал. Исправил. Не помогло. Ну в принципе логично, sizeof(char) как раз 1...


upd:
Кажется, нашел. И байты эти всегда одинаковые - 0x0D. Встречаются в тексте по 1, из-за чего файл с "половинками" оказывается нечетной длины. Это рушит все остальные подсчеты которые я делаю дальше.

upd2:
Во, блин. Оказывается машина-дура находит в тексте либо символ возврата каретки, либо "приравненые к нему" младшие разряды, например, буквы z в ASCII коде. И фалломорфирует. Как с этим бороться - непонятно.

upd3:
Загадка решена, тему можно закрывать. Я открывал файл как текст, а надо было - как бинарик. Тогда компиллятор не добавляет по собственной инициативе к найденному 0x0D, on же CR("Carriage return") еще и 0x0A ("Line Feed").

Последний раз редактировалось necroant; 18.06.2010 в 20:37.
necroant вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
idHTTP. Пропадают байты запроса !!! IvanBegin Работа с сетью в Delphi 4 08.02.2010 15:53
Удалить байты KoBRaAndrey Общие вопросы Delphi 3 22.01.2010 17:53
Байты и биты Karp_13 Общие вопросы Delphi 9 10.11.2009 00:33
Байты в стринги FaTaL Общие вопросы Delphi 9 18.04.2008 15:46