С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
alextram

Глючит fwrite (пишет 5 байт вместо 4)

26.03.2011, 11:49. Показов 2971. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Среда: C++ Builder 2010.

В некий файл пишутся всякие бинарные данные (типы char/int/long) при помощи fwrite. Казалось бы, задача проще некуда. Много раз выполяется команда:

fwrite(&x, 4, 1, f);

x — типа unsigned long, в ней в момент глюка содержится значение 0xC000000A. Казалось бы, в файле должны оказаться байты: 0x0A 0x00 0x00 0xC0. Но в реальности перед ними откуда-то берётся пятый байт, 0x0D (т. е. 13 — мистика, блин!)

До и после этого fwrite стоят fflush(f), так что проблема чётко в данной строке. При этом все остальные данные (в том числе тот же самый 0xC000000A) и до и после глючащей позиции с помощью той же самой команды записываются нормально.

Единственное, на что тут могу грешить — где-то раньше до этого была произведена запись в недопустимую область памяти. Но всё равно проявление этого весьма странное. Может, дело в чём-то другом? Бьюсь третий день.

Добавлено через 14 часов 31 минуту

Переделал вывод под ofstream — работает как часы. Крайне странная история.

Вообще, какой способ работы с файлами предпочтительнее в Windows? Ибо выбор большой.
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.03.2011, 11:49
Ответы с готовыми решениями:

Считываю с потока файл пакетами -> сохраняю файл. что использовать на Qt вместо fwrite?
пока программа не компилируется, успела только прописать вот такой код QString...

Fstream пишет 13 вместо 10
столкнулся с весьма необычной проблемой. открываю файл для записи if (!Open(filename, 1))return false; bool FILE::Open(str filename,...

Asus S301L вместо з пишет *
Всем привет. у меня ноут Asus S301L Сегодня вдруг стал писать вместо буквы з или английской p звездочку * Так же пишет / вместо 0 ...

4
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.03.2011, 12:39
Цитата Сообщение от alextram Посмотреть сообщение
Но в реальности перед ними откуда-то берётся пятый байт, 0x0D (т. е. 13 — мистика, блин!)
А ты уверен, что ты в этот файл больше нигде ничего не записывал? Потому что мистики на свете не бывает, а мистика в программировании в 999999 случаях из 1000000 является причиной ошибочно написанного исходника. Ради интереса сделай два одинаковых вызова fwrite подряд. Если окажется, что после этого размер файла равен 10 байтам, то то реально мистика, если 9, то значит где-то в программе есть ещё одно место, которое этот несчастный перевод строки вклеивает
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
26.03.2011, 16:50
Замена кода 0x0A на два кода - 0x0D 0x0A происходит в текстовом режиме работы с файлом
Поэтому косяк где-то есть, но у тебя

А вообще приводи минимальную рабочую программу, которая демонстрирует глюк
3
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.03.2011, 17:00
Цитата Сообщение от odip Посмотреть сообщение
Замена кода 0x0A на два кода - 0x0D 0x0A происходит в текстовом режиме работы с файлом
Вот чёрт Совсем забыл про такую особенность винды. На коротком примере оно действительно проявляется

C
1
2
3
FILE *fp = fopen ("a.txt", "w");
int x = 0x0a000000;
fwrite(&x, 4, 1, fp);
alextram, если при открытии файла вместо режима "w" использовать "wb", то такого эффекта не будет
2
51 / 37 / 14
Регистрация: 05.08.2016
Сообщений: 187
20.05.2019, 23:09
odip, Спасибо тебе добрый человек!!!! Я уже почти поверил. 10 раз все перепроверил. Прошелся пошагово все четко передает откуда 0x0d. Пишу простенькую реализация сжатия RLE для BMP и последующего вывода микроконтроллером на LCD дисплей. Просто добавлялись биты и вся картинка уезжала.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.05.2019, 23:09
Помогаю со студенческими работами здесь

Глючит мышь (произвольный двойной клик вместо одинарного)
День добрый! Помогите разрешить возникшую на днях проблему: USB-Мышь начала делать двойной, а то и тройной клик при одном клике левой...

Записывает 256 байт вместо 240!
Function DeleteRecord(id: Integer): Boolean; . . . Type TCows = Record id: integer; name: String; weight:...

В адресной строке вместо localhost пишет [::1]
Добрый день. У меня в адресной строке сайта на локале, вместо localhost пишет Что это не пойму, в файлах проекта искал, нет ничего...

Cout пишет адрес вместо значения
cout пишет адрес вместо значения. Спасибо

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru