![]() |
|
![]() ![]() ![]() |
|
Свят86 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 25.12.2008 Репутация: нет Всего: нет |
столкнулся с такой проблемой и не могу найти ей объяснение.
есть код читающий содержимое двоичного файла:
чтение происходит без ошибок, но сделав паузу и просматривая содержимое переменной bytef наблюдаю появление символов '\n' там где их в реале нет! при записи содержимого переменной в файл, обнаружил закономерность: символ '\n' , 0D в шестнадцатиречиной системе, появляется только перед символом 0A который непечатаемый, но в файле есть! в переменной bytef он не виден, но в ней он фактически есть и в дальнейшем обрабатывается! как быть? Добавлено через 9 минут и 8 секунд только что сделал через handle open read , все равно та же бяка... |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 14 Всего: 39 |
Все правильно, если в файле есть эти символы то они считаются в буффер.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
Свят86 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 25.12.2008 Репутация: нет Всего: нет |
есть символ 0A а вот символа 0D нет! он дописывается перед 0A!!!
|
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 14 Всего: 39 |
Запиши буффер обратно в файл, и сравни если 2 файла одинаковы то значит все правильно в буффер считалось
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
Свят86 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 25.12.2008 Репутация: нет Всего: нет |
в первом посте написано: "при записи содержимого переменной в файл, обнаружил закономерность:
символ '\n' , 0D в шестнадцатиречиной системе, появляется только перед символом 0A который непечатаемый, но в файле есть!" то есть по факту у меня в выходном файле получается больше байт ровно на количество символов 0A! и перед ним перед каждым появляется 0D! пробовал читать файл в void *bytef все равно! и писать пробовал в файл по разному! просто мистика какая-то...а мне это принципиально важно! потом все байты перегоняются в двоичную систему и ведется работа с набором "0" и "1"! не хочется делать функцию которая будет 0D удалять, ведь и так все должно работать правильно! Добавлено через 5 минут и 25 секунд и еще столкнулся с бякой: в AnsiString string_bit данные "0101110011100111111111111101010100101" string_bit.LastDelimiter("111111") возвращает номер последнего символа, а не 20 как должен был! ничего вообще не понимаю... постоянно работаю с .Pos() .LastDelimiter() .SubString() никогда подобных проблем не было! |
|||
|
||||
xvr |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Ну так и смотрите код записи в файл. 99% ошибка в формате создания файла - стоит "w" (или "wt"), а надо "wb"
С чего бы ему возвращать 20? У вас же последний символ '1' - вот его и возвращает. Смотри комент на функцию LastDelimiter -
![]() Это сообщение отредактировал(а) xvr - 29.8.2012, 18:15 |
||||||
|
|||||||
Свят86 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 25.12.2008 Репутация: нет Всего: нет |
на запись стоит все правильно! к тому же добавление '\n' можно посмотреть в буфере! мне уже разъяснили отчего это!
"Тут разница между бинарным чтением/записью и текстовым. При текстовом чтении/записи перевод строки в Windows и DOS состоит из двух символов: \r\n (13 и 10), в UNIX - из одного \n (10), в Mac OS - из одного \r (13). Именно 0D - это '\r', а '\n' - 0A. При текстовам чтении/записи \r\n обрабатываются в Windows как один символ '\n', при бинарном - как два байта со значениями 0D и 0A. Поэтому, если в текстовом файле делается перевод строки, то это добавляет, для бинарного чтения, дополнительные два байта." а в LastDelimiter("111111") у меня же строка в " " а не в ' ' почему то считал что ищет такую последовательность в файле... и всегда работало... может просто примеры были такие что не давало косяков, а тут дало! ![]() |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Нет, вы же сами дальше пишете -
Именно так и есть. А 2й параметр в fopen и выбирает режим чтения/записи - "wt" (или просто "w") - текстовая запись, а "wb" - бинарная. Вы же на чтение поставили "rb" - а это именно бинарное чтение (не текстовое) Вам же чистым английским языком написали - разделитель, это любой символ из поданной строки (причем только один символ), а не вся строка целиком С таким разделителем - вряд ли ![]() |
|||
|
||||
Свят86 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 25.12.2008 Репутация: нет Всего: нет |
с LastDelimiter все понятно, мой косяк!
![]() а вот с чтением записью... у меня бинарный файл, в нем встречается практически вся таблица ASCII и символ '\n' как и остальные не несут своего привычного значения! изначально был набор нулей и единиц, которые что-то обозначают, а при записи их в файл само собой получились байты! ![]() там нет никаких новых строк, это просто набор нулей и единиц! я его читаю "rb" если читать "rt", то там и трети данных в буфере не окажется! пишу я тоже в "rb" и пробовал писать в "rt" так как буфер у меня уже есть заполненный! так вот и в "rb" и в "rt" при записи перед 0A появляется 0D! и если из буфера вырезать 0D после чтения, то при записи 0D не просто появляется перед 0A, а затирает собой стоящий перед 0A байт! |
|||
|
||||
Свят86 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 25.12.2008 Репутация: нет Всего: нет |
вобщем я испробовал все комбинации fread fwrite, handle read write, в различных режимах и чтения и записи и везде такой косяк... но по подсказке
вариант с fstream дал то что нужно! причем в буфере 0D есть, а при записи его уже нет! с буфера его убрать уже не проблема! ![]()
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Покажите код, как вы писали этот файл
|
|||
|
||||
Свят86 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 25.12.2008 Репутация: нет Всего: нет |
исходник на другой машине и его я уже переделал! использовал fwrite и write в handle оба варианта открывали файл для битового ввода!
если использовать fstream то проблема уходит! пишется без добавления 0D! ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |