|
0 / 0 / 0
Регистрация: 08.10.2011
Сообщений: 13
|
|||||||||||
Обмен данными между процессами с помощью файлов, которые отображаются в память23.11.2011, 22:35. Показов 5365. Ответов 13
Метки нет (Все метки)
Классическая задача "читатели-писатели", обмен информацией должен проходить с помощью файлов, отображаемых в память. Задание уже готово, но имеет один неприятный баг - при дебагинге видно, что при вводе длинных строк программа вешается, из-за того, что первый байт файла в памяти, почему-то, устанавливается в нуль. Собственно, прошу объяснений и помощи, форумчане.
![]() Ниже фрагменты программы, в которых идёт конкретно работа с файлом. Эта ошибка происходит где-то тут. Код писателя:
0
|
|||||||||||
| 23.11.2011, 22:35 | |
|
Ответы с готовыми решениями:
13
Обмен данными между процессами Обмен данными между процессами Обмен данными между двумя процессами |
|
Заблокирован
|
|
| 26.11.2011, 17:27 | |
|
sergeyotro, есть вероятность, что строка более 99 символов. У тебя же в массиве их только 99...
0
|
|
|
0 / 0 / 0
Регистрация: 08.10.2011
Сообщений: 13
|
||
| 26.11.2011, 18:00 [ТС] | ||
|
Если строка больше 99 символов - то в файл, отображаемый в память, пишется только 99 и не больше. Вопрос не в переполнении, а в том, куда пропадает 1 байт, когда клиент копирует данные себе.
0
|
||
|
Заблокирован
|
|
| 26.11.2011, 18:24 | |
|
sergeyotro, дело в том, что у строк есть завершающий нуль-символ, поэтому в массив из 10 символов влезет только 9.
0
|
|
|
0 / 0 / 0
Регистрация: 08.10.2011
Сообщений: 13
|
|||
| 26.11.2011, 19:54 [ТС] | |||
|
Вы же не хотите сказать, что нуль-терминированные строки символ окончания пишут своим первым байтом?
0
|
|||
|
|
|||||||
| 26.11.2011, 20:20 | |||||||
0
|
|||||||
|
0 / 0 / 0
Регистрация: 08.10.2011
Сообщений: 13
|
|
| 26.11.2011, 20:30 [ТС] | |
|
0
|
|
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||
| 26.11.2011, 20:35 | ||
|
Добавлено через 1 минуту И есть ещё формат строк, в котором первый байт - счётчик, а терминального ноля нет, но в восьми битах максимально можно закодировать не 99, а 255. Если же байтов счётчика сделать два, то для всех строк короче 256-ти символов первый байт будет обнулён.
0
|
||
|
0 / 0 / 0
Регистрация: 08.10.2011
Сообщений: 13
|
|||
| 26.11.2011, 20:57 [ТС] | |||
|
0
|
|||
|
|
||||||
| 26.11.2011, 21:08 | ||||||
|
Посмотрите вот здесь. Кажется, проблемы схожи, хоть суть их и не вполне ясна.
Попробуйте писать массив в файл с индекса 1, что-то вроде этого:
0
|
||||||
|
0 / 0 / 0
Регистрация: 08.10.2011
Сообщений: 13
|
||
| 26.11.2011, 21:46 [ТС] | ||
|
В данной ситуации, без поинтера, всё выглядит вот так всё: Это происходит у "писателя" А это происходит у читателя, первый бит в нуль.
0
|
||
|
|
|
| 26.11.2011, 22:53 | |
|
Какая странная штука
![]() Порылся в справке по WinApi функциям, что вы используете - все, по идее, должно быть в норме... Остается, по ходу, одно: trace into в debugger'e до тех пор, пока состояние первого байта не изменится... Добавлено через 10 минут И, сдается мне, на крайний случай можно-таки писать в файл/читать из него, исключая первый байт. Инкремент адреса файла в памяти на размер одного элемента массива - вполне осуществимая вещь.
0
|
|
|
0 / 0 / 0
Регистрация: 08.10.2011
Сообщений: 13
|
||
| 26.11.2011, 22:58 [ТС] | ||
|
Странное поведение cin.
0
|
||
|
|
|
| 26.11.2011, 23:30 | |
|
Когда getline выбирает из потока 99 символов, она не только прекращает выборку, но и ставит потоку флаг failbit, что, вероятно, мешает функции getline получить повторный доступ к потоку на втором проходе цикла do{}while. Возможно, в этом причина изменения первого байта файла - на втором проходе цикла функция getline обламывается и пишет в буфер первый байт нулевым, затем буфер копируется в файл и читатели получают свою null-started string.
Вызов clear() очищает все флаги ошибок и на повторном доступе к потоку функция getline выбирает то, что там осталось и добросовестно пишет в буфер, который не менее добросовестно копируется в файл. Теоретически, как-то такО_о
0
|
|
| 26.11.2011, 23:30 | |
|
Помогаю со студенческими работами здесь
14
Обмен данными между процессами в консольных приложениях Обмен данными между процессами Обмен данными между программами Технология обмен данными между приложениями Обмен данными между двумя динамическими массивами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|