Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219

Запись на SD карту в bin файл

02.02.2018, 15:47. Показов 2527. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый, возникла такая проблема:

Написал программу, которая делает следующее: принимает данные из UDP и пишет в файл на SD карте.
Есть два варианта записи: 1) в bin файл, просто содержимое пакетов
2) в pcap файл (вместе с pcap заголовками и ethernet заголовками)

По сути в способе записи разницы практически и нету.

Но получается следующее:
Ставлю карту на 64 гига, работают оба способа.
Ставлю карту на 256 гигов, запись pcap работает, а запись bin - файл создает, а внутрь ничего не пишет.

Обе карты форматнул в формат ext, монтирую командой umount.
Разница только в том, что 1ю я форматнул из под виртуалки с 16й ubuntu, а вторую из под арма с 14й ubuntu.

Подскажите пожалуйста, в чем может быть проблема со 2 флешкой

Добавлено через 1 час 55 минут
Уточню.
Проблема не повторяется от раза к разу. После нескольких выниманий флешки и ребутов арма - вроде начало нормально писать.
Но ошибка иногда повторяется.

От чего это может зависеть?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.02.2018, 15:47
Ответы с готовыми решениями:

Запись класса в bin файл
Есть класс, одно поле должно быть текстовое, в моем классе model. Данные беруться из StringGrid, после нужно все записать в bin файл. В...

Чтение и запись в файл .bin (MFC)
Использую стандартные диалоги, но при сохранение файла .bin он весит 4 бита, то бишь там пусто и ничего не записывается. stdafx.h ... ...

Как осуществить запись в файл bin и как прочитать всё, что в нём есть
Добрый день.Подскажите как осуществить запись в файл bin и как прочитать всё,что в нём есть.Заранее благодарен.

13
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
02.02.2018, 18:21
umount() всегда нормально завершается? Возвращаемое значение анализируете?
Можно ещё перед umount() выполнить sync() на всякий случай.
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
02.02.2018, 18:48  [ТС]
Humanoid, Вроде нормально, ошибок не выдает.
Да и между разными вариантами записи я не делаю umount.
Т.е. когда пишу в файл с расширением pcap при помощи fprintf, все ок, затем безо всякого umount пытаюсь писать в файл с расширением bin - файл создает, но не пишет.

Команду использую одну и ту же по идее.
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
03.02.2018, 00:58
А вы не забываете закрывать файл через fclose() ? Просто файл создаётся при открытии. При записи данные вначале попадают в буфер в оперативной памяти, и только когда буфер заполняется или происходит закрытие файла, то тогда данные записываются на диск. Так же, если файл не закрыть, а внезапно отключить носитель информации, то тоже он может оказаться пустым (я такое ещё давно на NTFS наблюдал).
В общем, поведение очень похоже на то, что файл не закрывается. Может, у вас в коде какое-то условие есть, по которому вы прерываете запись, а сразу отключаете SD-карту? Хотя, при открытом файле umount() не должен проходить.
Проверьте ещё, что при вызове fprintf() указываете правильный файловый дескриптор. У меня других идей нет.
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
03.02.2018, 11:10  [ТС]
Humanoid, Да, причем открытие происходит, когда udp connect есть, т.е. с соединением все в порядке.
Носитель я до fclose точно не отключаю.
А насчет буффера - я с таким тоже сталкивался, но сомневаюсь, что тут такая ситуация. Как минимум по двум причинам: 1) запись в pcap проходит нормально, т.е. я в реальном времени вижу как изменяется место на карте; 2) на другой сд карте даже при записи в bin я вижу так же изменение размеров.

Мне кажется, что тут есть что-то, что я не учитываю и что зависит скорее от sd карты или системы. Например если ее форматнуть с 16й убунты, то после этого она сразу начинает писать. А вот как повторить такую ошибку - я пока не разобрался
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,932
03.02.2018, 14:36
Может, стоит писать на создавая файловой системы? Считать потом сырой файл через dd и анализировать без спешки
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
03.02.2018, 21:15  [ТС]
COKPOWEHEU, Это как? поясните пожалуйста?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,932
03.02.2018, 23:58
например так
C
1
fopen("/dev/mmcblk0", wb");
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
04.02.2018, 00:03  [ТС]
COKPOWEHEU, а понял, у меня mmcblk2p1, но думаю принципиально это ничего не меняет... попробовать можно. Хотя звучит странно... писать то будет, в другом формате ведь работает все....
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
04.02.2018, 15:46
Только имейте ввиду, что эти действия уничтожат файловую систему.
На мой взгляд, лучше попробовать какие-нибудь костыли с добавлением задержек перед размонтированием, дописать в конец файла пару МБ нулей и т.п. А запись в файл устройства - это не самый хороший вариант. Особенно, когда нужно несколько файлов... фактически, придётся изобретать свою файловую систему.
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
04.02.2018, 15:48  [ТС]
Humanoid, не, такой вариант тогда не пойдет. Мне надо чтобы была стандартная файловая система.
А вот насчет размонтирования я не совсем понимаю - как оно будет влиять?
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
04.02.2018, 16:12
Цитата Сообщение от Leardjiny Посмотреть сообщение
А вот насчет размонтирования я не совсем понимаю - как оно будет влиять?
У вас получается, что портится тот файл, с которым вы работаете в последнюю очередь. Похоже, что это какие-то проблемы при работе с кешами... кеш в stdlib, кеш в файловой системе, возможно, у самой карты тоже есть какое-то кеширование. Поэтому, если вы уверены, что у вас правильная последовательность действий (открыли файл, записали, закрыли), то можно после закрытия файла сразу не отмонтировать ФС, а подождать секунд 10, что ФС успела сбросить свой кеш.

А вообще, я предлагаю написать вам совсем простенькую программу... например:
C
1
2
3
4
5
6
7
8
9
FILE *f = fopen("/mnt/file.bin", "w");
if (!f)
    error(1, errno, "fopen() error");
if (fprintf(f, "Some string %d\n", 10) < 0)
    error(1, errno, "fprintf() error");
if (fclose(f))
    error(1, errno, "fclose() error")
if (umount("/mnt"))
    error(1, errno, "umount() error");
И проверить, что файл создаётся и имеет правильное содержимое. Если эта программа будет работать правильно, то ищите отличия в последовательности действий.
А если и с этой простой программой файл будет создаваться повреждённым, то тут уже можно начать экспериментировать и искать ситуацию, когда баг не проявляется. Например, перед umount() можно добавить
C
1
sync();
или добавить
C
1
sleep(10);
И исходя из результатов можно будет строить какие-то предположения.

Если не секрет... зачем для записи бинарных данных использовать fprintf() ? Конечно, это дело вкуса... но для бинарных данных я бы использовал fwrite().
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
04.02.2018, 16:26  [ТС]
Цитата Сообщение от Humanoid Посмотреть сообщение
У вас получается, что портится тот файл, с которым вы работаете в последнюю очередь.
Я, наверно, неправильно выразился. Тут от порядка как раз не зависит. Т.е. на самом деле ситуация такая:
1) делаю mount;
2) пишу в bin - не работает, файл создается, но не пишется;
3) пишу в pcap - все нормально пишется;
4) в bin - не работает;
5) pcap - работает;
....и таких итераций несколько, причем неважно с какого типа начинать (можно начать с pcap и будет работать так же)
N) в конце уже делаю umount.

Так что ситуация не меняется от того, с какого формата начать, и каким закончить.

Цитата Сообщение от Humanoid Посмотреть сообщение
Если не секрет... зачем для записи бинарных данных использовать fprintf() ? Конечно, это дело вкуса... но для бинарных данных я бы использовал fwrite().
Тут Вы правы, я просто опечатался. В программе C я и вправду делаю fwrite - fprintf я по привычке из matlaba указал выше. Но по сути вот попробовал и его тоже, ничего не поменялось.
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
04.02.2018, 18:25
Цитата Сообщение от Leardjiny Посмотреть сообщение
Тут от порядка как раз не зависит
Тогда добавьте проверку возвращаемых значений функций fwrite() и fclose().
fwrite() должен возвращать количество элементов (3 аргумент)... например, fwrite(buf, 1, 45, f) должен вернуть число 45.
fclose() должен возвращать 0. Если вернул что-то другое, то то это ошибка и нужно анализировать errno.

У убедитесь, что записываете не пустой буфер. А может, просто для bin в коде ошибка и в функции fwrite() указываете нулевой размер. Сразу после вызова fwrite() выведите в консоль отладочную информацию и посмотрите, какие размеры записываются и какой результат вернула функция.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.02.2018, 18:25
Помогаю со студенческими работами здесь

Не могу установить ни одну программу /bin/sh: /usr/bin/yum: /usr/bin/python: bad interpreter: No such file or
Добрый день. Устанавливал на VDS сервер (CentOS) firstvds python. Оказалось там стоял уже python 2.6, а мне нужно python 3.4. Ну я не долго...

Запись .bin на флешку
Написал простенькую программу(рисует смайлик), пробовал на VirtualBox, все работает. Теперь вопрос, как записать это на флешку и...

Запись/чтение из бинарного файла (.bin)
Беру информацию из текстового файла, записываю в двоичный и вывожу информацию на экран уже из двоичного файла. Если текстовый файл...

Данные записать в файл F1.txt, затем прочитать оттуда, обрабатывались и записывались в бинарный файл F2.bin с проверкой
Никак не получается отладить в BC++ 3.1. Как сделать в классах так, чтобы введённые данные записывались в файл F1.txt, затем читались...

bin файл
не могу понять как загрузить всё из бинарного фала с использованием STL . Можете помочь без етого не могу доделать прогу


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru